@GetMapping, @PostMapping 언제 써야 할까: HTTP 메서드 활용 가이드

@GetMapping, @PostMapping 언제 써야 할까: HTTP 메서드 활용 가이드 이미지 1

안녕하세요. IT 기술 블로거입니다.

REST API를 설계할 때 가장 기본이 되면서도 중요한 원칙은 바로 “적절한 HTTP 메서드를 사용하는 것”입니다. Spring Boot에서는 이를 위해 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 같은 어노테이션을 제공합니다.

하지만 실무에서 코드를 보다 보면, 데이터를 조회하는데 POST를 쓰거나 모든 처리를 POST 하나로 퉁치는 경우를 종종 봅니다. 이는 RESTful한 설계를 해칠 뿐만 아니라, 브라우저 캐싱이나 네트워크 효율성을 떨어뜨리는 원인이 됩니다.

오늘은 가장 많이 쓰이는 GET과 POST를 중심으로, 각 메서드를 언제 어떻게 써야 하는지 명확한 기준을 정리해 드리겠습니다.


1. @GetMapping: 자원의 조회 (Read)

@GetMapping은 서버로부터 정보를 가져올 때 사용합니다.

특징

  • 멱등성(Idempotency): 같은 요청을 여러 번 보내도 결과(서버의 상태)가 변하지 않습니다.
  • 캐싱 가능: 브라우저나 프록시 서버에서 결과를 저장해두고 재사용할 수 있어 빠릅니다.
  • 데이터 전달: URL의 쿼리 스트링(?id=1&name=test)을 통해 데이터를 전달합니다.

언제 쓰는가?

  • 게시글 상세 보기
  • 상품 목록 조회 및 검색
  • 마이페이지 정보 확인

2. @PostMapping: 자원의 생성 (Create)

@PostMapping은 서버에 데이터를 보내서 새로운 자원을 만들 때 사용합니다.

특징

  • 비멱등성: 같은 요청을 두 번 보내면 데이터가 두 개 생성될 수 있어 상태가 변합니다.
  • 보안성: 데이터가 URL에 노출되지 않고 HTTP Body에 담겨 전송됩니다. (상대적으로 안전)
  • 용량 제한 없음: 매우 큰 데이터나 이미지 파일 등을 전송할 수 있습니다.

언제 쓰는가?

  • 회원 가입 및 로그인
  • 게시글 작성
  • 결제 요청

3. 실무 코드 예제: 용도별 매핑

예제 1: 쿼리 파라미터를 사용한 검색 (GET)

@RestController
@RequestMapping("/api/books")
public class BookController {

    @GetMapping("/search")
    public List<Book> searchBooks(
            @RequestParam String title, 
            @RequestParam(required = false) String author) {
        // 검색은 서버 상태를 바꾸지 않으므로 GET이 적절합니다.
        return bookService.findByTitleAndAuthor(title, author);
    }
}

예제 2: JSON 데이터를 활용한 등록 (POST)

@RestController
@RequestMapping("/api/members")
public class MemberController {

    @PostMapping("/join")
    public ResponseEntity<Member> join(@RequestBody MemberJoinDto joinDto) {
        // 새로운 회원을 생성하므로 POST가 적절하며, 
        // 민감한 정보(비밀번호 등)는 Body에 담아 보냅니다.
        Member savedMember = memberService.save(joinDto);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedMember);
    }
}

4. GET vs POST 결정적 차이 (멱등성)

가장 흔히 하는 실수가 “보안 때문에 조회를 POST로 한다”는 것입니다. 물론 비밀번호가 들어가는 개인정보 조회 등 특수한 경우는 그럴 수 있습니다.

하지만 일반적인 조회에 POST를 쓰면 브라우저의 뒤로가기 버튼을 눌렀을 때 “양식 다시 제출 확인” 팝업이 뜨는 불편함을 겪게 됩니다. 또한 검색 엔진 최적화(SEO)에서도 불리합니다. 따라서 서버의 상태를 바꾸는가(Write)? 아니면 그대로 두는가(Read)?를 가장 먼저 따져보시기 바랍니다.


@GetMapping, @PostMapping 언제 써야 할까: HTTP 메서드 활용 가이드 이미지 2

결론

  • 데이터를 가져올 때는 @GetMapping (주소창에 데이터 노출, 캐싱 가능)
  • 데이터를 생성할 때는 @PostMapping (HTTP 본문에 데이터 숨김, 대용량 가능)

이 외에도 수정을 위한 PUT/PATCH, 삭제를 위한 DELETE가 있습니다. 각 메서드의 의미를 정확히 지켜 API를 설계할 때, 비로소 다른 개발자나 시스템이 신뢰할 수 있는 진정한 REST API가 완성됩니다.

다음 시간에는 이렇게 보낸 요청이 Spring Boot 내부에서 어떻게 응답으로 바뀌어 돌아오는지, “요청과 응답 처리 흐름”에 대해 깊이 있게 다뤄보겠습니다.

관련 글 보기