프로젝트/미니 프로젝트 & 과제

[과제] Mini node server

2023. 4. 4. 13:51
목차
  1. 과제 목표
  2. 참고 문서
  3. 내가 겪은 시행착오와 새로 알게 된 것
  4. 서버 입장에서 생각하기
  5. node.js의 http 처리 과정
  6. CORS 설정하는 응답하기
  7. CORS 설정 방법

과제 목표

클라이언트의 액션(버튼 클릭)에 따라 각기 다른 HTTP 요청이 서버로 들어오면, HTTP 요청에 담아 보낸 단어를 소문자 또는 대문자로 응답하는 서버를 구현합니다.

 

 

참고 문서

HTTP 트랜잭션 해부

https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction

 

내가 겪은 시행착오와 새로 알게 된 것

 

서버 입장에서 생각하기

계속 프론트엔드의 관점에서만 생각하다 보니 내가 서버를 구현해야 한다는 사실 자체가 낯설었다.

생각이 자꾸 '내가 왜 요청을 받지???'라는 물음으로 돌아가서 이걸 바꾸는 데 시간이 좀 걸렸다.

 

node.js의 http 처리 과정

createServer를 이용해 서버를 생성한다.

이때 규정되는 request, response 객체에 담긴 메서드로 요청의 내용을 확인하고 응답을 보낼 수 있다.

 

메서드, url, 헤더 받기

const { method, url } = request;
const { headers } = request;
const userAgent = headers['user-agent'];

요청의 메서드, url, 헤더 받기는 어렵지 않다.

request 객체 안에 잘 담겨 있으므로 가져다 쓰기만 하면 된다.

 

요청 바디 받기

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
});

바디를 받아오는 작업은 좀 더 복잡하다.

아직 이 코드에 담긴 on 메서드의 작동 원리를 완벽하게 이해하지는 못했고,

이런 방식으로 요청 바디에 접근할 수 있다는 것 정도만 알게 되었다.

request객체가 상속받은 incomingMessage가 상속받은 Stream의 on메서드는 비동기적으로 작동한다.

그래서 첫번째 on 메서드에서 데이터를 다 받아오고 더 이상 받아올 것이 없게 되면

두번째 on 메서드에서 받아온 정보를 바탕으로 작업을 해야 한다.

그런데 두 on 메서드의 스코프가 다르기 때문에 전역 변수 body를 선언해서 

그 변수에 조작을 해주는 방식으로 해야 정상적으로 작동하게 된다.

 

CORS 설정하는 응답하기

요청의 내용을 받아오는 것까지 해결하고 응답을 줄 차례가 되었을 때,

바로 POST 요청에 따른 응답만을 조건화해줬는데 그러니까 실행이 잘 되지 않았다.

그 이유는 프리플라이트 요청에 대해 먼저 CORS 응답 헤더 설정을 해줬어야 하는데 이 부분을 빼먹어서

프리플라이트에서 요청이 끝나버리고 POST 요청으로 넘어가지 못한 것 때문이었다.

  if (method === "OPTIONS") {
    response.writeHead(200, defaultCorsHeader);
    response.end("hello mini-server sprints");
  }

위와 같이 메서드가 OPTIONS일 때를 조건화해줌으로써 해결했다.

그런데 end 메서드가 없으면 응답이 잘 가지 않는다.

end에 쓸모없는 문자열을 넣지 않고 해결하는 방법은 없는지 궁금하다.

 

CORS 설정 방법

const defaultCorsHeader = {
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
  "Access-Control-Allow-Headers": "Content-Type, Accept",
  "Access-Control-Max-Age": 10,
};

이번 과제에서 기본으로 제공된 CORS 설정은 위와 같이 되어 있었다. 이 설정을 첫째줄부터 해석하면 모든 도메인에서 해당 서버로의 접근을 허용하고, GET, POST, PUT, DELETE, OPTIONS 메서드를 허용한다. 또, "Content-Type"과 "Accept" 헤더를 허용한다. 마지막으로, 이 설정은 10초 동안 프리플라이트 요청 결과를 캐시하여 다음 요청에서 재사용할 수 있도록 한다.

이렇게 설정을 해줬기 때문에 프리플라이트가 가고 난 뒤 본요청인 POST 요청을 할 때도 똑같이 헤더 설정을 해줘야 한다(페어님의 실수에서 배웠다 ㅋㅋ)

'프로젝트 > 미니 프로젝트 & 과제' 카테고리의 다른 글

[과제] 피그마 클론  (0) 2023.04.17
[과제] StatesAirline 서버 구현  (0) 2023.04.05
[과제] 반복문으로 map, filter, reduce 만들기  (2) 2023.03.17
[미니 프로젝트] 나만의 아고라스테이츠 만들기  (0) 2023.03.11
[과제] 유효성 검사  (0) 2023.03.08
  1. 과제 목표
  2. 참고 문서
  3. 내가 겪은 시행착오와 새로 알게 된 것
  4. 서버 입장에서 생각하기
  5. node.js의 http 처리 과정
  6. CORS 설정하는 응답하기
  7. CORS 설정 방법
'프로젝트/미니 프로젝트 & 과제' 카테고리의 다른 글
  • [과제] 피그마 클론
  • [과제] StatesAirline 서버 구현
  • [과제] 반복문으로 map, filter, reduce 만들기
  • [미니 프로젝트] 나만의 아고라스테이츠 만들기
JeanneLee57
JeanneLee57
공부하고 기록을 남기는 개발자 Jeanne
JeanneLee57
코딩은 진리
JeanneLee57
전체
오늘
어제
  • 분류 전체보기 (116)
    • Javascript (15)
    • React (15)
    • Next.js (8)
      • Next.js 베타 문서 번역 (5)
    • 프로젝트 (34)
      • 미니 프로젝트 & 과제 (25)
      • SEB 44 pre-project (1)
      • SEB 44 main-project (8)
    • 알고리즘 (12)
    • 부트캠프 준비 (6)
    • 기술면접 (3)
    • CS (7)
    • 코드스테이츠 프론트엔드 부트캠프 (12)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 부트캠프준비
  • 회고
  • RTK
  • 유데미
  • 프론트엔드
  • 번역
  • react
  • 코드스테이츠
  • HTML
  • 고차함수
  • JavaScript
  • useEffect
  • CSS
  • Next.js
  • 알고리즘
  • 부트캠프
  • codestates
  • 프리코드캠프
  • 프로그래머스
  • 구조분해할당

최근 댓글

최근 글

hELLO · Designed By 정상우.
JeanneLee57
[과제] Mini node server
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.