데이터를 등록할 때와 수정할 때는 요구사항이 다를 수 있다.타입 검증가격, 수량에 문자가 들어가면 검증 오류 처리필드 검증상품명: 필수, 공백X가격: 1000원 이상, 1백만원 이하수량: 최대 9999특정 필드의 범위를 넘어서는 검증가격 \* 수량의 합은 10,000원
코드 제거기존에 등록한 ItemValidator를 제거해두자! 오류 검증기가 중복 적용된다.스프링 부트가 spring-boot-starter-validation 라이브러리를 넣으면 자동으로 Bean Validator 를 인지하고 스프링에 통합한다.LocalValidat
Bean Validation 기능을 어떻게 사용하는지 코드로 알아보자.먼저 스프링과 통합하지 않고, 순수한 Bean Validation 사용법 부터 테스트 코드로 알아보자.Bean Validation을 사용하려면 다음 의존관계를 추가해야 한다.build.gradlesp
검증 기능을 지금처럼 매번 코드로 작성하느 것은 상당히 번거롭다.특히 특정 필드에 대한 검증 로직은 대부분이 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다.이런 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한것이 바로
검증 오류 코드는 다음과 같이 2가지로 나눌 수 있다.개발자가 직접 설명한 오류 코드 -> rejectValue()를 직접 호출스프링이 직접 검증 오류에 추가한 경우 (주로 타입 정보가 맞지 않음)price 필드에 문자 "A"를 입력해보자.로그를 확인해보면 Bindin
핵심은 구체적인 것에서! 덜 구체적인 것으로!MessageCodesResolver는 required.item.itemName처럼 구체적인 것을 먼저 만들어주고, required처럼 덜 구체적인 것을 가장 나중에 만든다.이렇게 하면 앞서 말한 것 처럼 메세지와 관련된 공
우선 테스트 코드로 MessageCodesResolver를 알아보자.검증 오류 코드로 메세지 코드들을 생성한다MessageCodesResolver 인터페이스이고 DefaultMessageCodesResolver는 기본 구현체 이다.주로 다음과 함께 사용ObjectErr
오류 코드를 만들 때 다음과 같이 자세히 만들 수도 있고,required.item.itemName: 상품 이름은 필수 입니다.range.item.price: 상품의 가격 범위 오류 입니다.또는 다음과 같이 단순하게 만들 수도 있다.required: 필수 값 입니다.ra
목표FieldError, ObjectError는 다루기 너무 번거롭다.오류 코드도 좀 더 자동화 할 수 있지 않을까? ex) item.itemName 처럼?컨트롤러에서 BindingResult는 검증해야 할 객체인 target바로 다음에 온다.따라서 BindingRes
오류 메세지를 체계적으로 다루어보자FieldError 생성자FieldError는 두 가지 생성자를 제공한다.파라미터 목록objectName : 오류가 발생한 객체 이름field : 오류 필드rejectedValue : 사용자가 입력한 값(거절된 값)bindingFail
스프링이 제공하는 검증 오류를 보관하는 객체이다. 검증 오류가 발생하면 여기에 보관하면 된다.BindingResult가 있으면 @ModelAttribute에 데이터 바인딩 시 오류가 발생해도 컨트롤러가 호출 된다.ex) @ModelAttribute에 바인딩 시 타입 오
핵심은 BindingResult이다.📍 주의 : BindingResult bindingResult 파라미터의 위치는 @ModelAttribute Item item 다음에 와야 한다.필드에 오류가 있으면 FieldError 객체를 생성해서 bindingResult 에
상품 관리 시스템에 새로운 요구사항이 추가되었다.타입 검증가격, 수량에 문자가 들어가면 검증 오류 처리필드 검증상품명: 필수, 공백X가격: 1000원 이상, 1백만원 이하수량: 최대 9999특정 필드의 범위를 넘어서는 검증가격 \* 수량의 합은 10,000원 이상폼 입
사용자, 설계자, 개발자가 데이터베이스를 보는 관점에 따라 데이터베이스를 기술하고 이들간의 관계를 정의한 ANSI 표준이다.3층 스키마는 데이터베이스의 독립성을 확보하기 위한 방법이다.데이터의 독립성 확보 시 장점데이터 복잡도 감소 데이터 중복 제거사용자 요구사항 변경
추상화 (Abstraction) : 현실 세계를 간략하게 표현한다. 단순화 (Simplification) : 누구나 쉽게 이해할 수 있도록 표현한다.명확성 (Clarity) : 명확하게 의미가 해석되어야 하고 한 가지 의미를 가져야 한다.개념 모델링 (conceptua
메세지에서 한 발 더 나가보자메세지에서 설명한 메세지 파일(messages.properties)을 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다.예를 들어서 다음과 같이 2개의 파일을 만들어서 분류한다.messages_en.propertiesmessages_
기획자가 화면에 표시되는 문구가 맘에 들지 않아 상품명 -> 상품이름 변경 요청을 한다면?여러 화면에 보이는 상품명,가격,수량 등 lable에 있는 단어를 변경하려면 다음 화면들을 다 찾아가면서 모두 변경 해야 한다.화면 수가 적으면 문제가 되지 않지만 화면이 수십개
셀렉트 박스는 여러 선택지 중에 하나를 선택할 때 사용할 수 있다.셀렉트 박스를 자바 객체를 활용해서 개발해보자.배송방식빠른 배송일반 배송느린 배송셀렉트 박스로 하나만 선택할 수 있다.DeliveryCode 라는 자바 객체를 사용하는 방법으로 진행하겠다.Delivery
라디오 버튼은 여러 선택지 중에 하나를 선택할 때 사용할 수 있다.라디오 버튼을 자바 ENUM을 활용해서 개발해 보자상품 종류도서, 식품, 기타라디오 버튼으로 하나만 선택할 수 있다.itemTypes를 등록 폼,조회, 수정 폼에서 모두 사용하므로 @ModelAttrib
체크 박스를 멀티로 사용해서, 하나 이상을 체크할 수 있도록 해보자등록 지역서울, 부산, 제주체크 박스로 다중 선택할 수 있다등록 폼, 상세화면, 수정 폼에서 모두 서울, 부산, 제주라는 체크 박스를 반복해서 보여주어야 한다. 이렇게 하려면 각각의 컨트롤러에서 mode