Spring/Spring MVC 43

파일 업로드

일반적으로 HTML Form을 통해 파일 업로드 기능을 구현한다. 먼저 HTML Form 전송 방식 두 가지를 알아보자. - application/x-www-form-urlencoded - multipart/form-data application/x-www-form-urlencoded 이 방식은 HTML Form을 서버로 전송하는 가장 기본적인 방법이다. 별도의 "enctype"옵션이 없으면 웹 브라우저는 요청 HTTP 헤더에 아래와 같이 추가한다. Content-Type : application/x-www-form-urlencoded Form에 입력한 데이터를 HTTP Body에 문자로 &로 구분하여 전송하게된다. 파일 업로드를 위해서는 파일은 문자가 아니라 바이너리 데이터를 전송해야하는데 문자를 전송..

Spring/Spring MVC 2021.08.12

Spring Type Converter

문자를 숫자로 변환하거나 숫자를 문자로 변환해야하는 것과 같은 타입을 변환하는 경우가 많다. 예를 들면 아래와 같다. 위와 같이 쿼리스트링으로 넘어온 파라미터를 받고 싶다. 이를 위해 "/hello-v1?data=5"라는 요청을 보내면 getParameter를 통해 값을 받을 수 있다. 하지만 이는 숫자타입가 아니라 문자타입이다(String). 따라서 직접 Integer타입으로 변환하는 과정을 거쳐야한다. 하지만 무의식 중에 우리가 아무렇지 않게 사용하던 @RequestParam을 떠올려보자. @RequestParam Integer data 이와 같이 별도의 타입 변환과정 없이 손쉽게 개발자가 원하는 타입으로 변환된다. 이는 스프링이 중간에서 타입을 변환해주기 때문이다! 이러한 역할을 하는 것이 바로 T..

Spring/Spring MVC 2021.08.03

API 예외 처리

HTML 페이지의 경우에는 4xx, 5xx.html과 같은 오류 페이지만 있으면 대부분의 문제를 해결할 수 있지만, API의 경우에는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야한다. 어떻게 이를 처리할 수 있을까? 먼저 처음으로 돌아가 Servlet 오류 페이지 방식을 사용해보자. api를 처리하는 컨트롤러를 만들고 내부에 static 클래스로 memberDto를 만들어 진행하겠다.(실제 작업시에는 별도로 생성해야함) @RestController이기 때문에 id가 ex가 아니라면 json형식으로 응답이 반환될 것이고 ex라면 RuntimeException이 발생해 오류 페이지를 내부적으로 호출해 반환될 것이다. 먼저 정상 요청이다. 다음으로 런타임에러를 발생시켜본다...

Spring/Spring MVC 2021.07.28

예외 처리, 오류 페이지

Servlet 예외 처리 최종적으로 알고 싶은 것은 스프링의 예외처리이지만, 서블릿 컨테이너위에서 스프링이 돌아가기 때문에 서블릿이 어떻게 예외처리를 하는지부터 알고가자. 스프링이 아닌 순수 Servlet 컨테이너는 예외를 어떻게 처리할까?? Serlet은 2가지 방식으로 예외 처리를 지원한다. - Exception(예외) - response.sendError(HTTP 상태 코드, 오류 메시지) 🔧 Exception 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행되는데, 이 때 예외를 catch하지 못하고 main메서드를 넘어 예외가 throw되면 예외 정보를 남기고 해당 쓰레드는 종료된다. 웹 애플리케이션은 사용자 요청 별로 쓰레드가 할당되고, Servlet 컨테이너 안에서..

Spring/Spring MVC 2021.07.24

필터, 인터셉터

필터는 Servlet이 제공하는 기능이고, 인터셉터는 Spring이 제공하는 기능이다. 요구사항 : 로그인한 사용자만 상품 관리 페이지로 접속할 수 있어야한다. 단순히 상품 관리 컨트롤러에서 로그인 여부를 체크하는 로직을 추가하면 되겠지만 등록/수정/삭제/조회 등 모든 컨트롤러에 추가하는 것은 매우 비효율적이다. 또한 향후에 로직이 변경될 때마다 모든 로직을 다시 수정해야한다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 것을 공통 관심사(Cross-Cutting Concern)라고 한다. 공통 관심사는 스프링의 AOP로도 해결할 수 있지만, 웹과 관련된 공통 관심사는 Servlet의 필터나 Spring의 인터셉터를 사용하는 것이 좋다. 웹과 관련된 공통 관심사를 처리하기 위해서는 HTTP H..

Spring/Spring MVC 2021.07.21

쿠키, 세션

참고 : 패키지 구조 설계 도메인이 가장 중요하다.(도메인 : 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야하는 핵심 비즈니스 영역) domain-webweb을 다른 기술로 바꾸어도 domain은 그대로 유지될 수 있도록 설계해야한다.즉, web은 domain을 알지만 domain은 web을 모르도록..(web을 모두 삭제해도 domain에는 영향이 가지 않게)의존관계는 단방향으로 흐르게 하는 것이 좋다. 2021.07.17 - [Spring] - 패키지 구조 설계 1. 회원 가입 들어온 Form 데이터를 검증하고, Repository에 save를 진행하는 단순한 구조이다. 2. 로그인 파라미터로 들어온 로그인id로 Member 객체를 조회하고 조회된 객체의 password와 파라미터..

Spring/Spring MVC 2021.07.17

Bean Validation

대부분의 특정 필드에 대한 검증 로직은 일반적인 로직이고 공통적이다. 이런 검증 로직을 모든 프로젝트에 적용하도록 공통화, 표준화한것이 바로 Bean Validation!! public class Item { private Long id; @NotBlank private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; @NotNull @Max(9999) private Integer quantity; } Bean Validation이 뭔데? Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준. 검증 애노테이션과 여러 인터페이스의 모음. 이..

Spring/Spring MVC 2021.07.14

Validation

폼 입력으로 들어오는 데이터를 검증하고 만약 오류가 발생했을 때 오류 페이지를 보여주는 것이 아닌 입력한 데이터를 유지한 상태로 어떤 오류가 발생했는지 고객에게 알려주어야한다. 컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지를 검증하는 것이다. 클라이언트 검증은 조작이 가능하다. ==> 보안에 취약 그렇다고 서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다. 둘을 적절히 섞어서 사용해야함. API 방식을 사용해서 검증 오류를 API 응답 결과에 남겨주는 것도 좋은 방법 1. 검증 직접 처리 서버에서 검증 실패가 발생하면 Form에 입력된 데이터와 검증 오류에 대한 결과를 Model에 담아 다시 상품 등록 Form으로 보내준다. 이런 오류 페이지가 띄워지는 것이 아닌 입력한 데이터는 그대로..

Spring/Spring MVC 2021.07.07

메시지, 국제화

메시지란? 만약 상품명이라는 라벨을 상품이름으로 변경하자는 요구사항이 들어왔다고 가정해보자. 이를 위해선 상품명이라고 코딩되어 있는 모든 부분을 찾아서 상품이름으로 고쳐야할 것이다. HTML 파일에 메세지가 하드코딩되어 있기 때문이다. 이런 다양한 메시지를 한 곳에서 관리하는 기능을 메시지 기능이라고 한다. "message.properties"라는 메세지 관리용 파일을 만들어 사용하는 것이다.(key-value) item=상품 item.id=상품 ID item.itemName=상품명 item.price=가격 item.quantity=수량 각 HTML은 key값으로 value를 불러와 사용하면 된다. 물론 하드코딩된 현재 상태에서는 모두 찾아고쳐야 하지만 추후에 비슷한 요구사항이 들어왔을 때에는 메시지 관..

Spring/Spring MVC 2021.07.06

Thymeleaf 파헤치기

Tymeleaf 기본 기능 1. 텍스트 - text, utext Controller에서 매핑하는 과정이나 model에 값을 담는 과정은 생략 일반적으로 태그 내부에서 th:text를 사용하는 방식을 많이 사용하고 태그 내부에서 사용하는 것이 아니라 컨텐츠 안에서 직접 출력을 하고 싶을 때는 위와 같이 [[...]] 대괄호 사이에 모델에 담긴 값을 넣어준다. 참고 : Escape HTML 문서는 같은 특수 문자를 기반으로 정의된다. 따라서 뷰 템플릿으로 HTML 화면을 생성할 때는 출력하는 데이터에 이러한 특수 문자가 있는 것을 주의해서 사용해야 한다. 태그를 사용하여 문자를 강조하고 싶어 위와 같이 코드를 작성하였다면 어떻게 될까? 의도와는 달리 태그가 적용되지 않고 그대로 출력되는 것을 확인..

Spring/Spring MVC 2021.07.01
반응형