위 주소로 접속하면 404 오류가 뜬다.

404 오류를 해결하려면 /question/list URL에 대한 매핑이 있는 컨트롤러가 필요하다. QuestionController.java 파일을 다음과 같이 작성한다.

 

 

그리고 다시 실행해보면, question list라고 출력될 것이다.

하지만 보통 브라우저에 응답하는 문자열은 위의 예처럼 자바 코드에서 직접 만들지는 않는다.

위에서는 "question list" 라는 문자열을 직접 자바 코드로 작성하여 브라우저에 리턴했다.

일반적으로 많이 사용하는 방식은 템플릿 방식이다. 템플릿은 자바 코드를 삽입할 수 있는 HTML 형식의 파일이다.

템플릿을 어떻게 사용할수 있는지 알아보자. 많은 엔진 중 타임리프(Thymleaf) 템플릿 엔진을 사용할 것이다.

타임리프를 사용하려면 설치가 필요하다. 다음과 같이 build.gradle 파일을 수정하자.

(... 생략 ...)

dependencies {
    (... 생략 ...)
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
}

(... 생략 ...)

위와 같이 수정하고 "Refresh Gradle Project"로 필요한 라이브러리를 설치하자.

타임리프 템플릿 엔진을 적용하기 위해서는 로컬서버 재시작이 필요하다. 로컬서버를 반드시 재시작하고 이후 과정을 진행하자.
그리고,

question_list.html 파일의 내용은 다음과 같이 작성하자.

[파일명: /sbb/src/main/resources/templates/question_list.html]

Copy<h2>Hello Template</h2>

다음에는, QuestionController.java 파일을 다음과 같이 수정하자.

 

 

여기서 주목! @ResponseBody라는 어노테이션이 빨간색으로 되어 있는 것을 볼 수 있다. 아까 코드는 빨간색이 아니었는데.. 그 이유는, 템플릿을 사용하기 때문에 기존에 사용했던 @ResponseBody 애너테이션은 필요없어졌기 때문이다. 그리고 list 메서드에서 question_list.html 템플릿 파일의 이름인 "question_list"를 리턴한다(question list가 아니라는 점 주의!)

 

**ResponseBody 어노테이션이란?

클라이언트에서 서버로 통신하는 메세지를 요청(request) 메세지라고 하며, 서버에서 클라이언트로 통신하는 메세지를 응답(reponse) 메세지라고 한다.

비동기통신을 하기 위해서는 클라이언트에서 서버로 요청 메세지를 보낼 때나 서버에서 클라이언트로 응답을 보낼 때에도 본문에 데이터를 담아서 보내야 하는데

이 본문을 body 라고 한다. 즉, 요청 본문 requestBody, 응답본문 responseBody 를 담아서 보내야 한다.

이 어노테이션이 붙은 파라미터에는 http 요청의 본문 (body) 이 그대로 전달된다.

HTTP 요청의 바디내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해 준다.

 

@ResponseBody

자바객체를 HTTP 요청의 바디내용으로 매핑하여 클라이언트로 전송한다. 

즉, @ResponseBody 어노테이션을 사용하면 http 요청 body 를 자바 객체로 전달 받을 수 있다. **

 

자 이제 새로고침을 해보면..

???????????????

이상하다. 분명 교재는 이렇지 않았는데... 침착하고 오류의 원인을 빠르게 찾아보자.

 

 

우선 @RequiredArgsConstructor 애너테이션으로 questionRepository 속성을 포함하는 생성자를 생성하였다. @RequiredArgsConstructor는 롬복이 제공하는 애너테이션으로 final이 붙은 속성을 포함하는 생성자를 자동으로 생성하는 역할을 한다. 롬복의 @Getter, @Setter가 자동으로 Getter, Setter 메서드를 생성하는 것과 마찬가지로 @RequiredArgsConstructor는 자동으로 생성자를 생성한다. 따라서 스프링 의존성 주입 규칙에 의해 questionRepository 객체가 자동으로 주입된다.

 

스프링의 의존성 주입(Dependency Injection) 방식 3가지

  • @Autowired 속성 - 속성에 @Autowired 애너테이션을 적용하여 객체를 주입하는 방식
  • 생성자 - 생성자를 작성하여 객체를 주입하는 방식 (권장하는 방식)
  • Setter - Setter 메서드를 작성하여 객체를 주입하는 방식 (메서드에 @Autowired 애너테이션 적용이 필요하다.)

테스트코드(SbbApplicationTests.java)에서는 속성에 @Autowired 애너테이션을 사용하여 객체를 주입했다.

그리고 Question 리포지터의 findAll 메서드를 사용하여 질문 목록 데이터인 questionList를 생성하고 Model 객체에 "questionList" 라는 이름으로 값을 저장했다. Model 객체는 자바 클래스와 템플릿 간의 연결고리 역할을 한다. Model 객체에 값을 담아두면 템플릿에서 그 값을 사용할 수 있다.

Model 객체는 따로 생성할 필요없이 컨트롤러 메서드의 매개변수로 지정하기만 하면 스프링부트가 자동으로 Model 객체를 생성한다.

나중에 다시 한번 더 봐야할 것 같다. 오류가 개선이 안된다..

'백엔드 > Springboot' 카테고리의 다른 글

Root URL  (0) 2023.11.09
질문 목록과 템플릿(2)  (1) 2023.11.09
<번외> 프로젝트 github 등록 삽질기  (2) 2023.11.09
리포지터리(Repository) -3-  (0) 2023.09.18
리포지터리(Repository) -2-  (0) 2023.09.18

+ Recent posts