
검증 직접 처리 - 소개 상품 저장 성공 사용자가 상품 등록 폼에서 정상 범위의 데이터를 입력하면, 서버에서는 검증 로직이 통과하고, 상품을 저장하고, 상품 상세 화면으로 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..

웹 스코프 지금까지 싱글톤과 프로토타입 스코프를 학습했다. 싱글톤은 스프링 컨테이너의 시작과 끝까지 함께하는 매우 긴 스코프이고, 프로토타입은 생성과 의존관계 주입, 그리고 초기화까지만 진행하는 특별한 스코프이다. 이번에는 웹 스코프에 대해서 알아보겠다. 여기서는 request 스코프를 예제를 통해 구현해 나갈 것임. HTTP request 요청 당 각각 할당되는 request 스코프 => 동시에 요청이 들어와도 각각 할당된 인스턴스가 있어서 거기에 맞게 배당되어 일을 처리한다.