RedirectAttributes는 Spring Framework의 Spring MVC에서 사용되는 인터페이스로, 리다이렉션 시점에 속성을 추가하는 데 사용됩니다. 일반적으로 컨트롤러 메서드에서 RedirectAttributes 인스턴스를 메서드 매개변수로 받아 리다이렉션 후에도 데이터를 유지할 수 있게 합니다.
Spring MVC에서 클래스 레벨과 메서드 레벨에 URL을 매핑하는 방법에는 몇 가지 차이점이 있습니다.
1.클래스 레벨에서의 URL 매핑: 클래스 레벨에서 URL을 매핑하면, 해당 URL 접두사가 해당 컨트롤러 클래스에 있는 모든 요청 매핑 메서드에 적용됩니다. 이를 통해 관련된 작업을 그룹화하여 코드의 조직화를 개선할 수 있습니다.
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
// ...
}
@GetMapping("/list")
public ResponseEntity<List<User>> getUserList() {
// ...
}
}
2.메서드 레벨에서의 URL 매핑:
메서드 레벨에서 URL을 매핑하면, 해당 URL은 단순히 해당 메서드에만 매핑됩니다. 이를 통해 메서드별로 다른 URL을 지정할 수 있습니다.
@RestController
public class UserController {
@GetMapping("/users/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
// ...
}
@GetMapping("/users/list")
public ResponseEntity<List<User>> getUserList() {
// ...
}
}
정리: 클래스 레벨 매핑: 관련된 메서드를 그룹화하고 코드를 더 깔끔하게 만들어줍니다. 일종의 네임스페이스 역할을 합니다. 메서드 레벨 매핑: 메서드마다 다른 기본 URL을 제공할 수 있어 유연성이 증가하지만, 코드가 조금 더 분산될 수 있습니다. 어떤 방식을 선택할지는 특정 애플리케이션의 요구 사항과 개발자의 선호에 따라 달라집니다.
ps 회사 레거시 코드들이 메서드 방식으로 레벨매핑이 되어 있어서 항상 그런식으로 했는데요.
김영한 개발자님 강의를 듣는데 클래스 레벨 맵핑으로 하시길래 궁금해서 찾게 되었습니다.
차이점은 개발 상황에 따라 달라지는듯합니다. 근데 저도 클래스 레벨 매핑이 조금더 마음에 드네요.
returnvalue handler란? HandlerMethodReturnValueHandler 인터페이스는 Spring MVC에서 컨트롤러 메서드가 반환하는 값을 어떻게 처리할지 정의합니다. 이 인터페이스는 컨트롤러에서 반환된 객체를 HTTP 응답으로 변환하는 역할을 합니다.
1.supportsReturnType(MethodParameter returnType): 이 메서드는 특정 반환 유형을 처리할 수 있는지 여부를 나타냅니다. 예를 들어, 일부 ReturnValueHandler는 @ResponseBody 애노테이션이 붙은 메서드를 처리하도록 설계되어 있습니다.
2.handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest): 이 메서드는 실제 반환 값을 처리합니다.
ex)
@RestController
public class MyController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}
}
위 예시에서 "Hello, World!" 문자열은 HandlerMethodReturnValueHandler에 의해 HTTP 응답 본문으로 변환됩니다.
커스텀 ReturnValueHandler 특별한 유형의 반환 값을 처리하려면, HandlerMethodReturnValueHandler 인터페이스를 구현하여 커스텀 ReturnValueHandler를 만들 수 있습니다. 그런 다음, 이를 Spring MVC에 등록합니다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
handlers.add(new MyCustomReturnValueHandler());
}
}