
제1장. DB(Database)란 무엇인가? 왜 DB가 필요한가? 데이터베이스가 왜 필요한가?'라고 묻는다면 여러 이유가 있지만, 가장 큰 이유로는 상이한 시스템에서 데이터를 공용하여 사용하기 위해 필요하다고 할 수 있다. 예를 들어 이런 데이터면 학생 파일 출결 파일 성적 파일 이름 이름 이름 수강 강좌 수강 강좌 수강 강좌 강좌 시간 출결 여부 성적 이름과 수강 강좌가 겹쳐있다는 것을 알 수 있다. 파일 내부에 데이터를 체계적으로 잘 입력해놨다면 상당히 편하게 정보를 추출할 수 있을테지만 여러 번 겹치게 입력을 해놨다면 검색이나 저장하는데 드는 비용등이 증가할 수 밖에 없다. => 데이터베이스는 이를 통합하여 관리해 정보를 구조적, 효율적으로 저장한다. 데이터베이스도 자료구조처럼 데이터의 추상화 과정..

Bean Validation - HTTP 메시지 컨버터 @Valid, @Validated 는 HttpMessageConverter (@RequestBody)에도 적용할 수 있다. ValidationItemApiController 생성 package hello.itemservice.web.validation; import hello.itemservice.domain.item.ItemSaveForm; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework...

Form 전송 객체 분리 - 개발 ITEM 원복 이제 Item 의 검증은 사용하지 않으므로 검증 코드를 제거해도 된다. @Data public class Item { private Long id; private String itemName; private Integer price; private Integer quantity; } ItemSaveForm - ITEM 저장용 폼 package hello.itemservice.domain.item; import lombok.Data; import org.hibernate.validator.constraints.Range; import javax.validation.constraints.Max; import javax.validation.constraints...

Form 전송 객체 분리 - 소개 ValidationItemV4Controller Q: 이름은 어떻게 지어야 하나요? 이름은 의미있게 지으면 된다. ItemSave 라고 해도 되고, ItemSaveForm , ItemSaveRequest , ItemSaveDto 등으로 사용해도 된다. 중요한 것은 일관성이다. Q: 등록, 수정용 뷰 템플릿이 비슷한데 합치는게 좋을까요? 한 페이지에 그러니까 뷰 템플릿 파일을 등록과 수정을 합치는게 좋을지 고민이 될 수 있다. 각각 장단점이 있으므로 고민하는게 좋지만, 어설프게 합치면 수 많은 분기문(등록일 때, 수정일 때) 때문에 나중에 유지보수에서 고통을 맛본다. 이런 어설픈 분기문들이 보이기 시작하면 분리해야 할 신호이다.

Bean Validation - groups 동일한 모델 객체를 등록할 때와 수정할 때 각각 다르게 검증하는 방법을 알아보자. 방법 2가지 BeanValidation의 groups 기능을 사용한다. Item을 직접 사용하지 않고, ItemSaveForm, ItemUpdateForm 같은 폼 전송을 위한 별도의 모델 객체를 만들어서 사용한다. BeanValidation groups 기능 사용 이런 문제를 해결하기 위해 Bean Validation은 groups라는 기능을 제공한다. 예를 들어서 등록시에 검증할 기능과 수정시에 검증할 기능을 각각 그룹으로 나누어 적용할 수 있다. 코드로 확인해보자. groups 적용 저장용 groups 생성 package hello.itemservice.domain.item..

Bean Validation - 한계 수정시 검증 요구사항 "데이터를 등록할 때와 수정할 때는 요구사항이 다를 수 있다." 수정 요구사항 적용 수정 시에는 Item 에서 id 값이 필수이고, quantity 도 무제한으로 적용할 수 있다. Item.java @Data public class Item { @NotNull //수정 요구사항 추가 111 private Long id; @NotBlank private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; @NotNull //@Max(9999) //수정 요구사항 추가 222 private Integer quantity; public Item() { } p..

// 수정에 적용은 여기 @PostMapping("/{itemId}/edit") public String edit(@PathVariable Long itemId, @Validated @ModelAttribute Item item, BindingResult bindingResult) { //특정 필드 예외가 아닌 전체 예외 if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice < 10000) { bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice},nu..

Bean Validation - 오브젝트 오류 Bean Validation에서 특정 필드( FieldError )가 아닌 해당 오브젝트 관련 오류( ObjectError )는 어떻게 처리할 수 있을까? 다음과 같이 @ScriptAssert() 를 사용하면 된다. (방법 1) Item.java @ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000", message = "10000원 이상 입력해주세요.") public class Item { } 실행해서 확인하면 메시지 코드도 다음과 같이 생성된다. ValidationItemControllerV3 - 글로벌 오류 추가 당연히 실행 시 똑같이 동작한다.