1. index.html 추가
- 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 디렉토리이다.
- @GetMapping은 HTTP 메소드중 GET 방식으로 들어온 요청을 처리할 메소드임을 표시
3. View 구현
- resources/templates 디렉토리에 Controller에서 반환해줬던 view name으로 html파일을 생성(index.html)
- 위와 같이 html 파일을 작성하면 이제 view resolver가 index.html을 찾아 view 객체를 반환하고 view가 렌더링되어 Client에게 전달될 것이다.
- 그런데 이상하게도 실제로 서버를 구동한 후 접속해보면 페이지를 찾을 수 없다는 에러 페이지가 보인다
- 동적으로 view를 렌더링해줄 템플릿 엔진이 없기 때문이다.
4. 템플릿 엔진 의존성 추가
- 여기서는 Spring Boot가 자동 설정을 지원하는 네 가지 템플릿 엔진(FreeMarker, Groovy, Thymeleaf, Mustache) 중 Thymeleaf 를 사용할 것이다. Thymeleaf는 공식 문서도 잘 갖춰져있고 문법도 배우기 쉬우며 확장성또한 뛰어나다.
- 먼저 build.graddle 파일에 아래 내용을 추가해준다.
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
- 그리고 화면 우상단의 graddle 마크가 달린 새로고침 버튼을 눌러 다시한번 build를 해주면 프로젝트에서 thymeleaf 엔진을 사용할 수 있게 된다.
- 템플릿 엔진도 추가했으니 다시한번 서버를 구동하고 메인 페이지에 접속해보자
- 이제 정상적으로 templates에 만들어둔 index.html의 내용을 볼 수 있다. static에 index.html 이 있더라도 Dispatcher Servlet이 정적 리소스를 탐색하는 것은 핸들러를 찾지 못했을 때 뿐인데, 요청을 처리할 수 있는 Controller 가 존재하기 때문에 static의 index.html은 참조되지 않는다.
- thymeleaf를 사용하여 동적으로 뷰를 렌더링하기는 했지만 아직까진 정적 리소스 반환과 별다른 차이가 없다. 다음에는 Controller에서 Model 객체를 통해 데이터를 전달하고 그 데이터에 thymeleaf를 통해 접근하여 진정한 의미로 동적으로 view를 구성해볼 것이다.
'프레임워크 > Spring' 카테고리의 다른 글
#11 Thymeleaf 2 (0) | 2022.05.08 |
---|---|
#10 Thymeleaf 1 (0) | 2022.05.06 |
#8 Spring Boot 프로젝트 (0) | 2022.05.04 |
#7 Spring 의 구조 (0) | 2022.05.03 |
#6 PSA(Portable Service Abstraction) (0) | 2022.05.02 |