분류 전체보기(250)
-
검증 - Bean Validation(HTTP 메시지 컨버터)
들어가기 전에, @Valid , @Validated 는 HttpMessageConverter ( @RequestBody )에도 적용할 수 있다. > @RequestBody 는 HTTP Body의 데이터를 객체로 변환할 때 사용한다. 주로 API JSON 요청을 다룰 때 사용한다. 다음과 같은 컨트롤러가 있다. @Slf4j @RestController @RequestMapping("/validation/api/items") public class ValidationItemApiController { @PostMapping("/add") public Object addItem(@RequestBody @Validated ItemSaveForm form, BindingResult bindingResult) { ..
2022.04.02 -
검증 - Bean Validation
이전 포스팅에서 다뤘던 Validation보다 편리한 Bean Validation을 소개한다. 사용을 위해서는 먼저 라이브러리를 추가해야 한다. build.gradle에 implementation 'org.springframework.boot:spring-boot-starter-validation' 추가해 라이브러리를 등록하자. 스프링 부트는 이 라이브러리를 넣으면 자동으로 Bean Validator를 인지하고 스프링에 통합해준다. 또, 스프링 부트는 자동으로 글로벌 Validator로 등록한다. 이 등록된 Validator는 @NotNull, @Max 등의 애노테이션을 보고 검증을 수행한다. 이렇게 글로벌 Validator가 등록되어있으므로, 검증하고자 하는 파라미터 앞에 @Valid 또는 @Valid..
2022.04.02 -
[JUnit] org.junit.runners.model.InvalidTestClassError
필자는 JUnit4를 사용했는데, JUnit5에서 제공되는 클래스를 혼용했다. junit5에서는 @RunWith 어노테이션을 지원하지 않는다. 대신 @ExtendWith 어노테이션을 지원한다. 따라서 org.junit.jupiter.api.Test 을 사용할 경우에는 @ExtendWith를 사용해야 한다. 참고로 필자처럼 JUnit4를 사용중이라면 org.junit.jupiter.api.Test이 아니라 import org.junit.Test; 으로 변경해야 한다. 이 변경으로 해결했다. 결론 임포트를 잘하자(전에도 겪은 실수를 반복해서 포스팅하였음)
2022.04.02 -
검증 - Validation (2)
이전 검증 - Validation (1) 포스팅 참고 Controller에서 rejectValue()메서드를 활용해 한층 깔끔해졌다고 해도, 여전히 Controller에는 검증하는 코드가 한가득 있다. 복잡한 검증 로직을 따로 분리하자. ItemValidator를 만들어보자 @Component public class ItemValidator implements Validator { @Override public boolean supports(Class clazz) { return Item.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { Item item = (Item) target;..
2022.03.31 -
검증 - Validation(1)
BindingResult 스프링이 제공하는 검증 오류를 보관하는 객체이다. 검증 오류가 발생하면 해당 필드가 여기에 저장된다. BindingResult 가 있으면 @ModelAttribute 에 데이터 바인딩 시 오류가 발생할 경우 컨트롤러가 호출된다! @ModelAttribute에 바인딩 시 타입 오류가 발생하면? BindingResult 가 없으면 400 오류가 발생하면서 컨트롤러가 호출되지 않고, 오류 페이지로 이동한다. BindingResult 가 있으면 오류 정보( FieldError )를 BindingResult 에 담아서 컨트롤러를 정상 호출한다(컨트롤러에서 재주껏 처리하도록) BindingResult에 검증 오류를 적용하는 3가지 방법 @ModelAttribute 의 객체에 타입 오류 등으..
2022.03.31 -
영속성 전이: CASCADE, 고아 객체
• 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때! • 예: 부모 엔티티를 저장할 때 자식 엔티티도 자동으로 em.persist(). • 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음 • 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐이다. CASCADE의 종류 • ALL: 모두 적용 • PERSIST: 영속 • REMOVE: 삭제 고아객체(orphanRemovel) 만약 고아 객체(orphanRemovel = true)로 설정되었다면, 부모 엔티티와 연관관계가 끊어지면 자식 엔티티가 자동으로 삭제된다. 예를들어, Listlist에서 remove(0)을 실행하면 index가 0번인 Child 엔티티에 DELETE 쿼리가 날라간다...
2022.03.31