[백엔드 첫 걸음] Mustache

khyojun·2022년 8월 22일
1

Mustache?

Mustache는 수많은 언어를 지원하는 가장 심플한 템플릿 엔진입니다.

자바에서 사용이 될 때에는 서버 템플릿으로서, 자바스크립트에서 사용이 되어질 때에는 클라이언트 템플릿 엔진으로서 모두 사용을 할 수 있게 된다.

자바 진영에서 사용하는 템플릿 엔진으로는 JSP, Velocity, Freemarker, Thymeleaf 등 다양한 서버 템플릿 엔진이 존재를 한다. 그치만 다음과 같은 단점이 있다고 한다.

  • JSP, Velocity: 스프링 부트에서는 권장하지 않는 템플렛 엔진입니다.
  • Freemarker: 템플릿 엔진으로는 너무 과하게 많은 기능을 지원합니다. 높은 자유도로 인해 숙련도가 낮을수록 Freemarker 안에 비즈니스 로직이 추가될 확률이 높습니다.
  • Thymeleaf: 스프링 진영에서 적극적으로 밀고 있지만 문법이 어렵습니다. HTML 태그에 속성으로 템플릿 기능을 사용하는 방식이 기존 개발자분들께 높은 허들로 느껴지는 경우가 많습니다. 실제로 사용해 본 분들은 자바스크립트 프레임워크를 배우는 기분이라고 후기를 이야기하기도 합니다. 물론 Vue.js를 사용해 본 경험이 있어 태그 속성 방식이 익숙한 분이라면 Thymeleaf를 선택해도 됩니다.

이에 반한 Mustache의 장점은 다음과 같다.

  • 문법이 다른 템플릿 엔진보다 심플합니다.
  • 로직 코드를 사용할 수 없어 View의 역할과 서버의 역할이 명확하게 분리됩니다.
  • Mustache.js와 Mustache.java 2가지가 다 있어, 하나의 문법으로 클라이언트/서버 템플릿을 모두 사용이 가능합니다.

이 책에서는 템플릿 엔진의 활용을 화면 역할에 중시를 하기에 다른 영한님 강의 실습에서 사용을 하였던 Thymeleaf도 좋지만 Mustache의 위와 같은 장점덕분에 사용을 하게 되었다.

Mustache를 사용하기 위하여서는 플러그인 설치를 하고 그리고 build.gradle에 다음과 같은 코드를 추가하여 준다.

implementation('org.springframework.boot:spring-boot-starter-mustache')

그 이후 Mustache의 파일 위치들은 기본적으로 src/main/resources/templates라고 한다. 그래서 이 위치에 Mustache 파일을 두면 스프링 부트에서 자동으로 로딩을 하는 특징이 있다.

이제 기본적인 첫 페이지를 만들어보도록 하자.

📂main/resource/templates/index.mustache

<!DOCTYPE HTML>
<html>
<head>
    <title>스프링부트 웹서비스</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
 <h1>스프링 부트로 시작하는 웹 서비스 Ver.2</h1>
</body>
</html>

그리고 다음 이제는 이 Mustache에 URL을 매핑을 한다. 이제는 Controller에서 진행을 해보자.
web 패키지에 IndexController를 생성을 한다.

📂/web/IndexController.java

~~~
@Controller
public class IndexController {

    @GetMapping("/")
    public String index(){
        return "index";
    }
}

위 코드를 바탕으로 보게 된다면은 index를 반환하게 된다면 자동적으로 위에 build.gradle에 추가한 것처럼 Mustache starter 덕분에 컨트롤러에서 문자열을 반환을 하게 될 때 앞의 경로와 뒤의 파일의 확장자는 자동적으로 지정이 된다. 그 경로는 src/main/resources/templates로 뒤의 확장자는 .mustache가 붙는 것이다. 그래서 자동적으로 index.mustache를 위 경로에서 찾아보게 되는 것이다. 그렇게 하여 자동적으로 /src/main/resources/templates/index.mustache로 반환하여 View Resolver가 처리를 하여준다.

그러면 잘 작동을 하는지 Test코드도 작성을 해보자.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IndexControllerTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void _페이지로딩(){
        //when
        String body = this.restTemplate.getForObject("/", String.class);

        //then
        Assertions.assertThat(body).contains("스프링 부트로 시작하는 웹 서비스");
    }
}

contain: contain을 통하여서 위에 index.mustache에서 작성하였던 것처럼 h1태그의 스프링 부트로 시작하는 웹 서비스 가 body안에 포함이 되어있는지 확인함을 통하여서 정상적으로 진행되었는지 테스트한다.


참고

  1. 이동욱 저자의 <스프링 부트와 AWS로 혼자 구현하는 웹 서비스>
profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글