본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

[O'REILLY] Node & Express - 6장 : 응답 객체

by VictorMeredith 2023. 3. 24.

1. 응답 객체

- 응답객체는 노드의 핵심 객체인 http.ServerResponse의 인스턴스이다.

- 보동 res를 사용한다

 

res.status(code)

- HTTP 상태 코드를 설정한다.

- 기본값은 200이며, 200 이외의 상태 코드를 반환할 경우에만 사용하면 된다.

- 리디렉트의 상태코드는 301, 302, 303, 307 이지만, 이 메서드보다는 redirect 메서드를 쓰는 것이 좋다.

- res.status(404).send('없어요') 처럼 체이닝이 가능하다.

 

res.set(name, value)

- 응답 헤더를 설정한다.

- 여러가지 헤더를 한번에 설정할 수도 있다. 잘 안쓴다.

 

res.cookie(name, value, [options]), res.clearCookie(name, [options])

- 클라이언트에 저장될 쿠키를 설정하거나 삭제한다.

- 이 메서드는 미들웨어가 필요하다

 

res.redirect([status], url)

- 리다이렉트한다.

- 기본은 302이고, 페이지 영구이동 시 말고는 안쓰는게 좋다.

 

res.send(body)

- 클라이언트에 응답을 보낸다. 가장 많이 사용한다.

- 기본 타입은 text/html 이므로, text/plain으로 바꾸고싶다면 res.type(요기) 을 사용한다.

- body가 객체 혹은 배열일 경우 응답은 자동으로 JSON으로 전송되나, res.json 사용을 권장한다.

 

res.json, res.jsonp 

- json, jsonp 보낸다.

 

res.end()

- 응답을 보내지 않고 연결을 끊는다.

 

res.send, res.json, res.end 의 차이점

1. res.send()
: 이 메서드는 다양한 유형의 데이터를 보낼 수 있습니다. 문자열, 객체, 배열, 버퍼, 스트림 등을 인자로 받을 수 있습니다.
res.send()는 전달된 인자에 따라 적절한 Content-Type헤더를 자동으로 설정합니다. 예를 들어, 객체를 전달하면
Content-Type: application/json 으로 설정됩니다.
res.send() 는 전달된 데이터를 응답 본문으로 보내고, 응답을 종료합니다.

2. res.json()
: 이 메서드는 오직 JSON 데이터를 전송하는 데 사용됩니다. 객체 또는 배열을 인자로 받아 JSON 문자열로 변환하고,
Content-Type: application/json 헤더를 설정한 후 응답을 종료합니다. 이 방법은 명확하게 JSON 응답을 전송하려는 경우에 적합합니다.

3. res.end()
: 이 메서드는 응답을 종료하지만 본문에 데이터를 전송하지 않습니다. 주로 헤더만으로 응답을 완료하거나, 이미 스트림을 통해 데이터를 보낸 경우에 사용됩니다. res.end()에 데이터를 전달할 수는 있지만, 이 경우에는 Content-Type 헤더가 설정되지 않으므로 일반적으로 권장되지 않습니다.

 

res.type()

- Content-Type 헤더를 설정하는 편의 메서드

- res.set('Content-Type', type) 과 동일하지만, res.type은 슬래시 없는 문자열을 매개변수로 썼을 때 파일 확장자를 인터넷 미디어 타입으로 사용하려한다는 차이점이 있다.

- res.type('txt')는 Content-Type을 text/plain으로 설정한다. 멀티미디어 파일 여러 개를 자동으로 전송할 경우 유용하기도 하나, 일반적으로 res.type 보다는 명확한 인터넷 미디어 타입을 직접 설정하는 것이 좋다.

 

res.format(object)

- Accept 요청 헤더에 따라 다른 콘텐츠를 보낼 수 있다.

- 주로 API에 사용한다. 나중에 자세히 적는다.

 

res.attachment([filename]), res.download(path, [filename], [callback])

- 메서드 모두 Content-Disposition 응답 헤더를 attachment로 설정한다.

- 이렇게 하면, 브라우저가 콘텐츠를 렌더링하지 않고 파일 형태로 내려받는다.

- filename을 써서 브라우저에 파일 이름 힌트를 준다.

- res.download는 파일 지정이 가능하나, res.attachment는 단순히 헤더만 설정한다.

 

res.sendFile(path, [options], [callback])

- path로 지정한 파일을 읽고, 그 콘텐츠를 클라이언트에 전송한다.

- 사용할 이유가 별로 없다. static은 미들웨어로 처리하면 되므로, 같은 URL에서 조건에 따라 다른 자원 전송을 할 경우 쓰긴 한다.

 

res.links(links)

- Links 응답 헤더를 설정한다. 특화된 헤더라 활용도가 높지 않다.

 

res.locals, res.render(view, [locals], callback)

- 뷰를 렌더링하는 객체이다. 

- 템플릿에 따라서 사용방법이 조금씩 다르므로 잘 알아보고 써야한다.

- 내가 주로 사용하는 MERN, MEVN 등 주로 SPA(CSR)를 다루는 입장에서는 잘 사용하지 않는다.

- 어차피 다른 프레임워크에서 렌더링을 띄우고, 거의 모든 데이터를 AJAX로 처리하기 때문이다.

 

get 요청 처리의 간단한 예시

appSam 에서 제품들의 리스트만 모아둔 DB에서 데이터를 가져와서 보내주는 로직

 

2. 폼 처리

- 폼 처리에서 보통 req.body 에 들어있는데, req.xhr을 써서 AJAX요청인지, 브라우저 요청인지 판단할 수 있다.

- 보통 미들웨어에 바디파서 세팅을 통해 req.body 객체에 데이터를 추가해주는 역할을 한다.

미들웨어로 세팅했다. 미들웨어에 대해 자세한 건 나중에 포스팅

 

다음 시간엔 API를 공부한다.

댓글