안녕하세요. Harry입니다.
본 포스팅의 목적은, 스프링부트를 공부하며 어려웠거나 막혔던 부분에 대한 "명확한 정리/트러블슈팅" 입니다.
목표
- 스프링부트에서 여러 개의 html 파일을 어느 폴더에 둘 때 어떻게 읽어야하는지 안다.
결론
아무설정을 안한다면 template 폴더 내 있는 html 파일을 스프링부트가 읽을 방법이 없다.
만약 스프링에서 html을 읽어 오고자 한다면
1) [귀찮게 새로운 폴더 만들기] Webapp 폴더를 따로 생성하거나,
2) [스프링이 인지할 수 있는 귀찮은 설정 추가] (MvcConfiguration implements WebMvcConfigurer) public class를 선언하거나,
정적 리소스를 탐색할 경로를 매번 만들고 관리해야하기 때문에 빡셈
3) [멋진] 타임 리프(Thymeleaf) 를 써야한다.(이거 쓰자)
why?
편하고(mvcConfiguration , webapp폴더 따로 안만들어도 됨),
유지보수 쉽고 확장도 쉽기 때문(기존 HTML에 녹아들어 있어서)
1. 기본은 static이다.
Spring Web 의존성을 추가 했다면, localhost:8080으로 접근했을 때 기본으로 읽어오는 html 파일을 설정할 수 있다.
static파일 내 index.html로 이름을 설정한다면, 스프링이 자동으로 이 index.html 파일을 welcome page로 읽는다.
위 사진에서 보시면 resources -> static -> index.html으로 지정한 파일이 있음을 확인할 수 있다.
localhost:8080 띄워서 잘나오는 거 확인.
근데 여기까지다. static 폴더가 할 수 있는 역할은.. static 폴더 내 있는 index.html을 웰컴 페이지로 인식해 띄우는 것 까진 되는데, 이후 다른 html 페이지를 연속으로 띄우는 것은 안된다. 아래처럼 find.html을 static에 넣어둬도 읽어들일 수 없당..
당연히 Controller 에서 RequestMapping을 통해 실제로 이동할 수 있도록 메서드를 정의해뒀다.
Get이든 Post든 그 때에 따라 달라지긴하는데, 일단 Get으로 함
아래 사진처럼 혹시나 templates 폴더에 find.html 파일을 옮겨봤지만 역시 안됨
왜 안되냐!
스프링부트에서 기본적으로 확인하는 정적 리소스 경로에 포함되지 않기 때문이다.
[정적 리소스 경로]
/static
/public
/resources
/META-INF/resources
스프링은 기본적으로 위 경로를 정적 리소스 경로로 설정하기 때문에, templates 폴더는 따로 찾지 않는다.
물론 find.html을 static 폴더에 넣고, localhost:8080/find.html로 접속하면 된다. 하지만 이 또한 문제가 있는 것이... 컨트롤러에서 return을 "find"가 아닌, "find.html"로 해줘야한다는 점이다. (안그러면 에러남)
이는 우리가 원하는 개발 방식이 아니므로, 스프링이 html 파일을 확인할 수 있도록 우리가 "직접" 설정해줘야 한다.
2. 템플릿 쓰고 싶으면 MvcConfiguration implements WebMvcConfigurer 만들자
일단 아래와 같이 만들었다.
config 폴더 -> MvcConfiguration.java 생성
1) "/"로 시작하는 모든 요청을 다룰 것
2) 1번에 해당하는 요청을 찾는 폴더 위치를 지정한 것(static과 template 폴더)
3) 캐시를 10분으로 설정(당장 중요한 건 아님)
다시 잘되는 걸 확인할 수 있다.
3.결론 : 어차피 Thymeleaf 쓰면 알아서 경로 탐색이 되긴 함
사실 build.gradle에 타임리프 의존성 하나만 추가해주면 알아서 templates 폴더까지 찾도록 도와준다. (다른 템플릿엔진도 가능)
이게 사실 상 가장 편한 방법이지 않을까..?
다만,,템플릿엔진을 쓰지 않을 것이지만, 템플릿 엔진이 제공하는 auto-configuration 기능을 쓰기 위해 템플릿 엔진 의존성을 추가한다는 것 자체가 딜레마가 될 것 같은...
번외
Webapp 폴더를 main 폴더 아래에 생성하고 그 안에 html 파일을 넣는 방법도 존재한다.
물론 귀찮다. 설정할 것이 엄청 많다.
1.src/main/webapp 폴더 생성
2. application.properties에 아래와 같이 설정 추가
spring.mvc.view.suffix=html
3. project Structure(cmd+shift+o)에서 Web Resource Directries 를 src/main으로 변경
4. 컨트롤러로 index에 접근하는 코드 추가
.....
이렇게 해도 해결은 됐지만... 불편해 불편해...
'Development > Spring&Springboot' 카테고리의 다른 글
스프링 빈이란?? (3) | 2024.02.28 |
---|---|
스프링 컨테이너 DI와 IoC (2) | 2024.02.28 |
[채팅] 채팅 메세지 전송 속도 개선 (3) | 2024.02.14 |
[채팅] 채팅방 리스트 최신화 속도 개선 (3) | 2024.02.09 |
[JPA] 스프링 관련 어노테이션 (0) | 2023.03.06 |