Dispatcher Servlet은 핸들러를 찾지 못할 경우 정적 리소스 경로(resouces)를 탐색한다. 그리고 만약 접속시에 호스트와 포트번호만을 입력하여 접속했을 때 resources/static 디렉토리에 index.html 파일이 있다면 별도의 매핑 없이도 해당 파일을 클라이언트에게 반환해준다. 즉, static의 index.html은 별도의 설정이 없이도 메인 페이지로 매핑이 되어있다.
위와 같이 resources/static 디렉토리에 index.html을 작성하고 서버를 구동한 뒤 서버에 접속해보자
메인 페이지가 정상적으로 출력되는 모습을 확인할 수 있다.
2. Controller 구현
mycomm 패키지 하위에 Controller가 위치할 controller 디렉토리를 생성
controller 패키지 하위에 메인 화면에 관한 요청을 담당할 HomeController를 생성
HomeController 클래스에 @Controller 어노테이션 적용 => Controller로 사용할 것임을 표시 => @Controller는 내부적으로 @Component를 사용하기에 Controller 클래스는 Bean으로 등록됨
요청을 처리할 메소드 정의
@GetMapping은 HTTP 메소드중 GET 방식으로 들어온 요청을 처리할 메소드임을 표시
괄호 안에는 매핑될 url을 적어줘야한다. 여기서는 메인 페이지를 매핑할 것이기 때문에 "" 를 넣어줬다.
인자로 받는 Model 객체는 Controller로부터 View로 데이터를 전달하기 위한 객체 => MVC 패턴의 Model 과는 상관이 없으니 혼동해서는 안된다.
문자열 "index"를 반환 => Dispatcher Servlet에게 view name 반환 => Dispatcher Servlet은 view resolver를 통해 view name에 해당하는 view 객체를 받아와 렌더링 => 렌더링된 view를 Client에게 반환 => 이 때, view resolver가 view name에 해당하는 view 를 찾는 곳은 resources/templates 디렉토리이다.
위와 같이 html 파일을 작성하면 이제 view resolver가 index.html을 찾아 view 객체를 반환하고 view가 렌더링되어 Client에게 전달될 것이다.
그런데 이상하게도 실제로 서버를 구동한 후 접속해보면 페이지를 찾을 수 없다는 에러 페이지가 보인다
동적으로 view를 렌더링해줄 템플릿 엔진이 없기 때문이다.
4. 템플릿 엔진 의존성 추가
여기서는 Spring Boot가 자동 설정을 지원하는 네 가지 템플릿 엔진(FreeMarker, Groovy, Thymeleaf, Mustache) 중 Thymeleaf 를 사용할 것이다. Thymeleaf는 공식 문서도 잘 갖춰져있고 문법도 배우기 쉬우며 확장성또한 뛰어나다.
그리고 화면 우상단의 graddle 마크가 달린 새로고침 버튼을 눌러 다시한번 build를 해주면 프로젝트에서 thymeleaf 엔진을 사용할 수 있게 된다.
템플릿 엔진도 추가했으니 다시한번 서버를 구동하고 메인 페이지에 접속해보자
이제 정상적으로 templates에 만들어둔 index.html의 내용을 볼 수 있다. static에 index.html 이 있더라도 Dispatcher Servlet이 정적 리소스를 탐색하는 것은 핸들러를 찾지 못했을 때 뿐인데, 요청을 처리할 수 있는 Controller 가 존재하기 때문에 static의 index.html은 참조되지 않는다.
thymeleaf를 사용하여 동적으로 뷰를 렌더링하기는 했지만 아직까진 정적 리소스 반환과 별다른 차이가 없다. 다음에는 Controller에서 Model 객체를 통해 데이터를 전달하고 그 데이터에 thymeleaf를 통해 접근하여 진정한 의미로 동적으로 view를 구성해볼 것이다.