@ResponseBody

코딩냥이·2024년 9월 10일

Annotation

목록 보기
24/34

@ResponseBody

@ResponseBody 어노테이션은 스프링 MVC에서 컨트롤러 메서드의 반환값을 HTTP 응답 본문으로 직접 전송할 때 사용하는 어노테이션입니다.

기능

  • 메서드의 반환값을 HTTP 응답 본문으로 직접 전송합니다.
  • 주로 JSON이나 XML 형식의 데이터를 반환할 때 사용됩니다.
  • 뷰 리졸버를 거치지 않고 직접 데이터를 반환합니다.

사용 방법

기본적인 사용 방법은 다음과 같습니다:

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {

    @GetMapping("/users/{id}")
    @ResponseBody
    public User getUser(@PathVariable Long id) {
        // 사용자 조회 로직
        return userService.findById(id);
    }
}

주요 특징

  1. 객체 자동 변환: 반환된 객체를 자동으로 JSON이나 XML로 변환합니다.
  2. 컨텐츠 타입 자동 설정: 적절한 Content-Type 헤더를 자동으로 설정합니다.
  3. 뷰 무시: 뷰 리졸버를 통한 뷰 처리 과정을 건너뜁니다.
  4. RESTful 서비스: RESTful 웹 서비스 구현에 이상적입니다.

고급 사용법

1. 클래스 레벨 적용

클래스 레벨에 적용하여 모든 메서드에 @ResponseBody를 적용할 수 있습니다:

@Controller
@ResponseBody
public class UserApiController {
    // 모든 메서드가 @ResponseBody를 사용한 것처럼 동작
}

2. ResponseEntity 사용

더 세밀한 제어가 필요한 경우 ResponseEntity를 사용할 수 있습니다:

@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    User user = userService.findById(id);
    if (user != null) {
        return ResponseEntity.ok(user);
    } else {
        return ResponseEntity.notFound().build();
    }
}

3. 커스텀 HttpMessageConverter 사용

특별한 형식의 응답을 생성해야 할 경우, 커스텀 HttpMessageConverter를 구현하고 등록할 수 있습니다:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MyCustomMessageConverter());
    }
}

@RestController와의 관계

@RestController 어노테이션은 @Controller@ResponseBody를 결합한 것입니다. @RestController를 사용하면 클래스의 모든 메서드에 자동으로 @ResponseBody가 적용됩니다:

@RestController
public class UserApiController {
    // 모든 메서드가 자동으로 @ResponseBody를 사용한 것처럼 동작
}

예외 처리

@ResponseBody를 사용할 때 발생할 수 있는 예외를 처리하려면 @ExceptionHandler를 사용할 수 있습니다:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ErrorResponse handleException(Exception ex) {
        return new ErrorResponse("An error occurred: " + ex.getMessage());
    }
}

테스트

@ResponseBody가 적용된 컨트롤러 메서드를 테스트할 때:

@WebMvcTest(UserController.class)
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testGetUser() throws Exception {
        mockMvc.perform(get("/users/1"))
               .andExpect(status().isOk())
               .andExpect(content().contentType(MediaType.APPLICATION_JSON))
               .andExpect(jsonPath("$.id").value(1));
    }
}

주의사항

  1. 순환 참조: 객체 간 순환 참조가 있을 경우 JSON 변환 시 문제가 발생할 수 있습니다.
  2. 대용량 데이터: 큰 데이터를 반환할 때는 메모리 사용에 주의해야 합니다.
  3. 보안: 민감한 정보가 자동으로 노출되지 않도록 주의해야 합니다.

베스트 프랙티스

  1. DTO 사용: 도메인 객체를 직접 반환하기보다는 DTO(Data Transfer Object)를 사용하세요.
  2. 적절한 상태 코드: ResponseEntity를 사용하여 적절한 HTTP 상태 코드를 반환하세요.
  3. 일관된 응답 형식: 애플리케이션 전체에서 일관된 응답 형식을 유지하세요.
  4. 문서화: API 응답 구조를 명확히 문서화하세요.

결론

@ResponseBody는 RESTful API 개발에서 매우 유용한 어노테이션입니다. 객체를 HTTP 응답으로 쉽게 변환할 수 있게 해주며, 이를 통해 클라이언트에게 데이터를 효율적으로 전달할 수 있습니다. @RestController와 함께 사용하면 더욱 간결한 코드를 작성할 수 있습니다. 다만, 보안과 성능 측면에서 주의가 필요하며, 적절한 예외 처리와 문서화가 동반되어야 합니다.

연관 포스팅

@RestController
@Controller
@RequestBody
@ExceptionHandler
@ControllerAdvice

profile
HelloMeow~!

0개의 댓글