@InitBinder

코딩냥이·2024년 9월 10일

Annotation

목록 보기
29/34

@InitBinder

@InitBinder 어노테이션은 스프링 MVC에서 컨트롤러에 들어오는 요청의 데이터 바인딩과 유효성 검사를 커스터마이즈하는 데 사용되는 어노테이션입니다.

기능

  • 특정 데이터 타입에 대한 커스텀 바인딩을 정의할 수 있습니다.
  • 유효성 검사기를 등록할 수 있습니다.
  • 특정 필드를 바인딩에서 제외할 수 있습니다.
  • 날짜 형식 지정 등 복잡한 데이터 변환 로직을 구현할 수 있습니다.

사용 방법

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

import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;

@ControllerAdvice
public class GlobalBindingInitializer {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }
}

주요 특징

  1. 컨트롤러 특화: 특정 컨트롤러 클래스 내에서 정의하여 해당 컨트롤러에만 적용할 수 있습니다.
  2. 전역 설정: @ControllerAdvice와 함께 사용하여 전역 설정이 가능합니다.
  3. 유연한 커스터마이징: WebDataBinder를 통해 다양한 바인딩 옵션을 설정할 수 있습니다.
  4. 타입 변환: 문자열을 특정 객체 타입으로 변환하는 로직을 정의할 수 있습니다.

고급 사용법

1. 특정 필드 바인딩 제외

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setDisallowedFields("id");
}

2. 커스텀 유효성 검사기 등록

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.addValidators(new UserValidator());
}

3. 특정 타입에 대한 프로퍼티 에디터 등록

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(PhoneNumber.class, new PhoneNumberEditor());
}

4. 날짜 형식 지정

@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}

@ControllerAdvice와 함께 사용

전역적으로 @InitBinder 메서드를 적용하려면 @ControllerAdvice와 함께 사용할 수 있습니다:

@ControllerAdvice
public class GlobalBindingInitializer {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 전역 바인딩 설정
    }
}

테스트

@InitBinder가 적용된 컨트롤러를 테스트할 때:

@WebMvcTest(UserController.class)
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testDateBinding() throws Exception {
        mockMvc.perform(post("/users")
                .param("birthDate", "1990-01-01"))
                .andExpect(status().isOk());
    }
}

주의사항

  1. 성능 고려: 복잡한 바인딩 로직은 성능에 영향을 줄 수 있습니다.
  2. 오버라이딩 주의: 전역 설정과 컨트롤러 특정 설정이 충돌할 수 있으므로 주의가 필요합니다.
  3. 스레드 안전성: @InitBinder 메서드는 스레드 안전해야 합니다.

베스트 프랙티스

  1. 필요한 경우에만 사용: 기본 바인딩으로 충분한 경우 불필요하게 사용하지 마세요.
  2. 명확한 목적: 각 @InitBinder 메서드의 목적을 주석으로 명확히 설명하세요.
  3. 재사용성 고려: 공통으로 사용되는 바인딩 로직은 별도의 유틸리티 클래스로 분리하세요.
  4. 타입 안전성: 가능한 한 타입 안전한 방식으로 바인딩을 구현하세요.
  5. 테스트 작성: 복잡한 바인딩 로직에 대해서는 단위 테스트를 작성하세요.

결론

@InitBinder는 스프링 MVC에서 데이터 바인딩과 유효성 검사를 세밀하게 제어할 수 있게 해주는 강력한 도구입니다. 이를 통해 개발자는 복잡한 데이터 변환 로직을 구현하거나, 특정 필드에 대한 바인딩을 커스터마이즈할 수 있습니다. 특히 날짜 형식 변환, 열거형 처리, 복잡한 객체 그래프 바인딩 등에 유용하게 사용될 수 있습니다. 다만, 과도한 사용은 애플리케이션의 복잡성을 증가시킬 수 있으므로, 필요한 경우에만 적절히 사용하는 것이 중요합니다.

연관 포스팅

@ControllerAdvice
@Valid
@ModelAttribute
@RequestMapping
@Controller

profile
HelloMeow~!

0개의 댓글