Spring 14

[Spring]파일 업로드 기능 알아보기

파일 업로드 소개 일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면 먼저 폼을 전송하는 다음 두 가지 방식의 차이를 이해해야 한다. HTML 폼 전송 방식 application/x-www-form-urlencoded multipart/form-data application/x-www-form-urlencoded 방식은 HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법이다. Form 태그에 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 헤더에 다음 내용을 추가한다. Content-Type: application/x-www-form-urlencoded 그리고 폼에 입력한 전송할 항목을 HTTP Body에 문자로 username=kim&age=20 와 같이..

Spring 2022.06.08

[Spring]스프링 타입 컨버터 자세하게 파악해보기

스프링 타입 컨버터 소개 문자를 숫자로 변환하거나, 반대로 숫자를 문자로 변환해야 하는 것 처럼 애플리케이션을 개발하다 보면 타입을 변환해야 하는 경우가 상당히 많다. 다음 예를 보자. HelloController - 문자 타입을 숫자 타입으로 변경 @RestController public class HelloController { @GetMapping("/hello-v1") public String helloV1(HttpServletRequest request) { String data = request.getParameter("data");//문자 타입 조회 Integer intValue = Integer.valueOf(data); //숫자 타입으로 변경 System.out.println("intVa..

Spring 2022.06.08

[Spring]API 예외 처리 적용해보기

API 예외 처리는 어떻게 해야할까? HTML 페이지의 경우 지금까지 설명했던 것 처럼 4xx, 5xx와 같은 오류 페이지만 있으면 대부분의 문제를 해결할 수 있다. 그런데 API의 경우에는 생각할 내용이 더 많다. 오류 페이지는 단순히 고객에게 오류 화면을 보여주고 끝이지만, API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다. 지금부터 API의 경우 어떻게 예외 처리를 하면 좋은지 알아보자. API도 오류 페이지에서 설명했던 것 처럼 처음으로 돌아가서 서블릿 오류 페이지로 방식을 사용해보자. WebServerCustomizer @Component public class WebServerCustomizer implements WebServerFactoryCus..

Spring 2022.06.08

[Spring]예외 처리와 오류 페이지 적용해보기

서블릿 예외 처리 - 시작 스프링이 아닌 순수 서블릿 컨테이너는 예외를 어떻게 처리하는지 알아보자. 서블릿은 다음 2가지 방식으로 예외 처리를 지원한다. Exception (예외) response.sendError(HTTP 상태 코드, 오류 메시지) Exception(예외) 자바 직접 실행 자바의 메인 메서드를 직접 실행하는 경우 main 이라는 이름의 쓰레드가 실행된다. 실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료된다. 웹 애플리케이션 애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다. 애플리케이션에서 예외가 발생했는데, 어디선가 try ~ catch로 예외를 잡아서 처리하면 아..

Spring 2022.06.08

[Spring]필터, 인터셉터 적용해보기

애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것을 공통 관심사(cross-cutting)라고 한다. 등록, 수정, 삭제, 조회 등등 여러 로직에서 공통으로 인증에 대해서 관심을 가지고 있다. 이러한 공통 관심사는 스프링의 AOP로도 해결할 수 있지만, 웹과 관련된 공통 관심사는 지금부터 설명할 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다. 웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더나 URL의 정보들이 필요한데, 서블릿 필터나 스프링 인터셉터는 HttpServletRequest 를 제공한다. 서블릿 필터 필터는 서블릿이 지원하는 수문장이다. 필터의 특성은 다음과 같다 필터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 필터를 적용하면 필터가 호출 된 ..

Spring 2022.06.08

[Spring]쿠키, 세션 사용해보기

일단 쿠키만 사용해서 로그인, 로그아웃 기능을 구현해볼 것이다. 로그인 상태 유지하기 로그인의 상태를 어떻게 유지할 수 있을까? 쿼리 파라미터를 계속 유지하면서 보내는 것은 매우 어렵고 번거로운 작업이다. 쿠키를 사용해보자. 서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달하자. 그러면 브라우저는 앞으로 해당 쿠키를 지속해서 보내준다. 쿠키에는 영속 쿠키와 세션 쿠키가 있다. 영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지 세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시 까지만 유지 브라우저 종료시 로그아웃이 되길 기대하므로, 우리에게 필요한 것은 세션 쿠키이다. //쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료) Cookie idCookie = ne..

Spring 2022.06.07

[Spring]Bean Validation 사용해보기

Bean Validation 이란? 먼저 Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준이다. 쉽게 이야기해서 검증 애노테이션과 여러 인터페이스의 모음이다. 마치 JPA가 표준 기술이고 그 구현체로 하이버네이트가 있는 것과 같다. Bean Validation을 구현한 기술중에 일반적으로 사용하는 구현체는 하이버네이트 Validator이다. 이름이 하이버네이트가 붙어서 그렇지 ORM과는 관련이 없다. 검증 기능을 지금처럼 매번 코드로 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다. 다음 코드를 보자. public class Ite..

Spring 2022.06.07

[Spring]Validation 사용해보기

컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것이다. 그리고 정상 로직보다 이런 검증 로직을 잘 개발하는 것이 어쩌면 더 어려울 수도 있다. 클라이언트 검증과 서버 검증 클라이언트 검증은 조작할 수 있으므로 보안에 취약하다. 서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다. 둘을 적절히 섞어서 사용하되, 최종적으로 서버 검증은 필수다. API 방식을 사용하면 API 스펙을 잘 정의해서 검증 오류를 API 응답 결과에 잘 남겨주어야 한다. 먼저 검증을 직접 구현해보고, 뒤에서 스프링과 타임리프가 제공하는 검증 기능을 활용해보자. 검증 직접 처리 @PostMapping("/add") public String addItem(@ModelAttribute Item item, Redi..

Spring 2022.06.07

[Spring]메세지, 국제화 사용해보기

메세지 메세지는 하드코딩되어 있는 메세지들을 한 곳에서 관리하도록 관리 하는 기능을 한다. 수십페이지에서 동일한 메세지를 사용하고 있고 그 부분에 변경사항이 일어나면 일일이 변경해줘야하는 번거로움을 줄이고자 메세지로 따로 관리하는 것이 좋다. 예를 들어서 messages.properties 라는 메시지 관리용 파일을 만들고 item=상품 item.id=상품 ID item.itemName=상품명 item.price=가격 item.quantity=수량 각 HTML들은 다음과 같이 해당 데이터를 key 값으로 불러서 사용할 수 있다. 상품명 국제화 메세지에서 한 발 더 나아가서 메세지 파일을 각 나라별로 별도로 관리하면 서비스를 국제화할 수 있다. 예를 들어서 다음과 같이 2개의 파일을 만들어서 분류한다. m..

Spring 2022.06.06

Thymeleaf의 개념과 문법 정리

타임리프의 개념 타임리프는 HTML, XML, JavaScript, Css 및 일반 텍스트를 처리 할 수 있는 웹 및 독립형 환경에서 사용할수 있는 Java 템플릿 엔진이다. Thymeleaf는 html파일을 가져와서 파싱해서 분석 후 정해진 위치에 데이터를 치환해서 웹페이지를 생성한다. 타임리프는 JSP와는 다르게 네츄럴 템플릿이다. 타임리프로 작성한 파일은 HTML을 유지하기 때문에 웹 브라우저에서 파일을 직접 열어도 내용을 확인할 수 있다. JSP를 포함한 다른 뷰 템플릿들은 해당 파일을 웹 브라우저에서 열면 JSP 코드와 HTML이 뒤죽박죽 섞여서 정상적인 결과를 확인할 수 없다. 순수 HTML을 그대로 유지하면서 뷰 템플릿도 사용할 수 있는 타임리프의 특징을 네츄럴 템플릿이라 한다. 타임리프 기..

Spring 2022.06.06