최근 Node.js&Express를 이용해 나만의 블로그를 만드는 개인 프로젝트를 진행중이다.
사실 Node.js는 프레임워크라기보다는 JRE라고 하는 게 더 정확하기 때문에 그 목적성과 같이 Legacy Spring이나 Spring boot에 비해서는 훨씬 라이트하고 직관적이며 쉽다.
중요한 건 이게 아니고, 인간의 뇌는 휘발성이 생각보다 짙기 때문에 Node.js만 하다가 Spring Boot에 대한 개념을 잊어버리진 않을까 하는 노파심에 Spring Boot를 이용해 비슷한 구조의 Blog 프로젝트도 동시에 진행하고자 한다.
프로젝트의 모든 과정을 기록하면 좋겠지만, 시간적인 여유가 허락하지 않기 때문에 내가 중요하다고 생각하는 부분에 대해서만 기록하고자 한다.
먼저 이번 프로젝트에 대한 간단한 스펙은 아래 사진과 같다!
언제봐도 날 설레게 만드는 start.spring.io
HTTP는 다양한 메서드를 정의하고 있다. 자주 사용되는 주요 HTTP 메서드 5개를 살펴보자. 적절한 목적에 사용할 수 있도록 각각의 메서드의 특징과 주로 사용되는 상황을 정리하였다.
참고로 해당 메서드는 일종의 약속이다. 메서드 그 자체가 기능을 제공하는 것이 아니며, 메서드 이름에 알맞는 내용으로 서버에서 코드를 구현해야 한다.
GET
: 리소스 조회(최근에는 Representation이라는 이름을 많이 사용한다.)POST
: 요청 데이터 처리, 주로 등록에 사용PUT
: 리소스를 대체, 해당 리소스가 없으면 생성PATCH
: 리소스 부분 변경DELETE
: 리소스 삭제기타 메서드도 존재한다.
HEAD
: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환OPTIONS
: 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)CONNECT
: 대상 자원으로 식별되는 서버에 대한 터널을 설정TRACE
: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
GET 메서드는 리소스의 조회를 위해 사용한다. 서버에 전달하고 싶은 데이터가 있다면 query(쿼리 파라미터, 쿼리 스트링)에 담아 보낸다. 서버는 타겟 리소스에 해당하는 representation data를 응답 데이터로 보낸다.
Q. GET 메서드로 요청할 때는 왜 query(쿼리 파라미터, 쿼리 스트링)를 써야 할까?GET 메서드도 POST 메서드와 같이 데이터를 담을 수 있는 메시지 바디가 존재한다. 하지만, GET 메서드의 메시지 바디를 확인하지 않는 서버가 대부분임으로 거의 사용되지 않는다.
GET은 리소스를 요청하기 위해 만들어 졌다. URL의 URI가 자원이 위치한 곳을 나타낸다. 메시지 바디에 데이터를 실어야 하는 상황은 거의 없다. 따라서, 일반적인 서버에서는 GET 요청의 메시지 바디를 확인하지 않는다. 실제로 메시지 바디에 데이터가 있더라도 처리되지 않을 확률이 높다.
POST /members HTTP/1.1
Content-Type: application/json
{
"username": "hello",
"age": 20
}
POST 메서드는 요청 데이터의 처리를 목적으로 사용한다. 메시지 바디를 통해 서버로 요청 데이터를 전달하면, 서버는 정해진 로직에 따라 요청 데이터를 처리한다. POST 메서드를 사용한다고 특정한 로직이 자동으로 실행되는 것은 아니다. 리소스마다 POST 요청이 오면 어떻게 데이터를 처리할지 로직을 구현해야 한다. POST 매서드는 대상 리소스에 정의된 로직에 따라 고유한 기능을 수행한다. 주로, 전달된 데이터를 이용하여 신규 리소스를 등록하거나 프로세스를 처리한다.
POST 메서드는 아래와 같은 작업을 요청할 때 사용된다.
PUT /members/100 HTTP/1.1
Content-Type: application/json
{
"username": "hello",
"age": 20
}
PUT 메서드는 리소스 전체를 대체한다. 기존 리소스가 없을 경우 새로 생성한다. 즉, 덮어쓰기를 수행한다고 볼 수 있다. POST와 차이점은 클라이언트가 리소스의 위치를 알고 URI를 명시해야 한다는 점이다.
리소스가 이미 존재하는 경우, 기존 데이터를 대체한다.
리소스가 없는 경우, 새로운 데이터를 생성한다.
주의할 점은 리소스를 완전히 대체한다는 것이다. 부분적인 수정이 불가능하다.
PATCH /members/100 HTTP/1.1
Content-Type: application/json
{
"age": 50
}
PATCH 메서드는 리소스를 부분 변경한다. 부분 변경이 필요한 상황에서 PATCH를 사용할 수 없다면 POST를 사용한다.
DELETE /members/100 HTTP/1.1
Host: localhost:8080
DELETE 메서드는 리소스를 제거한다.
f