HTTP 메서드(GET, POST 등)의 차이점은 무엇인가요?
HTTP 메서드는 클라이언트와 서버 간의 통신 방식에서 클라이언트가 서버에 어떤 작업을 요청할지 지정하는 방법입니다. 각각의 HTTP 메서드는 특정한 목적과 특징을 가지고 있다.
GET
목적 : 서버에서 데이터를 요청하여 가져옴.
특징
- 요청 파라미터(데이터)가 URL 쿼리 문자열에 포함.
ex) https://example.com/search?q=apple&sort=asc
- 데이터를 읽기 전용으로 사용. 서버의 데이터를 가져오기만 하며, 서버 상태나 데이터에는 영향을 미치지 않는 것이 원칙.
- 브라우저나 프록시 서버가 GET 요청 결과를 캐싱할 수 있음. 이로 인해 동일 요청에 대해 응답 속도가 빨라질 수 있음.
- URL의 길이 제한 때문에 보낼 수 있는 데이터의 크기가 제한.
- 서버 데이터에 영향을 미치지 않으므로 안전성이 보장되고 동일 요청을 여러 번 보내도 결과가 같기에 멱등성이 보장된다.
ex) 게시물 목록 보기, 검색 결과 요청, 사용자 프로필 읽기
POST
목적 : 서버에 데이터를 보내거나 제출
특징
- 요청 데이터는 URL이 아니라 요청의 Body에 데이터를 담아 전송
- 서버의 데이터베이스에 새로운 데이터가 추가되거나, 특정 처리가 실행
- 본문에 데이터를 담기 때문에 데이터 크기 제한이 없으며 파일 업로드 같은 작업에 적합
- 서버 데이터에 영향을 미치기에 안정성이 보장되지 않고 동일 요청을 여러 번 보내면 서버 상태가 계속 변할 수 있기에 멱등성도 보장되지 않음
ex) 회원 가입 정보 제출, 게시물 작성, 파일 업로드
PUT
목적 : 서버에 데이터를 새로 저장하거나 기존 데이터를 대체
특징
- 업데이트나 생성할 리소스의 URL을 명시적으로 지정
- 기존 데이터를 완전히 대체한다. 변경하려는 필드 외의 기존 데이터는 삭제.
- 동일 요청을 여러 번 보내도 결과가 같아 멱등성이 보장된다.
ex) 사용자 프로필 정보 수정, 파일 덮어쓰기
DELETE
목적 : 서버에서 리소스를 삭제
특징
- 지정된 리소스를 삭제한다. ex) /user/123에서 사용자 ID 123 삭제
- 동일 요청을 여러 번 보내도 결과가 같음.(이미 삭제된 리소스에 대한 요청은 성공 상태로 응답)
ex) 게시물 삭제. 사용자 계정 삭제.
PATCH
목적 : 리소스의 일부 데이터를 수정
특징 : PUT이 전체 데이터를 갱신한다면, PATCH는 일부 필드만 수정
HEAD
목적 : GET과 유사하지만 응답 본문은 제외하고 헤더만 요청
특징 : 리소스 유효성 검증, 응답 상태 코드 확인
OPTIONS
목적 : 서버가 지원하는 메서드와 옵션 확인
특징 : CORS(교차 출처 리소스 공유) 설정 확인에 사용
TRACE
목적 : 요청이 서버까지 가는 경로를 확인
특징 : 디버깅 목적으로 사용되며 일반적으로 비활성화
HTTP 메서드(GET, POST 등)의 차이를 이해한 후, 실습을 통해 실제 동작을 경험하는 것은 Java/Spring 백엔드 개발자로서 큰 도움이 됩니다. 아래는 신입/취준 입장에서 실습할 만한 방법들을 정리한 내용입니다.
1️⃣ GET vs POST
실습 아이디어: 간단한 게시판 만들기
목표:
- GET으로 게시물 목록과 상세 정보를 가져오기
- POST로 새로운 게시물 작성하기
구현 단계:
1. Controller 생성
GET /posts: 게시물 목록 보기
GET /posts/{id}: 특정 게시물 보기
POST /posts: 새 게시물 작성
- Service 및 Repository 생성
- 데이터베이스 대신 HashMap이나 List를 사용해 게시물 데이터를 저장.
- 요청 처리 및 응답
- GET 요청: 데이터 반환.
- POST 요청: 클라이언트에서 받은 데이터를 저장.
테스트:
- POST 요청은 Postman 또는 cURL로 테스트(본문에 JSON 데이터를 담아 요청).
- GET 요청은 브라우저 주소창을 활용하거나 Postman 사용.
2️⃣ PUT vs PATCH
실습 아이디어: 사용자 프로필 업데이트
목표:
- PUT으로 프로필 전체를 대체.
- PATCH로 특정 필드만 수정.
구현 단계:
1. Controller 생성
PUT /users/{id}: 프로필 전체 업데이트
PATCH /users/{id}: 프로필 일부 업데이트
- Service 및 Repository 작성
PUT은 기존 데이터를 전부 대체.
PATCH는 받은 필드만 업데이트(예: Map<String, Object>를 사용하여 동적으로 처리).
- 테스트:
- PUT: 기존 데이터 전부를 포함한 JSON 요청 전송.
- PATCH: 수정할 필드만 포함된 JSON 요청 전송.
예제 요청:
PUT /users/1
{
"name": "John Doe",
"email": "john.doe@example.com"
}
PATCH /users/1
{
"email": "new.email@example.com"
}
3️⃣ DELETE
실습 아이디어: 게시물 삭제
목표:
- DELETE 요청을 통해 게시물 삭제.
- 이미 삭제된 리소스 요청에 대한 처리 확인.
구현 단계:
1. Controller
DELETE /posts/{id}: 게시물 삭제 요청 처리.
- 삭제 처리 로직 작성
- HashMap이나 List에서 ID 기반으로 삭제.
- 삭제 성공/실패 응답 반환.
테스트:
- Postman 또는 cURL로 DELETE 요청 전송 후 상태 코드 확인(예: 204 No Content).
4️⃣ OPTIONS & HEAD
실습 아이디어: 서버 정보 확인
목표:
- OPTIONS로 서버가 지원하는 HTTP 메서드 확인.
- HEAD로 리소스 메타 정보 확인.
구현 단계:
1. OPTIONS: Spring의 @RequestMapping으로 특정 메서드 구현 없이 자동으로 지원.
@RequestMapping(value = "/posts", method = RequestMethod.OPTIONS)
public ResponseEntity<Void> options() {
return ResponseEntity.ok().build();
}
- HEAD: Spring Boot의 기본 GET 핸들러로 동작 테스트 가능.
테스트:
- Postman에서 OPTIONS 요청을 보내 지원되는 메서드 확인.
- HEAD 요청으로 응답 본문 없이 상태 코드 및 헤더 확인.
5️⃣ TRACE
실습 아이디어: 디버깅 요청
목표:
- TRACE 요청을 보내 서버까지의 경로를 확인.
주의: 대부분의 서버에서 보안상 TRACE 메서드를 비활성화.
구현:
실습을 더 발전시키는 아이디어
- RestTemplate나 WebClient를 활용해 클라이언트에서 HTTP 요청 직접 보내보기.
- GET, POST, PUT, DELETE 등 실제 서버와 상호작용.
- Spring Boot Actuator를 사용해 HEAD와 OPTIONS 메서드 활용.
- 간단한 프론트엔드와 연동하여 POST와 PUT 요청 보내기.
- React, Vue.js, 혹은 HTML + JavaScript로 폼 구현.
- Swagger나 Postman으로 API 문서화.
실습 환경
- Postman: REST API 요청 테스트.
- Spring Boot: 간단한 REST API 서버 생성.
- H2 데이터베이스: 테스트용 임시 데이터베이스 사용.
추천 도서 & 참고 자료
- "Spring in Action": Spring Boot와 REST API 활용 예제.
- Postman API 플랫폼: 다양한 HTTP 요청 테스트.
이러한 실습을 통해 HTTP 메서드의 동작을 확실히 이해할 수 있을 것입니다. 👍