300===Dev Framework/Spring

Spring Controller HTTP 메소드 어노테이션 완벽 가이드 🎯

블로글러 2024. 11. 14. 12:44

안녕하세요! 오늘은 Spring Controller에서 사용되는 HTTP 메소드별 특화 어노테이션에 대해 자세히 알아보겠습니다.

HTTP 메소드 어노테이션이란? 🤔

HTTP 메소드 어노테이션은 Spring MVC에서 각 HTTP 요청 방식을 처리하기 위한 특별한 어노테이션입니다. 마치 우체통에 편지를 넣는 것처럼, 각각의 요청을 알맞은 메소드로 전달해주는 역할을 합니다!

기본 어노테이션 살펴보기 📬

1. @GetMapping

@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    return userService.findById(id);
}
  • 데이터 조회에 사용
  • URL에 파라미터가 노출됨
  • 브라우저 히스토리에 기록됨
  • 북마크 가능

2. @PostMapping

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody UserDto userDto) {
    User savedUser = userService.save(userDto);
    return ResponseEntity.created(URI.create("/users/" + savedUser.getId()))
                        .body(savedUser);
}
  • 새로운 리소스 생성
  • Request Body에 데이터 포함
  • 멱등성이 보장되지 않음
  • 캐시되지 않음

3. @PutMapping

@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody UserDto userDto) {
    return userService.update(id, userDto);
}
  • 리소스 전체 업데이트
  • 멱등성 보장
  • 없는 리소스라면 새로 생성 가능

4. @DeleteMapping

@DeleteMapping("/users/{id}")
public ResponseEntity<?> deleteUser(@PathVariable Long id) {
    userService.delete(id);
    return ResponseEntity.noContent().build();
}
  • 리소스 삭제
  • 멱등성 보장
  • 보통 204 No Content 응답

5. @PatchMapping

@PatchMapping("/users/{id}")
public User partialUpdateUser(@PathVariable Long id, 
                            @RequestBody Map<String, Object> updates) {
    return userService.partialUpdate(id, updates);
}
  • 리소스 부분 업데이트
  • 변경이 필요한 필드만 전송
  • PUT보다 네트워크 효율적

실용적인 사용 예시 💡

1. 검색 API

@GetMapping("/users/search")
public List<User> searchUsers(@RequestParam String keyword,
                            @RequestParam(defaultValue = "0") int page) {
    return userService.search(keyword, page);
}

2. 파일 업로드

@PostMapping("/users/{id}/profile-photo")
public ResponseEntity<?> uploadPhoto(@PathVariable Long id,
                                   @RequestParam MultipartFile file) {
    String photoUrl = userService.uploadPhoto(id, file);
    return ResponseEntity.ok().body(Map.of("photoUrl", photoUrl));
}

3. 벌크 작업

@PostMapping("/users/bulk")
public ResponseEntity<?> bulkCreate(@RequestBody List<UserDto> users) {
    List<User> createdUsers = userService.bulkCreate(users);
    return ResponseEntity.ok(createdUsers);
}

주의사항 ⚠️

  1. 적절한 HTTP 상태 코드 사용

    • 200: 성공
    • 201: 생성 성공
    • 204: 성공적인 삭제
    • 400: 잘못된 요청
    • 404: 리소스 없음
  2. URL 설계 규칙

    • 명사형 사용
    • 계층 구조 반영
    • 버전 관리 고려

보안 고려사항 🔒

@PostMapping("/users")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDto userDto) {
    // 구현
}

References:

728x90