
BindingResult 첫 번째 지금부터 스프링이 제공하는 검증 오류 처리 방법을 알아본다. 여기서 핵심은 BindingResult이다. BindingResult가 errors의 역할을 해 줄 것이다. addItem 변경 // 메서드명 변경 @PostMapping("/add") public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) { // 검증 로직 if (!StringUtils.hasText(item.getItemName())) { bindingResult.addError(new FieldError("item", "itemName", "상품 이..
프로젝트 준비 V2 앞서 만든 기능을 유지하기 위해, 컨트롤러와 템플릿 파일을 복사 ValidationItemControllerV2 컨트롤러 생성 우선 package hello.itemservice.web.validation; import hello.itemservice.domain.item.Item; import hello.itemservice.domain.item.ItemRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.spri..

검증 직접 처리 - 소개 상품 저장 성공 사용자가 상품 등록 폼에서 정상 범위의 데이터를 입력하면, 서버에서는 검증 로직이 통과하고, 상품을 저장하고, 상품 상세 화면으로 redirect한다. 상품 저장 검증 실패 고객이 상품 등록 폼에서 상품명을 입력하지 않거나, 가격, 수량 등이 너무 작거나 커서 검증 범위를 넘어서면, 서버 검증 로직이 실패해야 한다. 이렇게 검증에 실패한 경우 고객에게 다시 상품 등록 폼을 보여주고, 어떤 값을 잘못 입력했는지 친절하게 알려주어야 한다. 개발 시작 ValidationItemControllerV1 - addItem() 수정 // 실제 저장하는 곳 @PostMapping("/add") public String addItem(@ModelAttribute Item item..

인프런 김영한 '스프링 MVC 2편 내용 학습입니다. 검증 요구사항 상품 관리 시스템에 새로운 요구사항이 추가되었다. 요구사항 : 검증 로직 추가 # 타입 검증 가격, 수량에 문자가 들어가면 검증 오류 처리 # 필드 검증 상품명 : 필수, 공백X 가격 : 1000원 이상, 1백만원 이하 수량 : 최대 9999 # 특정 필드의 범위를 넘어서는 검증 가격 * 수량의 합은 10,000원 이상 컨트롤러의 중요한 역할중 하나는 HTTP 요청이 정상인지 검증하는 것이다. 그리고 정상 로직보다 이런 검증 로직을 잘 개발하는 것이 어쩌면 더 어려울 수 있다. -> 먼저 검증을 직접 구현해보고, 뒤에서 스프링과 타임리프가 제공하는 검증 기능을 활용한다.

스코프와 프록시 이번에는 프록시 방식을 사용해보자. [핵심 로직] @Component @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) public class MyLogger { } # proxyMode = ScopedProxyMode.TARGET_CLASS 가 핵심! 적용 대상이 인터페이스가 아닌 클래스면 TARGET_CLASS 를 선택 적용 대상이 인터페이스면 INTERFACES 를 선택 이렇게 하면 MyLogger의 가짜 프록시 클래스를 만들어두고 HTTP request와 상관 없이 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다. 그래서 전체 MyLogger @Component @Scope(value = "reques..

스코프와 Provider 앞선 포스팅에서 나온 에러를 잡는 방법을 살펴보자 LogDemoController 수정 @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final ObjectProvider myLoggerProvider; // 이것도 타입 바꿔줌 @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); MyLogger ..

build.gradle plugins { id 'java' id 'org.springframework.boot' version '2.7.16' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'inflearn' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } //lombok 설정 추가 시작 configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot..