Node.js

익스프레스 프레임워크 사용하

babydeve 2023. 8. 13. 16:11

1. 일반적으로 웹서버가 제공하는 기능

항목 설명
라우팅 URL 요청을 함수와 매핑시켜주는 기능
정적 파일 서비스 CSS, JS,이미지 등의 정적인 파일을 다루는 기능
템플릿 엔진 동적인 웹페이지를 HTML과 인스턴스를 사용해 생성하는 기능
요청(request)
데이터 다루기
HTTP요청을 추상화해 편리하게 다룰 수 있게 하는 기능
응답(response)
데이터 다루기
HTTP 응답을 커스터마이징할 수 있는 기능
파일 내려받기, 이미지 출력 등
파일 업로드 HTTP로 전송된 파일을 읽고 다룰 수 있는 기능
쿠키 및 세션 지원 클라이언트 측 혹은 서버 측의 메모리에 일정기간 동안 저장해야 하는 데이터를 다루는 기능
리다이렉트 서버의 응답 시 다른 페이지로 전달시키는 기능
에러 페이지 요청이 잘못되었거나, 서버 에러 시 특정 에러 페이지를 보여주기
미들웨어 요청 혹은 응답 사이에 공통된 기능을 추가하는 기능

-기본 라이브러리로 구현하고 유지보수할 수도 있지만 시간이 많이 든다.

-Node.js에는 이런 작업을 제공하는 오픈소스 웹서버가 많이 있다. 그중 익스프레스가 널리 사용된다.

2. express 설치하기

1)설치할 폴더 생성 후 폴더로 이동

mkdir chapter1
cd chapter1
mkdir express-server
cd express-server

2) express-server 폴더에 npm을 사용해 express 설치하기

npm install express

3) 설치 완료 후 ls 명령으로 무엇이 설치되었는지 확인(연습용이라 폴더명 내맘대루..)

4) node_modules디렉터리 안에는 익스프레스를 실행하는 데 필요한 의존성 패키지가 설치된다. 의존성 패키지 정보는 package.json에 들어 있다. npm ls 명령어로 확인한다.

🙋‍♀️익스프레스를 무사히 설치했으니 간단한 API서버를 만들어보자.

 

3. 익스프레스 서버 만들기

1) 해당 폴더에 npm intall 명령실행 시키기

npm install

2)"헬로 express"를 반환하는 익스프레스 서버

const express = require("express");
const app = express();  //express를 초기화 후에 app에 할당
const port = 3000;

// url의 path가 "/"이면서 http메서드가 get()인 경우 콜백함수를 실행한다.
app.get("/", (req, res) => {
    res.set({ "Content-Type": "text/html; charset=utf-8"}); //반환할 컨텐츠 정보 설정
    res. end("헬로 express");
});

//listen()함수를 사용해 서버를 기동해 클라이언트의 요청을 기다린다.
app.listen(port, () => {
    console.log(`START SERVER : use ${port}`)
})

3)서버 실행하기

4) localhost:3000

4. Node.js 라이브러리로 만든 서버를 익스프레스로 구현하기

-기존에는 http 인스턴의 createServer() 함수 내에서 라우팅과 결과처리를 했지만, 익스프레스를 사용해 더 손쉽게 더 좋은 라우팅 기능을 사용해본다.

const url = require("url");
const express = require("express");
const app = express();
const port = 3000;

app.listen(port, ()=>{
    console.log("익스프레스로 라우터 리팩토링");
});

//url매핑을 관리하던 부분을 없애고 app.get()함수에 등록하도록 변경함.
//매핑을 사용하면 수백개의 함수를 하나하나 매핑시켜서 길어지는 단점이 있어서
//app.get()를 이용해 코드를 좀 더 깔끔하게 유지할 수 있다.
app.get("/", (_, res) => res.end("HOME"));  
app.get("/user", user);
app.get("/feed", feed);

function user(req, res) {
    const user = url.parse(req.url, true).query;

    //res.end()대신에 express에서는 res.json()함수를 사용한다.
    //응답을 JSON타입으로 보여주고, charset=utf-8을 자동으로 설정해준다.
    res.json(`[user] name: ${user.name}, age: ${user.age}`);
}

//사용하지 않는 변수는 빼는 것이 원칙이다. _는 구조상 넣을 수 밖에 없을 때의 관례
function feed(_, res){
    res.json(
        `<ul>
            <li>picture1<li>
            <li>picture2<li>
            <li>picture3<li>
        </ul>`
    )
}

5. 익스프레스로 간단한 게시판 API 서버 만들기

1) 데이터베이스를 쓰지 않고 메모리 기반으로 동작하는 휘발성 게시판 만들기

-데이터를 저장하는 것처럼 보이지만 메모리에 저장하므로 서버를 재시작하면 사용한 데이터가 모두 사라진다.

-목록 가져오기, 글 작성하기, 글 삭제하기 3가지 API를 작성해본다.

2) 게시판 API 코드 작성하기

-API는 REST API원칙을 따라 만든다.

-REST API : 자원을 URL에 표현하고 자원을 가져오는 행위를 HTTP 메서드로 표현하는 규칙이다.

-구현할 게시판 API 스펙

경로 HTTP 메서드 설명
/ get 게시판 목록 가져오기
/posts post 게시판에 글 작성
게시글은 id(아이디), title(제목), name(작성자), text(내용), createdDt(생성일시)로 구성
/posts:id delete 게시글 아이디가 id인 글을 삭제

3) API규칙에 맞게 서버 구현하기

const express = require("express");
const app = express();
let posts = [];  //게시글 리스트로 사용할 빈 리스트

//req.body를 사용하려면 JSON 미들웨어를 사용해야한다.
//사용하지 않으면 undefined로 반환
app.use(express.json());  //JSON 미들웨어 활성화
//POST요청 시 컨텐트 타입이 application/x-www-form-urlencoded인 경우 파싱한다.
app.use(express.urlencoded({ extended: true })); //JSON 미들웨어와 함께 사용!

app.get("/", (req, res) => { // "/"로 요청이 오면
    res.json(posts);  //게시글 리스트를 JSON형식으로 응답한다.
})
app.post("/posts", (req, res) => { // "/posts"로 요청이 오면
    const { title, name, text } = req.body; //HTTP요청의 body 데이터를 변수에 할당

    //게시글 리스트에 새로운 게시글 정보 추가
    posts.push({ id: posts.length+1, title, name, text, createdDt: Date() });
    res.json({ title, name, text });
});

app.delete("/posts/:id", (req, res) => {
    const id = req.params.id; //app.delete에서 설정한 path 정보에서 id값을 가져온다.
    const filteredPosts = posts.filter((post) => post.id !== +id); //+id는 문자열인 id를 숫자형으로 변경한다는 뜻
    const isLengthChanged = posts.length !== filteredPosts.length;
    posts = filteredPosts;

    //posts의 데이터 개수가 변경되었으면 삭제성공
    if(isLengthChanged){
        res.json("OK");  //게시글이 삭제된 경우 "OK"응답
        return;
    }
    //변경되지 않은 경우 "NOT CHANGED"응답
    res.json("NOT CHANGED");

    app.listen(3000, () => {
        console.log("welcome posts START!")
    })
})

 

6. 게시판 API 테스트하기

-HTTP 프로토콜의 메서드를 사용하는 API는 브라우저만으로 테스트하기가 조금 어렵다.

-curl을 사용하면 API 테스트를 쉽게 진행할 수 있다.

1) curl 옵션

옵션 사용 예시 설명
-X -X POST HTTP 메서드 종류
-d -d "key1=value1&key2=value2" localhost:3000 POST 통신 시 body 데이터
-H Content-Type:application/x-www-form-urlencoded 헤더정보
-x curl -x http://proxy_server:proxy_port--proxy-user username:password 프록시 서버 설정
-T curl -T file.txt http://server.com 파일을 서버에 전송 시 사용
-A curl -A "Mozilla/5.0" http://server.com 유저 에이전트를 변경
-i curl -i https://goldenrabbit.co.kr 서버의 응답을 결과로 출력
-I curl -I https://goldenrabbit.co.kr 서버의 응답에서 헤더값만 출력
-O curl -O http://server.com/test.txt 서버의 파일을 이름 변경 없이 내려받기
-L curl -L http://server.com/redirectingURL 리다이렉트 URL 따라가기
-s curl -s localhost:3000 에러가 발생해도 출력하지 않음
-S curl -S localhost:3000 에러 발생 시 에러 출력

2) curl로GET호출하기

-curl을 사용해서 익스프레스로 구현한 서버를 테스트해본다.

curl -X GET http://localhost:3000

-에러가 발생한다....설치도 했는데 왜 안될까...

왜지? 구글링을 좀 더 해봐야겠다...

728x90