Project 준비Thymeleaf 시작하기text VS. utextSpringEL 변수기본 객체날짜 출력하기URL 링크 만들기리터럴연속성 값 설정반복조건부 평가
spring boot 3.0.4group - helloartifact - thymeleaf-basicpackage name - hello.thymeleafjava 17dependenciesspring weblombokvaildthymeleafpostmanhtml set
🔗 공식 사이트🔗 공식 기본 메뉴얼🔗 공식 스프링 통합 매뉴얼타임리프는 백엔드 서버에서 HTML 을 동적으로 렌더링 하는 용도로 사용된다.타임리프는 순수 HTML 을 유지한다.웹브라우저에서 파일을 직접 열어서 확인할 수 있다.서버를 통해 뷰 탬플릿을 거치면서 동적
\[\[ …]] 와 th:text 는 동일한 기능이다.HTML 은 < , > 같은 특수문자를 기반으로 정의 된다.이러한 특징 때문에 출력해야 할 text 가 위치할 부분에 < , > 같은 특수문자가 있을경우 기본적으로 Escape 가 작동된다.Escape 가
변수 표현식${...}이 외에도 다양한 변수 표현 방법이 제공된다.Controller객체, list, map 3가지 참조타입을 model 에 넘겨주었다.Web출력 확인 \- 개인적으로 각 첫번째 방법이 가장 사용하기 편해보인다.thymeleaf 문법으로도 지역변수
Controller 에서 Model 에 넘겨주지 않아도자주 사용하는 객체는 Thymeleaf 에서 기본적으로 제공해주고있다.session 을 생성하고 별도로 Model 로 넘겨주지 않아도 Web 계층에선 Session 을 사용할 수 있다.Configuration 계층이
기본 출력2023-03-23T21:08:47.909373포맷 2023-03-23 21:08:47 날짜 확인${- 개월 확인${- 개월 + 월${ - ${- 연도 확인${- 주차 확인${- 요일 확인${- 요일 + 요일${- 시간 확인${- 분 확인${- 초 확
매개변수 1 과 2 를 넘겨줌기본 정적 링크/helloQuery Parameter 방식/hello?paramA=data1¶mB=data2링크 뒤에 괄호 ( ) 를 열어 안에 파라미터명과 객체를 입력해준다.Pathvaliable 방식/hello/data1/data2/ 로
⚠️ th:text 대신 \[…] 를 사용해도 전부 정상 작동 된다.소스코드상에서 고정된 값을 말하는 용어이다.“Hello” 는 문자 리터럴10, 20 은 숫자 리터럴이 외에도 Boolean 과 null 이 존재한다.Thymeleaf 에서 문자 리터럴은 작은따옴표 ‘
⚠️ th:text 대신 \[…] 를 사용해도 전부 정상 작동 된다.기본적인 산술 연산은 다른 언어와 동일하게 작동된다.일반적인 비교연산자 뿐 아니라 Unescape 표기도 인식된다.java 의 삼항 연산자와 구조가 동일하다.변수의 data 가 없을경우 작동된다.조건식
thymeleaf 의 속성이 있을경우 기본 속성을 삭제하고 th 속성이 작동된다.예제에서는 mock 이 삭제되고 useerA 로 실행됨attrappend기존 class 값인 “text” 에 ‘ large’ 를 더해 “text large” 로 실행됨attrprependa
HTML tabletr = rowth = column name (meta 정보)td = dataeachth:each=”index : Collection”td 에 해당하는 부분이 반복의 대상이 될 수 있게 구현 해준다.Collection 의 다양한 속성을 확인할 수 있음
조건이 false 라면 해당 tag 가 생략되어버림lt = >조건이 true 라면 해당 tag 가 생략되어 버림if 문과 완전히 반대의 기능ge = <변수의 값과 case 의 값이 일치할 경우에 tag 가 실행된다.\* 은 앞의 case 에 아무것도 해당되지 않는
<th:block> 은 HTML 이 아닌 Thymeleaf 의 고유한 태그 기능이다.다수의 div 태그 반복 같이 each 문 만으로 해결하기 어려울 때 사용된다.div 태그 2개를 한번에 반복시켜야 될 경우 each 문 만으로는 작업이 어렵다.block 을 사용
Thymeleaf 내에서 자바스크립트를 편리하게 사용할 수 있는 기능아래의 태그 내에서는 javascript 문법을 사용할 수 있다.scriptString 타입일 경우 “ “ 를 붙여주어야 변수 선언이 가능하다.아래의 예시의 username 은 String 타입이기 때
html 의 공통된 상단, 하단, 카테고리 로직이나 페이지마다 반복해서 사용해야되는 기능들을 method 를 호출하듯 파일을 나누어 참조시킬 수 있는 기능이다.fragment 생성th:\*\*\*fragment="이름"\*\*\* 의 형태로 사용할 수 있다.태그 내의
fragment 는 변수, 객체 뿐 아니라 html 의 tag 도 넘겨줄 수 있다.생성 방법은 일반적인 fragment 생성방법과 동일하다.매개변수는 th:옵션="${매개변수}" 의 형태로 사용할 수 있다.옵션 은 fragment 의 호출방법인 replace, inse
flagment 를 활용하면 html 전체를 레이아웃을 만들어 호출시키고,수정되는 data 를 처리하는 부분만으로 쉽게 페이지를 구현시킬 수 있게된다.헤더, 푸터, 컨텐츠 등 각각을 fragment 로 만들면 application 을 다체롭게 만들 수 있겠지만 유지보수
🔗 git repository판매 여부 - Boolean 으로 구현 🔗판매 오픈 여부체크 박스로 선택할 수 있다.등록 지역 - List 로 구현 🔗서울, 부산, 제주체크 박스로 다중 선택할 수 있다.상품 종류 - enum 으로 구현 🔗도서, 식품, 기타라디오 버
POST 요청을 하기 위한 입력폼Controller 계층단순 요청 url 을 form 으로 전달해주는 역할만 수행Web 계층thymeleaf 기능을 사용하지 않고 순수 html 의 기능이 사용되고 있음Controller 계층model 에 빈 Item 객체를 넘겨줌Web
🔗 요구사항 확인하기요청이 정상적으로 도착됬는지 확인하기 위해 로그를 만들어준다.intput 타입을 체크박스로 설정 후 Label 로 항목을 만들어주었다.name 속성인 open 은 Itme 에 판매여부 필드와 연결된다.체크박스 체크상품 등록에서 체크박스에 체크 후
🔗 요구사항 확인배송 가능지역을 멀티 체크박스기능을 사용해 구현해야 한다.순서를 보장받기 위해 LinkedHashMap 을 사용했다.@ModelAttribute이 어노테이션이 선언된 method 를 생성하면 해당 Controller 내의 모든 매핑 Method 의 m
🔗 요구사항 확인하기enum 에 선언한 data 들을 배열로 변경해 model 로 넘겨준다.🔗 멀티 체크박스멀티 체크박스와 거희 비슷하다.th:fieldentity 의 필드th:valueenum 의 배열th:textenum 에 설정했던 discription멀티 체크
🔗 요구사항 확인DeliveryCode 를 필드값을 넣어 생성해 List 에 add 하고 model 에 넘겨준다.select box 는 select 라는 태그를 제공하고 있다.select 태그 내의 option 태그를 사용해 원하는 항목을 랜더링 할 수 있다.opti
🔗 git repository
화면에 랜더링 된 text 를 변경해야 될 경우상품명 → 상품 이름프로젝트의 규모가 클 수록 변경해야 하는 text 가 많아지고,실수로 바꿔선 안되는 text 를 바꿔버려 예외가 발생할 수도 있다.메시지 관리란 이러한 text 들을 별도의 파일에서 관리하는 방법을 뜻한
Spring 이 제공하는 메시지 관리기능을 사용하려면 MessageSource 를 Spring Bean 에 등록해야 한다.사실 수동으로 등록하지 않아도 이미 Spring 이 애초에 기본적으로 등록시켜 두었다.application.properties 에 basename
🔗 Spring Message Source 설정⚠️ 한글 깨짐 현상 해결방법MessageSource 를 사용해 등록한 메시지를 확인할 수 있다.첫번째 Param - code메시지 파일에 등록한 코드 (변수)두번째 Param - args파일에 설정한 파라미터를 args
message.properties메시지 기능은 아주 많이 사용되는 기능이기 때문에 Thymeleaf 에서 기본적으로 제공해주는 기능이다. \-...\` 에 메시지 코드를 넣어주면 랜더링 할 때 메시지로 변환시켜준다.파라미터를 사용할 경우 괄호 ( ) 안에 값을 넣어
🔗 git repository⚠️ HTTP 요청이 정상인지 검증하는 것은 Controller 의 중요한 역할중 하나이다.클라이언트 검증은 조작이 가능하기 때문에 보안에 취약하다.서버 검증은 즉각적인 고객 피드백이 어럽다.두가지를 적절하게 섞어서 사용하고, 최종적으로
🔗 검증 요구사항검증 요구사항에 있었던 조건을 if 문을 사용해 controller 에 구현했다.Map 을 사용해 key 는 오류 코드 , value 는 클라이언트에게 보여줄 안내 메시지를 적는다.이렇게 까지만 구현하고 실행해보면 조건을 만족하지 못한 등록은 다시 폼
🔗 요구사항 확인BindingResultSpring 에서 제공하는 validation 라이브러리Map 의 기능을 BindingResult 이 대신할 수 있으므로 Map 은 삭제한다.검증을 통과하지 못할경우 BindingResult 에 error 를 추가해준다.Mode
🔗 요구사항 확인BindingResult 를 적용하면 Controller 에 별도의 로직을 추가하지 않아도 type 을 잘못 요청할경우 기본적으로 에러메시지를 출력해준다.Entity 나 DTO 에서 type 문제가 발생할경우 에러를 발생시키지 않고 BindingRes
🔗 요구사항 확인지난 포스트까지 구현하면 검증에 실패할경우 클라이언트에게 문제점을 표시해줄 수 있지만,클라이언트가 입력했던 data 들이 전부 지워지는 문제가 있었다.FieldError 의 생성자는 기존에 사용한 생성자 외에 다른 생성자도 존재한다.두번째 세번째 Pa
🔗 요구사항 확인🔗 메시지와 국제화🔗 메시지파일지금까지 구현한 로직의 에러 메시지는 검증 로직마다 그때그때 개발자가 입력했다.이 방법은 개발자가 직접 입력해줘야 되기 때문에 신경쓰지 못하면 메시지의 일관성이 떨어지게 된다.메시지 파일에 에러 메시지를 등록해 일관화
🔗 요구사항 확인addError 의 첫번째 Param 은 BindingResult 의 Object 값을 입력하는 자리이다.하지만 사실 BindingResult 는 바인딩 해야할 Object 를 이미 알고있다.BindingResult 가 꼭 대상으로 하는 Object
오류코드를 너무 세밀하게 정리하면 클라이언트에게 디테일한 메시지를 전달할 수 있지만 범용성이 낮아진다.반대로 단순하게 정리하면 범용성이 좋아 여러곳에서 사용할 수 있지만,메시지를 세밀하게 작성하기 어려워진다.실무에서는 기본적으로 단순하게 메시지를 정리하다가,세밀하게 작
반대로 MessageCodesResolver 인스턴스를 생성해 오류코드를 조회해서 원리를 알아볼 수 있다.메시지 코드와 Object (객체) 명을 입력하면 메시지 코드와 객체를 조합한 오류코드가 생성된다.출력물 확인배열 변수를 for 문을 통해 인자를 확인하면 메시지
🔗 오류코드 설계🔗 Message Codes Resolver오류코드에 입력된 코드중 가장 세밀한 코드부터 실행이 된다.level 1 ~ level 4 순서낮은 level 을 주석처리 하면서 확인 해볼수 있다.
개발자가 직접 정의한 오류코드rejectValue() 를 직접 호출Spring 이 직접 검증 오류에 추가한 오류 코드type 오류가 여기에 해당됨type 이 일치하지 않아 오류가 발생될 경우,콘솔을 확인하면 어떤 오류코드가 실행됬는지 확인할 수 있다.메시지를 잘 보면
지금까지 구현한 V2 의 method 는비지니스 로직보다 검증로직의 길이가 더 길어 유지보수성이 매우 떨어진다.검증만 담당하는 별도의 객체를 생성해 Controller 의 검증 로직을 분리시킬 수 있다.@Component 로 Spring Bean 으로 등록Validat
@InitBinder해당 Controller 로 url 이 매핑되면 어노테이션이 선언된 method 가 실행된다.Spring 내부적으로 생성된 WebDataBinder 를 매개변수로 받아서 Controller 의 매핑 method 가 실행되기전 검증을 수행 해준다.🔗