웹 백엔드

Node.js - Express 모듈과 EJS 템플릿

토리쟁이 2024. 1. 26. 05:48

 

 

 

 

node.js에서 서버를 구축하는 방법은 기본적으로 http와 express가 있다.

저번 포스팅에서는 node.js에 기본적으로 내장되어 있는 http 모듈을 이용한 서버 생성에 대해 공부해 보았다.

이번 포스팅에서는 express를 다운받아 서버를 생성해 보자.


 

Express

  • node.js 기반의 웹 프레임워크
  • 웹 서버를 생성하는 것과 관련된 기능을 담당
  • 웹 애플리케이션을 만들기 위한 각종 메소드와 미들웨어 등이 내장되어 있음
    • (미들웨어: 양 쪽을 연결하여 데이터를 주고 받을 수 있도록 중간에서 매개체 역할을 하는 SW)
  • http 모듈의 낮은 코드 가독성 & 확장성을 해결하기 위해 만들어짐
  • 설치: npm install express
    • npm_modules가 생성되며, package.json의 dependencies에 express가 기록됨

express 설치

 

 

 

 

express 사용

  • express(): Express모듈이 export하는 최상위 함수로, express application을 만듦
  • app 객체: Express() 함수를 호출함으로써 만들어진 express application

 

 

 

실습 코드를 살펴보자

const express = require("express"); // express 불러오기
const app = express(); // express application
const PORT = 8089; // 임의의 포트번호 할당

// 아래에서 다룰 예정
app.set("view engine", "ejs"); // 뷰를 ejs로 보여줄 것임을 미리 알려주기
app.set("views", "./views"); // ("views", "뷰가 들어있는 파일 경로명")
app.use("/static", express.static(__dirname + "/public")); // public을 static 경로로 쓸 것임(이미지와 같은 정적파일 인식을 위해 작성하는 코드)

// app.get() : http 요청 메소드의 종류 - get (그 외에는 post, put, delete, all 등)
// 라우팅
// 루트 경로로 진입했을 때
app.get('/', function(req, res){
	// res.send(): response를 보내는 역할
    // 기본적으로 response 처리를 할 때, content-type을 지정해줘야 하는데, 자동적으로 데이터 타입을 파악해서 알맞은 content-type을 지정해줌
	res.send("hello express! 안녕하세요 익스프레스");
});

// 정보를 전달할 수도 있음
app.get("/", (request, response) => {

  /* 
  res.render(정보를 보낼 ejs파일, {보낼 정보})
  index.ejs에서 사용할 정보 전달 
  */
  response.render("index.ejs", {
    btns: ["apple", "banana"],
    isLogin: false,
    userInfo: {
      name: "khy",
      msg: "식사는 맛있게 하셨나요?",
    },
  }); // index.ejs를 보여주기
});

// 렌더링
// register 경로로 들어왔을 때
app.get("/register", (req, res) => {
	// res.render(view): 뷰 화면을 렌더링 -> 렌더링된 html 반환하여 클라이언트에게 보내줌
  res.render("register"); // register.ejs 렌더링 -> html 반환
});

// login 경로로 들어왔을 때
app.get("/login", (req, res) => {
  res.render("login"); // login.ejs 렌더링 -> html 반환
});


// page not found, 404 페이지는 맨 마지막에 설정
app.get("*", (req, res) => {
  res.render("404");
});

 

 

 

 

이제, express에서 자주 사용되는 EJS 템플릿 엔진에 대해 공부해 보려고 한다.

 

템플릿 엔진이란, 템플릿을 읽어 문법과 설정에 따라 파일을 html 형식으로 변환시키는 모듈이다.

그 중에서 EJS는 Embeded JavaScript의 약자로, 자바스크립트가 내장되어 있는 html 파일이며, 확장자는 .ejs이다.

즉, EJS를 사용하면 HTML 내에서 Javascript를 사용할 수 있게 만들어준다.

 

사용하기 위해서는 npm install ejs 명령어로 설치후, app.js파일에서 ejs 템플릿을 설정해주면 된다.

app.set("view engine", "ejs"); // 뷰를 ejs로 보여줄 것임을 미리 알려주기
app.set("views", "./views"); // ("views", "뷰가 들어있는 파일 경로명")

 

 

 

기본 문법은 다음과 같다.

  • <% %>: 자바스크립트 코드 실행 / 줄 바꿈을 하면 새로운 <% %>을 작성할 것
  • <%= %>: 자바스크립트 코드의 실행 결과룰 문자열로 변환하여 출력
  • <%-  include('뷰의 상대주소')%>: HTML코드를 날 것으로 보여줌(HTML 소스를 include해서 사용 가능)(다른 뷰 파일을 불러올 때 사용)
  • <%# %>:주석
  • <%% %>: 리터럴 구문 출력
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <%- include('./includes/head', {title:'HOME'}) %>
  </head>
  <body>
    <%- include('./includes/header') %>
    <h1>안녕하세요 ejs입니다.</h1>
    <img src="/static/pooh.png" alt="pooh" width="100" />
	
    <%# 위의 예제 코드를 보면 index.ejs로 정보들을 넘겼었는데, 그 정보들을 사용%>
    <%if(isLogin){%>
    <div>안녕하세요, <%= userInfo.name%>님</div>
    <p><%= userInfo.msg %></p>
    <%} else{%>
    <div>로그인을 해주세요.</div>
    <%}%>

    <h3>for문 사용해보기</h3>
    <h3>EJS language support</h3>
    <%for(let i=0; i<5; i++){%>
    <p>안녕하세요</p>
    <img src="/static/pooh.png" alt="pooh<%=i%>" width="100" />
    <%}%>
  </body>
</html>

 

 

 

미들웨어

  • 요청이 들어옴에 따라 응답까지의 중간 과정을 함수로 분리한 것
  • 양 쪽을 연결하여 데이터를 주고 받을 수 있도록 중간에서 매개체 역할을 함
  • 서버와 클라이언트를 이어주는 중간 작업
  • use()를 이용해 등록
  • static
    • 이미지, CSS, JS 파일과 같은 정적 파일 제공
    • express에 있는 static 메소드를 이용해 미들웨어로 로드
app.use("/views", express.static(__dirname + "/views"));
app.use("/static", express.static(__dirname + "/public")); // public을 static 경로로 쓸 것임(이미지와 같은 정적파일 인식을 위해 작성하는 코드)

참고

 

https://velog.io/@yjs_177076/res.json-vs-res.send-vs-res.render-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

https://velog.io/@hanblueblue/Node.js-3.-express

'웹 백엔드' 카테고리의 다른 글

Node.js - form  (0) 2024.01.28
Node.js - 비동기 처리  (1) 2024.01.27
Node.js - API와 HTTP 모듈  (0) 2024.01.25
Node.js  (1) 2024.01.22
서버(Server)와 프로토콜  (0) 2024.01.22