스킵스세팅Gradle -> IntelliJ IDEAPlugin -> Lombok 체크Annotation Processors -> 체크공식 사이트: https://www.thymeleaf.org/공식 메뉴얼 - 기본 기능: https://www.thym
먼저 컨트롤러를 만들어주고그거에 맞는 html 파일을 만들어준다.두가지 방식이 있는데th:text="${data}" 를 이용해 텍스트를 출력하는 방법과\[${data}]를 이용해 내용을 출력하는 방법이 있다.각각 data에 잘 들어간 것을 확인할 수 있다.이번에는 컨트
이번에는 타임리프에 오브젝트, List, Map을 어떻게 사용할 수 있는지 알아보자일반 오브젝트일 경우th:text="${user.username}"th:text="${user\['username']}"th:text="${user.getUsername()}"이렇게 3개
타임리프는 가져와 표현할 수 있는 객체들이 있다.기본 객체들을 제공한다.
타임리프 유틸리티 객체들 #message : 메시지, 국제화 처리 #uris : URI 이스케이프 지원 #dates : java.util.Date 서식 지원 #calendars : java.util.Calendar 서식 지원 #temporals : 자바8 날짜 서식
param1 - data1param2 - data2일반 urlth:href="@{/hello}"파라미터 값 넣기th:href="@{/hello(param1=${param1}, param2=${param2})}"/hello?param1=data1&param2=da
리터럴은 고정된 값이다.타임리프는 문자, 숫자, 불린, null 리터럴이 있다.타임리프 문자 리터럴은 항상 작은 따옴표(')를 감싸야 한다.<span th:text="'hello'">생략할 수도 있긴하다. 공백없이 쭉 이어지고 아래의 룰이 있다면 작은 따옴표를 생
th:text="10+2"12th:text="10 % 2 == 0"true일반 자바와 똑같이 동작하므로 엔티티만 조심하면 사용할 수 있다.\> gt< lt\>= ge<= le! not== eq!= neq, neth:text="(10 % 2 == 0)?'짝수'
먼저 th:\* 속성이 들어있다면 해당 속성이 이전에 있다고 해도 덮어씌워진다.name="mock" th:name="userA"의 경우name="userA"로 덮어씌워진다.class="text" th:attrappend="class=' large'"클래스 뒤에 lar
반복 사용을 위해 데이터를 따로 넣어준다.th:each="user : ${users}"반복기능이다. 이건 잘 알고 있기 때문에 따로 설명은 패스th:each="user, userStat : ${users}"반복을 할때 그 상태까지 가져와준다.생략이 가능한데 생략하면 (
if는 조건이면unless는 조건이 아니면th:case="조건"조건이면 실행th:case="\*"위 케이스에 해당이 없으면
일반 주석이다. 웹 페이지에서 안보이고 소스코드에서 보인다.웹 페이지에서 안보이고 소스코드에서도 안보인다.일반 파일로 웹 페이지에서 열었을때 소스코드에서 안보이고 값도 안나온다.서버에서 랜더링 된 값이 들어올 경우웹 페이지에서 보이고 소스코드에서도 보인다. 잘 안쓴다.
<th:block><div>를 여러개 묶어서 th:each돌리고 싶을때 많이 사용한다.웹에서 실행될때 <th:block>은 사라진다.
<script th:inline="javascript">var username = \[\[${user.username}]];인라인 사용전 -> var username = userA;인라인 사용후 -> var username = "userA";인라인은 안에 쌍 따움
fragmentMain.html -> <div th:insert="~{template/fragment/footer :: copy}"></div>footer.html -> <footer th:fragment="copy"><div> 안에 파일 내용을
과정을 보면 layoutMain.html에서 title태그와 link태그를 base.html로 보낸다. 그러면 base.html에서 th:replace인 곳에 각각 title과 link가 교체된다. 그리고 교체된 전체를 layoutMain.html에서 교체된다. 어우
스프링의 SpringEL 문법 통합${@myBean.doSomething()}처럼 스프링 빈 호출 지원편리한 폼 관리를 위한 추가 속성th:object, th:field, th:errors, th:errorclass폼 컴포넌트 기능스프링의 메시지, 국제화 기능의 편리한
addForm.htmlth:object를 지정하면 커맨드 객체를 지정할 수 있다.th:field 는 id, name, value를 자동으로 지정해준다.랜더링 전랜더링 후editForm.html하지만 현재는 편리한 기능이 크게 있는지 알기 어려울 수 있다.이 기능은 이후
타임리프를 사용해서 폼에서 체크박스, 라디오 버튼, 설렉트 박스를 편리하게 사용하는 방법을 알아본다.판매여부판매 오픈 여부체크 박스로 선택등록지역서울, 부산, 제주체크 박스로 다중 선택 가능상품 종류도서, 식품, 기타라디오 버튼으로 하나만 선택배송 방식빠른 배송일반 배
mvc 2 안에서 message-start 폴더에 있는 프로젝트를 활용한다.메시지와 국제화만을 다루기 위해서 이전에 다뤘던 설렉트 박스, 라디오 박스 없는 버전으로 사용한다.여러 화면에서 보이는 상품명, 가격, 수량 등, label 에 있는 단어를 변경하려면 다음 화면
요구사항: 검증 로직 추가타입 검증가격, 수량에 문자가 들어가면 검증 오류 처리필드 검증상품명: 필수, 공백X가격: 1000원 이상, 1백만원 이하수량: 최대 9999특정 필드의 범위를 넘어서는 검증가격 \* 수량의 합은 10,000원 이상아무튼 잘못 입력된 값에 대한
/mvc2/validation 프로젝트를 이용한다.하고 싶은 로직은 간단하게 컨트롤러에서 검사를 하여 조건에 맞지 않는 값이 들어오면 addForm.html을 다시 보여주는 로직을 짜고 싶은 것이다.직접 에러를 입력하는 방법은 간단하다.Item에 입력된 값을 직접 가져
스프링이 제공하는 검증 오류 처리 방법중에 BindingResult를 이용해서 처리한다.BindingResult를 사용하면서 가장 중요한것은BindingResult bindingResult 파라미터 위치는 @ModelAttribute Item item 다음에 와야 한다
FieldErrors, ObjectError의 생성자는 errorCode, arguments를 제공한다. 이것은 오류 발생시 오류 코드로 메시지를 찾기 위해 사용된다.이전에 작성했던 messages.properties에 추가해도 되긴 하는데 구분을 위해서 파일을 추가하
지금까지 컨트롤러에 검증을 일일이 검사했다면,이번에는 이 검증을 한 곳에서 몰아서 해볼거다.여기서 Validator 인터페이스를 이용한다.인터페이스이므로 이를 상속받는 클래스를 만든다.쉽게 말해 파라미터로 넘어오는 클래스가 아이템 타입과 같은지 검사하는 것이다.isAs
특정한 구현체가 아니고, Bean Validation 2.0(JSR-380)이라는 기술 표준이다. 쉽게 이야기해서 검증 어노테이션과 여러 인터페이스의 모음이다.공식 사이트 : http://hibernate.org/validator/공식 메뉴얼 : https&#
시작하기 위해서 build.gradle에 아래를 추가해줘야한다.implementation 'org.springframework.boot:spring-boot-starter-validation'검증기 생성이후 스프링이랑 통합하면 안쓰니까 그냥 이렇게 사용하는구나 정도만
V2의 버전을 V3로 바꾸기 위해 좋은 단축키가 있다.이렇게 v3 폴더를 클릭한 상태에서cmd + shift + r을 누르면이렇게 특정 단어를 다른 단어로 바꿔주는 명령을 실행할 수 있다.스프링 MVC는 어떻게 Bean Validator를 사용할까스프링 부트가 spri
Been Validation이 에러 코드가 어떻게 생성되는지 확인해보자Field error in object 'item' on field 'itemName': rejected value \[]; codes \[NotBlank.item.itemName,NotBlank.i
만약 FieldError가 아닌 ObjectError의 경우는 어떻게 처리할 수 있을까?@ScriptAssert()를 사용하면 된다.근데 제약이 많기 때문에 오브젝트 오류의 경우 @ScriptAssert를 억지로 사용하기 보다는 자바 코드로 Validator를 이용해서
editForm.html
아이템을 추가할때와 수정할때 요구사항이 다르게 된다면,등록시 요구사항타입검증가격, 수량에 문자가 들어가면 검증 오류 처리필드 검증상품명: 필수, 공백X가격: 1000원 이상, 1백만원 이하수량: 최대 9999특정 필드의 범위를 넘어서는 검증가격 \* 수량의 합은 10,
아이템을 추가할때와 수정할때 요구사항을 따로 적용하는 방법은 두가지가 있다.Bean Validation의 groups 기능을 사용한다.Item을 직접 사용하지 않고, ItemSaveForm, ItemUpdateForm 같은 폼 전송을 위한 별도의 모델 객체를 만들어서
이전에 말했지만, 실무에서는 groups 기능을 잘 사용하지 않는다.이유는 보통 등록할때 받는 정보와 수정할때 받는 정보가 다른 경우가 많기 때문이다.장단점 또한 살펴보자폼 데이터 전달에 Item을 사용하면HTML Form -> Item -> Controller ->
@Valid, @Validated는 HttpMessageConverter(@RequestBody)에도 적용할 수 있다.현재 타입을 String으로 바꾸니 컨트롤러에도 못들어가는 것을 확인할 수 있다. 그 이유는 ItemSaveForm 객체를 만들지 못했기 때문에다. 이
홈 화면 - 로그인 전회원 가입로그인홈 화면 - 로그인 후본인 이름(누구님 환영합니다.)상품 관리로그아웃보안 요구사항로그인 사용자만 상품에 접근하고, 관리할 수 있음로그인 하지 않은 사용자가 상품 관리에 접근하면 로그인 화면으로 이동회원가입, 상품 관리hello.log
로그인 안한 회원이 상품 등록페이지에 들어가면 안된다.이렇게 어플리케이션 여러 로직에서 공통으로 관심이 있는 것을 공통 관심사(cross-cutting, concern)라고 한다. 여기서는 등록, 수정, 삭제, 조회 등등 여러 로직에서 공통으로 인증에 대해서 관심을 가
생략Exception(예외)response.sendError(HTTP 상태코드, 오류 메시지)자바 직접 실행main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료된다.웹 애플리케이션웹애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고,
이전 내용에서 HTML 페이지에서 예외가 발생했을 경우 어떻게 처리해야 하는지 알아봤다. 4xx, 5xx와 같은 오류 페이지만있으면 대부분의 문제를 해결할 수 있었다.그런데 API의 경우 그러니까 기업과 기업 사이의 주고받는 데이터나, 앱에서 API를 호출하는 경우 등
생략문자를 숫자로 변환하거나, 반대로 숫자를 문자로 변환해야 하는 것 처럼 어플리케이션을 개발하다 보면 타입을 변환해야 하는 경우가 상당히 많다.위의 경우 파라미터를 받을때 문자로 받는 것을 확인할 수 있다.따라서 요청 파라미터를 자바에서 다른타입으로 변환해서 사용하고
타임리프는 ${{...}} 를 사용하면, 자동으로 컨버전 서비스를 사용해서 변환해준다.실행하게 되면 이와 같이 뷰에서 컨버터를 호출하는 것을 확인할 수 있다.${{number}} : 뷰 템플릿은 데이터를 문자로 출력한다. 따라서 컨버터를 적용하게 되면 Integer 타
웹 어플리케이션에서 객체를 문자로, 문자를 개체로 변환하는 예화면에 숫자를 출력해야 하는데, Integer -> String 출력 시점에 1000 -> "1,000" 이렇게 쉼표를 넣거나, 반대로 "1,000" -> 1000 와 같이 변경해야 할 때가 많다.날짜의 경우
일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면 먼저 폼을 전송하는 다음 두 가지 방식의 차이를 이해해야 한다.HTML 폼 전송 방식application/x-www-form-urlencodedmultipart/form-dataapplication/