본문 바로가기

Spring/MVC

(41)
[Spring MVC] Thymeleaf - 체크박스 이전 장(링크) 에서는 타임리프의 스프링 통합 기능 중 입력 폼에 대해서 알아보았다. 이번 장에서는 통합 기능 중 체크박스에 대해서 알아본다. 모든 코드는 깃 허브(링크) 에 올려두었다. Checkbox Java Files 예제를 만들기 위한 Class, Enum 파일들을 살펴본다. ItemType @Getter @RequiredArgsConstructor public enum ItemType { BOOK("도서"), FOOD("음식"), ETC("기타"); private final String description; } DeliveryCode @Data @AllArgsConstructor public class DeliveryCode { private String code; private String ..
[Spring MVC] Thymeleaf - 입력 폼 이번 장에서는 타임리프의 스프링 통합 기능 중 입력 폼에 대해서 알아본다. 모든 코드는 깃 허브(링크) 에 올려두었다. 개요 타임리프는 크게 기본 메뉴얼과 스프링 통합 메뉴얼 2가지 메뉴얼을 제공한다. 타임리프는 스프링 없이도 동작하지만, 스프링과 통합을 위해 다양한 기능을 제공하며 이러한 이유로 많은 백엔드 개발자가 타임리프를 선택하고 있다. 스프링 통합으로 인해 추가되는 기능은 아래와 같다. 스프링의 SpringEL 문법 ${@myBean.doSomething()}처럼 스프링 빈 호출 지원 편리한 폼 관리를 위한 추가 속성 th:object th:field, th:errors, th:errorclass 폼 컴포넌트 기능 checkbox, radio button, List등을 편리하게 사용할 수 있는 ..
[Spring MVC] Thymeleaf - Fragment & Layout 이번 장에서는 타임리프의 템플릿 조각과 레이아웃 기능에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃 허브(링크) 에 올려두었다. 개요 웹 페이지를 개발할 때 페이지마다 중복되는 공통 영역들이 많이 있다. 상단 영역이나 하단 영역등등 여러 페이지에서 함께 사용하는 영역들이 있다. 이런 부분을 코드를 복사해서 사용한다면 변경 시 여러 페이지를 다 수정해야 하므로 비효율 적이다. 타임리프는 이러한 문제를 해결하기 위해 템플릿 조각(Template Fragment)과 레이아웃(Layout)기능을 지원한다. Fragment 예시 Controller @GetMapping("/fragment") public String f..
[Spring MVC] Thymeleaf - Other Function 이전 장(링크) 에서는 타임리프의 텍스트와 표준 표현식 구문에 대해서 알아보았다. 이번 장에서는 그 이외의 기능들에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃 허브(링크) 에 올려두었다. Attribute 타임리프는 주로 HTML 태그에 th:* 속성을 지정하는 방식으로 동작한다. th:*로 속성을 적용하면 기존 속성을 대체하며 기존 속성이 없는 경우 새로 만든다. 예제 Controller @GetMapping("/attribute") public String attribute() { return "basic/attribute"; } attribute.html 속성 설정 속성 추가 - th:attrappend..
[Spring MVC] Thymeleaf - Text & Expression 이번 장에서는 타임리프의 텍스트와 표준 표현식 구문에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃 허브(링크) 에 올려두었다. 개요 타임리프는 서버에서 HTML 파일을 동적으로 렌더링해주는 SSR(Server Side Rendering) 용도로 사용된다. 네츄럴 템플릿으로 순수 HTML을 최대한 유지하는 특징이 있다. 순수하다는 의미는 타임리프로 작성한 파일이 HTML을 유지하기 때문에 웹 브라우저에서 파일을 직접 열어도 내용을 확인할 수 있다는 의미이다. 또한 서버를 통해 뷰 템플릿을 거치면 동적으로 변경된 결과를 확인할 수 있다. JSP와 유사한 템플릿은 생성된 웹 브라우저를 통해 소스코드를 확인해보면 HT..
[Spring MVC] PRG 이번 장에서는 PRG(Post/Redirect/Get)에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브(링크)에 올려두었다. PRG(Post/Redirect/Get) 상품을 등록하는 폼 화면이 있고 클라이언트가 저장을 누르면 상품을 저장하는 POST API를 호출한다고 가정해본다. 이러한 구조에서 상품을 등록하고 클라이언트가 새로고침을 누른다면 지속적으로 새로운 상품이 등록될 것이다. API를 요청하는 방식이 아니라 상품 상세 화면을 렌더링하면서 폼 데이터를 전송하고 전송된 데이터를 기반으로 새로운 아이템을 생성하기 때문이다. 클라이언트가 상품을 등록했으면 더 이상 상품을 등록하지 못하게 하도록 상품 상세 화..
[Spring MVC] Handler Adapter 이전 장(링크)에서는 HTTP 메시지 컨버터가 어떠한 역할을 하는지에 대해서 알아보았다. 이번 장에서는 HTTP 메시지 컨버터가 어떠한 방식으로 작동하는지에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브(링크)에 올려두었다. RequestMapping 핸들러 어댑터 우리는 이전에 스프링 MVC가 아래의 이미지와 같은 구조로 작동하는 것을 확인하였다. 그림에는 보이지 않는 듯 하지만 핸들러 어댑터, @RequestMapping 애노테이션 기반의 핸들러를 처리하는 RequestMappingHandlerAdapter가 처리한다. ArgumentResolver 애노테이션 기반의 컨트롤러는 HttpServletRequ..
[Spring MVC] HTTP Message Converter 이번 장에서는 스프링 MVC의 메시지 컨버터에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브(링크)에 올려두었다. HTTP 메시지 컨버터 우리는 지금까지 요청을 받았을 때 HTTP 메시지를 직접 받아서 파싱한 것이 아니라 HttpServletRequest나 우리가 만든 클래스의 객체를 전달받았다. 또한 데이터를 반환할 때 HTTP 메시지를 만들어서 클라이언트에게 반환한 것이 아니라 HttpServletResponse나 우리가 만든 객체를 반환했다. 그렇다면 결국 스프링이 우리가 모르는 사이에 HTTP 메시지를 컨버팅 해준다는 것이 된다. 바로 이러한 역할을 하는 것이 스프링의 HTTP 메시지 컨버터다. 클라이..