컨트롤러에서 String을 반환하면 html 파일이 불러와지는 것을 알 수 있는데 그 이유가 무엇일까?
사실 단순히 String을 반환하면 항상 html이 반환되는 것은 아니다. 어떤 경우에 원하는대로 사용할 수 있는지 알아보자.
@RestController
@RestController라는 어노테이션은 REST API 서비스를 제공할 때 사용한다. 해당 어노테이션을 컨트롤러 클래스에 작성하면 해당 클래스의 모든 매핑된 메서드들은 REST 방식의 요청에 맞는 응답을 할 수 있다.
이 경우일 때, String을 반환할 수 있는데 이 때는 주로 단순 문자열 값이고, 다른 방식으로는 JSON 타입과 같은 데이터 포맷을 사용한다.
@RestController
public class TestController {
@GetMapping("/test1")
public String test1() {
return "test";
}
}

/test1로 요청을 보내니 단순 test라는 문자열이 응답되었다.
@RestController
public class TestController {
@GetMapping("/test2")
public User test2() {
return User.builder()
.name("민수")
.role(Role.builder().name("학생").build())
.build();
}
}

대충 User를 만들어서 반환을 해보았다. 설정하지 않은 값들은 null로 지정되었다. 지금은 이건 사소한 문제고 응답 결과를 보면 JSON 형식으로 반환된 것을 알 수 있다.
@Controller
@Controller 어노테이션을 사용하면 서버사이드렌더링(SSR) 방식으로 템플릿 엔진을 이용하여 HTML을 만들어 클라이언트로 전달한다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>TEST</h1>
</body>
</html>
ㄴtest.html
@Controller
public class TestController {
@GetMapping("/test1")
public String test1() {
return "test";
}
}

String을 반환했는데 어떻게 HTML이 만들어져서 반환되는 것일까?

경로라면 templates/test.html이라는 것을 지정해야 할텐데 말이다.
사실 해당 경로는 실제로 작성된다. 하지만 내가 작성하는 것이 아닌 스프링이 자동으로 해주는 것이다.

ViewResolver라는 것이 있다. 인터페이스인데 해당 인터페이스의 구현체에서 내가 컨트롤러에서 작성한 그 String 값에 자동으로 /templates/라는 경로를 앞에 붙여주는 것이다.

물론 suffix도 있다.
그러면 결국 내가 작성한 String "test"가 "/templates/" + "test" + ".html"이 되어 실제 경로로 바뀌는 것이다.
prefix & suffix 변경하기

application.properties 또는 application.yaml에서 타임리프인 경우 위와 같이 prefix와 suffix를 변경하여 사용할 수 있다.
잘 작동하는지 확인해 보자.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>MY-PATH!</h1>
</body>
</html>
ㄴ /mypath/test.html

mypath와 templates 두 폴더 안에 동일하게 test.html이 있다. 여기서 어느 것이 화면에 출력이 될까?

새로 변경한 mypath의 test.html이 실행된 것을 알 수 있다!
# thymeleaf
spring.thymeleaf.prefix=classpath:/mypath/
spring.thymeleaf.suffix=.html
# freemarker
spring.freemarker.prefix=
spring.freemarker.suffix=
# jsp
spring.mvc.view.prefix=
spring.mvc.view.suffix=
ㄴ application.properties
다른 템플릿 엔진은 이런식으로 설정할 수 있다.
'공부 > Spring' 카테고리의 다른 글
| [Spring Web] Spring MVC 컨트롤러 요청/응답 가능한 여러가지 방법 (0) | 2024.03.21 |
|---|---|
| [Spring Web] http body 내용 가져오기 (MapStruct 안 되는 이유) (0) | 2024.03.16 |
| [Spring] IoC, Bean Factory, Applicatin Context (0) | 2024.02.18 |
| [Spring] 트랜잭션(Transaction) 과정 (0) | 2024.01.18 |
| [Spring] DataSource를 이용한 DB 연결 테스트 (0) | 2024.01.01 |