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 디렉토리이다.

 

 

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

+ Recent posts