스프링/MVC 17

[MVC 기초] Spring Boot File Upload/Download 구현하기 (+ multipart/form-data 설명)

Spring Boot 파일 Upload Form 구현하기 form 데이터는 2가지로 구분된다. application/x-www-form-urlencoded multipart/form-data 여기서 application/x-www-form-urlencoded 는 일반적인 key-value 의 form 데이터 전송을 담당하고, 파일과 다양한 정보들을 함께 넘겨야 하기 때문에 multipart/form-data를 사용한다. multipart-form form에서 enctype으로 multipart라고 명시한다. ... enctype="multipart/form-data" : 멀티파트로 form 데이터를 넘긴다는 뜻 multipart-form 예제 Request Header POST / HTTP/1.1 Hos..

스프링/MVC 2022.07.26

[MVC 기초]Spring Formatter Date, Number 원하는 포맷으로 변환하기

Formatter란? Formatter는 객체를 특정 형식의 문자로, 특정 형식의 문자를 객체로 변환해주는 객체를 의미한다. 스프링은 기본적으로 특정 객체를 정해진 양식으로 변환해주는 기능을 지원해준다. 숫자, 날짜 변환 @Data static class Form { @NumberFormat(pattern = "###,###") private Integer number; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime localDateTime; } @NumberFormat(pattern = "###,###" : 숫자를 지정된 pattern으로 변환 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:..

스프링/MVC 2022.07.26

[MVC 기초] Custom 객체 Converter 생성, ConversionService에 등록해 자유롭게 변환하기 (+thymeleaf에서 변환법)

특정 객체 Converter 만들기 Converter 인터페이스를 구현하여 변환을 원하는 객체, 결과 순으로 입력한다. ex) IP, port를 변수로 가지고 있는 IpPort 객체를 String으로 변환해보자. 원하는 객체 생성 (IpPort) @Getter @EqualsAndHashCode public class IpPort { private String ip; private int port; public IpPort(String ip, int port) { this.ip = ip; this.port = port; } } @EqualsAndHashCode : @Data를 등록하면 자동으로 생성되는 롬복 제공 기능이다 객체가 같은지 equals를 제공해준다. IpPort 객체를 원하는 객체로 변환 Co..

스프링/MVC 2022.07.25

[MVC 기초] API 예외 처리 @ExceptionHandler + 스프링 Resolver 동작 원리

API 예외 처리 오류시 HttpStatus 정해주기 예외에 맞춰 HTTP Status Code 를 지정하여 넘겨줄 수 있다. 보통 그냥 API 에러가 나면 500에러가 나는데, 문제에 따라 다른 Status를 남기고 싶을 때 사용한다. customException + @ResponseStatus(code,reason) 조합하기 @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류") public class BadRequestException extends RuntimeException { } @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류"): Response Sta..

스프링/MVC 2022.07.07

[MVC 기본] 공통 관심사항을 처리하는 방법 (Servlet Filter, Spring Interceptor를 구현하며)

서블릿 필터 서블릿 필터란 주로 웹과 관련된 공통관심사항 을 처리할 때 사용한다. why? Http의 헤더나 URL의 정보들이 필요한데, 서블릿 필터, 스프링 인터셉터는 `HttpServletRequest` 등 웹에 필요한 기능들을 제공한다. + 웹과 관련된 많은 기능들 제공. AOP는 메서드 호출 시에 어떤 것이 호출되고 이런 것들만 알 수 있다. 공통 관심사항 : Application의 여러 로직에서 공통적으로 적용되어야 하는 기능 (ex : 인증 Authentication, 로그인 처리) 필터 작동 순서 //기본 작동 순서 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 //제한 HTTP 요청 -> WAS -> 필터(부적절 요청 판단, 서블릿 요청 X) 끝 //체인 HTTP 요청 -..

스프링/MVC 2022.06.06

[MVC 기초] 패키지 구조 설계 domain vs web package

domain vs web 패키지 domain 시스템이 구현해야하는 핵심 비즈니스 업무 영역 (화면, UI, 기술 인프라 등등을 제외한) 따라서 시스템의 기술을 변경하더라도 변하지 않아야 한다. 독립적으로 생성되어 있어야 함. web web -> domain 방식으로 웹은 도메인을 알지만, 도메인은 웹을 모르게 설계해야 한다. (극단적으로 web 패키지를 모두 삭제해도 domain에 오류가 없게) 단방향 의존관계 ex) Form에 맞춰 생성된 객체(웹)는 Controller(웹)/에서만 사용되어야지, Repository영역(도메인)까지 넘어가면 안된다.

스프링/MVC 2022.05.29

[MVC 기초] Bean Validation (Spring 기능 적극 활용)

Bean Validation Controller단에서 Validation을 구현하는 것은, 소스코드도 복잡해지고 한 눈에 들어오기 어려워진다. 그래서 Spring에서는 Bean Validation을 사용하도록 권장한다. Bean Validation은 JPA처럼 추상 표준기술이다. 많은 구현체들이 존재하고, 대표적으로 하이버네이트 Validation이 있다. Gradle 설정 implementation 'org.springframework.boot:spring-boot-starter-validation' 을 추가해줘야 한다. jakarta.validation:jakarta.validation-api 그래들이 들어온 모습 객체에 @Max, @NotNull 등을 사용할 때 있는 어노테이션이 여기..

스프링/MVC 2022.05.26

[MVC 기초] 스프링 Form Validation 처리하기 (기존 데이터 유지 + properties로 오류 문자 관리 + Spring Validator 사용)

validation (타임리프 + 스프링부트 ) 검증 페이지 생성하기 방법 1. Model에 Error 담아서 view로 리턴 Controller에서 검증하기 프론트 단 뿐만 아니라 백엔드에서도 검증을 수행해야 한다. 순서 Controller의 Model 객체에 'Error'로 담아 넘긴다. 오류가 발생할 경우, 다시 해당 Page 의 View를 보여준다. 타임리프의 조건문으로, 해당 오류가 나는 부분을 수정하라고 사용자에게 보여준다. 방법 2. 스프링이 제공하는 BindingResult 방법 사용하기 BindingResult란? 검증 오류를 보관하는 객체이다. @ModelAttribute 뒤에 인자로 선언하여서 오류가 발생하면 담아서 사용하면 된다. Model에 담지 않아도 자동으로 View화면에 넘어..

스프링/MVC 2022.05.24

[MVC 기초] 메세지와 국제화 (스프링 부트 + 타임리프를 곁들인)

메세징 html에서 사용될 단어들을 properties 파일에 key=value 로 저장해둔 뒤, 가져다 쓰는 것 국제화 언어별로 메세지를 별도 관리하여 국제화 서비스를 구현하는 것 message properties 파일을 언어별로 관리한다. 어떻게 언어를 감지하여 국가별로 다른 언어를 뿌려주는가? http accept-language 헤더 값을 사용하거나 사용자가 직접 언어를 선택하게 하거나, 쿠키등을 사용하여 처리 감지된 언어별로 다른 properties 파일 관리 messages_en.properties 영어 국가에서 접근하면, 선택하면 동작 item=Item item.id=Item ID item.itemName=Item Name item.price=price item.quantity=quantit..

스프링/MVC 2022.05.20

[MVC 기초] PRG 패턴 (Post->Redirect->Get) 사용자의 Data 등록폼에서 새로고침시 대처법 + RedirectAttribute 으로 동적 html 생성

item-service PRG 패턴 (Post/Redirect/Get) 페이지에서 Data가 SAVE되고 나서, Redirect를 해주지 않으면, 계속해서 같은 URL을 호출하기 때문에 지속적으로 POST에 SAVE 명령을 호출하여 데이터가 저장될 수 있다. 단순 Form View로 전송 @GetMapping("/add") public String addForm() { return "basic/addForm"; } 새로고침 새로고침은 가장 마지막에 요청한 URL 방식을 그대로 반복한다. (Get이던, Post이던) 나쁜 예 @PostMapping("/add") public String addItemV2(@ModelAttribute("item") Item item, Model model) { itemRep..

스프링/MVC 2022.04.24
1 2