- 자바에서 사용할 때는 서버 템플릿 엔진으로, 자바 스크립트에서 사용할 때는 클라이언트 템플릿 엔진으로 사용 가능
- 자바 단 : JSP, Velocity, Freemarker, Thymeleaf등
- 각각의 단점
- JSP, Velocity : 스프링 부트에서는 권장 X
- Freemaker : 템플릿 엔진으로는 기능이 과함. 자유도가 높지만 숙련도가 낮을수록 Freemaker안에 비지니스 로직이 추가 될 확률이 높음
- Thymeleaf : 스프링 진영에서 적극적으로 밀지만 문법이 어려움.
HTML 태그에 속성으로 템플릿 기능을 사용하는 방식이 허들로 느껴지기도 함.- Mustache의 장점
- 문법이 심플
- 로직 코드를 사용할 수 없어 View의 역할과 서버의 역할이 명확히 분리됨
- Mustache.js와 Mustache.java 2가지가 모두 존재해서 하나의 문법으로 클라이언트/서버 둘다 사용 가능
build.gradle (의존성 추가)
compile('org.springframework.boot:spring-boot-starter-mustache')
src/main/resources/templates/index.mustache
<!DOCTYPE HTML>
<html>
<head>
<title>스프링 부트 웹서비스</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>스프링 부트로 시작하는 웹 서비스</h1>
</body>
</html>
"index"
를 리턴하면src/main/resources/templates/index.mustache
로 매핑됨포함되어 있기 때문에 정상적으로 Test passed 가 됨
레이아웃 방식
: 공통 영역을 별도의 파일로 분리하여 필요한 곳에서 가져다 쓰는 방식
이번에 추가할 라이브러리들인 부트스트랩과 제이쿼리는 머스태치화면 어디서든 필요함
header.mustache
footer.mustache
index.mustache
{{>layour/header}}
<h1>스프링 부트로 시작하는 웹 서비스</h1>
{{>layour/footer}}
{{>layout/?}}
현재 머스테치 파일을 기준으로 다른 파일을 가져옴
IndexController (페이지에 관련 된 controller는 모두 여기서 처리)
post-save.mustache를 만들어 줘야함.
posts-save
- localhost:8080
- localhost:8080/posts/save
index.js의 첫 문장에 var main={...}
을 선언하는 이유?
var init - function(){
...
};
var save = function() {
...
};
init();
정상적으로 api 요청을 수행함
index.mustache의 UI 변경
머스테치 문법
- {{#posts}}
- posts라는 List를 순회
- Java의 for와 같은 역할
- {{id}}등의 {{변수명}}
- List에서 뽑아낸 객체의 필드를 사용
PostRepository 인터페이스에 쿼리 추가
postService에 코드 추가
@readOnly=true
를 주면 트랜젝션의 점위는 유지하되, 조회 기능만 남겨두어 조회 속도가 개선 (등록, 수정,삭제 기능이 전혀 없는 메소드라면 사용 권장)map(PostsListResponseDto)
PostListResponsdeDto 생성
Controller 변경
Model
{{post.id}}
readonly
$('#btn-update').on('click')
update: function()
type:'PUT'
@PutMapping
을 선언했기 때문url:'api/v1/posts'+id
index.js
PostService.class
PostsApiController.class