Express 모듈을 사용하여 서버 만들기

odada·2024년 12월 9일
0

node.js

목록 보기
6/11

Express 모듈을 사용하여 서버 만들기

1. Express 란?

http, url, fs 등 Node.js의 기본 모듈을 사용하여 서버를 만들 수 있지만, Express 모듈을 사용하면 더 쉽고 강력한 서버를 만들 수 있습니다.
자바의 Spring, Python의 Django와 같이 Node.js의 대표적인 웹 프레임워크로 Request, Response 객체를 사용하여 HTTP 요청을 처리할 수 있습니다.

- Express를 사용하는 이유

  • 간단하고 직관적인 API
  • 미들웨어를 통한 유연한 기능 확장
  • 강력한 라우팅 시스템
  • 큰 커뮤니티와 풍부한 생태계

- 참조

프레임워크란 개발자가 웹 개발에 필요한 기능을 미리 구현해 놓은 것으로, 개발자가 필요한 기능을 사용하기만 하면 되기 때문에 개발 시간을 단축할 수 있습니다. 웹을 만드는 회사는 대부분 프레임워크를 사용하여 개발합니다.

라이브러리란 개발자가 필요한 기능을 직접 구현해야 하는 것으로, 개발자가 직접 구현해야 하기 때문에 개발 시간이 더 오래 걸릴 수 있습니다.

  • 자바스크립트의 클라이언트 사이드 프레임워크: React, Vue, Angular
  • 자바스크립트의 서버 사이드 프레임워크: Express, Koa, Nest.js

2. Express 설치와 사용

- Express 설치

# 프로젝트 초기화
npm init -y

# Express 설치
npm install express

- nodemon 설치

  • nodemon은 파일이 수정될 때마다 서버를 자동으로 재시작해주는 패키지로 개발 시간을 단축할 수 있음.
# nodemon 설치
npm install -g nodemon

- package.json 수정

{
  "name": "my-express-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "nodemon index.js" // nodemon으로 서버 실행
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

3. Express 서버 만들기

- Express 서버 만들기

  • get() 메서드: 해당 경로로 GET 요청이 오면 콜백 함수를 실행.
  • send() 메서드: 클라이언트에 응답을 보냄.
// index.js
const express = require('express');
const app = express();

// 기본 라우트에 GET 요청이 오면 콜백 함수 실행
app.get('/', (req, res) => {
  // send() 메서드: 클라이언트에 응답을 보냄.
  // send() 메서드 하나로 응답을 보내고 종료하는 것까지 가능
  res.send('Hello, Express!');
});

// 서버 실행
app.listen(8080, () => {
  console.log('서버가 http://localhost:8080 에서 실행 중입니다.');
});

- Express 서버 실행

nodemon index.js

터미널에서 nodemon index.js 명령어를 실행 후, 크롬의 주소창에 http://localhost:8080을 입력하면, "Hello, Express!"가 출력됩니다.

- Express 서버 파일 읽어오기

$ touch index.html
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Express Server</title>
</head>
<body>
  <h1>Express Server</h1>
  <p>파일을 읽어와 응답하는 서버</p>
</body>
</html>
// index.js
const express = require('express');

const app = express();
// 서버가 실행될 포트 설정
// 클라우드 배포에 환경변수의 PORT 사용하거나 로컬 서버 사용
app.set('port', process.env.PORT || 8080);

// 데이터를 get 요청으로 받아올 때
// '/' 경로로 GET 요청이 오면 index.html 파일을 응답으로 보냄
app.get('/', (req, res) => {
  // sendFile() 메서드: 파일을 응답 본문으로 보냄
  res.sendFile(__dirname + '/index.html');
});

// 서버 실행
// app.get('port')로 설정한 포트에서 서버 실행
app.listen(app.get('port'), () => {
  console.log('서버가 http://localhost:8080 에서 실행 중입니다.');
});

3. http 요청 메서드

클라이언트(프론트엔드)가 서버(백엔드)에 요청을 보낼 때 사용하는 메서드로 요청의 목적을 명시하기 위해 사용됨.

  • GET: 데이터 가져올 때 사용
  • HEAD: 문서 정보를 가져올 때 사용
  • POST: 데이터 전송할 때 사용
  • PUT: 데이터 업데이트할 때 사용
  • PATCH: 데이터 일부 업데이트할 때 사용
  • DELETE: 데이터 삭제할 때 사용

4. Express 서버에 라우트 추가하기

  • post() 메서드: 해당 경로로 POST 요청이 오면 콜백 함수를 실행.
  • URL 파라미터: :를 사용하여 동적인 URL을 사용할 수 있음.
  • req.params: URL 파라미터를 조회할 수 있음.
// index.js
const express = require('express');
const app = express();

app.set('port', process.env.PORT || 8080);

// 전체 게시글 목록 조회
app.get('/posts', (req, res) => {
   res.send('전체 게시글 목록');
});

// 새 게시글 작성
app.post('/posts', (req, res) => {
   res.send('새 게시글이 작성되었습니다.');
});

// 특정 게시글 조회
app.get('/posts/:id', (req, res) => {
   res.send(`${req.params.id}번 게시글 내용`);
});

// 특정 게시글 수정
app.put('/posts/:id', (req, res) => {
   res.send(`${req.params.id}번 게시글이 수정되었습니다.`);
});

// 특정 게시글 삭제
app.delete('/posts/:id', (req, res) => {
   res.send(`${req.params.id}번 게시글이 삭제되었습니다.`);
});

// 서버 실행
app.listen(app.get('port'), () => {
   console.log('서버가 http://localhost:8080 에서 실행 중입니다.');
});

5. Express 서버에 미들웨어 추가하기

- 미들웨어란?

  • 요청(req)과 응답(res) 사이에 실행되는 함수.
  • 요청과 응답을 조작하거나, 요청에 대한 응답을 보내기 전에 중간 처리를 할 수 있음.

- 미들웨어 추가하기

  • app.use() 메서드를 사용하여 미들웨어를 추가.
// index.js
const express = require('express');
const app = express();

app.set('port', process.env.PORT || 8080);

// 1. 로깅 미들웨어 - 어떤 요청이 왔는지 확인
app.use((req, res, next) => {
    console.log('-------------------');
    console.log('새로운 요청이 왔어요!');
    console.log('요청 종류:', req.method);
    console.log('요청 주소:', req.url);
    console.log('-------------------');
    next(); // 
});

// 게시글 목록 조회
app.get('/posts', (req, res) => {
    res.send('전체 게시글 목록');
});

// 게시글 작성
app.post('/posts', (req, res) => {
    console.log('작성된 글:', req.body);  // JSON 미들웨어 덕분에 사용 가능
    res.send('게시글이 작성되었습니다.');
});

app.listen(app.get('port'), () => {
    console.log('서버가 http://localhost:8080 에서 실행 중입니다.');
});
  • localhost:3000에 접속하면, 콘솔에 요청 방식(GET)과 요청 주소(/)가 출력됨.
  • localhost:3000/users에 접속하면, 콘솔에 요청 방식(GET)과 요청 주소(/users)가 출력됨.

6. Express 서버에 정적 파일 제공하기

- 정적 파일이란?

서버에서 변경 없이 그대로 클라이언트에 전달되는 파일.

  • html 내부에 이미지를 띄우려면 이미지 파일을 서버에서 클라이언트로 전달해야 함.
  • html은 이미지 파일이 있는 경로를 참조하여 이미지를 띄움.
  • HTML, CSS, JavaScript, 이미지, 폰트 등.

- 정적 파일 제공하기

  • public 폴더에 cat.jpg 파일을 생성.
my-express-app/
├── public/                # 정적 파일들이 위치할 폴더
│   ├── images/           # 이미지 파일들
│   │   └── cat.jpg
│   ├── css/             # CSS 파일들
│   │   └── style.css
│   └── index.html       # 메인 HTML 파일
└── index.js             # 서버 파일
// index.js
const express = require('express');
const app = express();

// 정적 파일 제공
app.use(express.static('public'));

// 서버 실행
app.listen(8080, () => {
  console.log('서버가 http://localhost:8080 에서 실행 중입니다.');
});
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Express Static</title>
  <link rel="stylesheet" href="/css/style.css">
</head>
<body>
  <h1>Express Static</h1>
  <img src="/images/cat.jpg" alt="Cat">
</body>
</html>
  • localhost:8080에 접속하면, public/index.html 파일이 출력됨.
  • localhost:8080/images/cat.jpg에 접속하면, public/images/cat.jpg 파일이 출력됨.
  • localhost:8080/css/style.css에 접속하면, public/css/style.css 파일이 출력됨.

0개의 댓글