

질문 패키지에서 컨트롤러 자바 클래스를 생성하여 http://localhost:8080/question/list 에 접속할 수 있도록 해주었다.

템플릿 설정하기
보통 브라우저에 응답하는 문자열은 자바 코드에서 직접 만들지 않고 html을 이용한다
일반적으로 템플릿이 많이 사용하는 방법이다
강의에서는 타임리프 템플릿을 이용하엿다
타임리프를 이용하려면 설치가 필요하므로 빌드.그래들 파일을 수정해 필요한 요소를 설치해 준디.


이 경로에 html파일을 신규로 작성해준다.
(html문법을 사용하여 작성하면된다)


이제 문제 컨트롤러 파일로 돌아가 필요없어진 에너테이션은 삭제해주고 작성한 템플릿 파일 이름을 리턴해준다
이제 실행해주면 실행화면을 확인할 수 있다.

작성한 html파일이 잘 실행되는 것을 확인하였다!
이렇게 템플릿에 저장된 내용을 화면에 전달하였다
다음으로는 데이터를 조회하여 템플릿을 통해 화면에 전달하는 내용을 배워본다.
질문 목록과 관련된 데이터를 조회하려면 QuestionRepository 를 사용해주면 된다.
조회한 질문 목록 데이터는 Model 클래스를 사용하여 템플릿에 전달할 수 있다
(find all은 데이터를 선택해오는 함수)
@RequiredArgsConstructor 애너테이션의 생성자 방식으로 questionRepository 객체를 주입했다. @RequiredArgsConstructor는 롬복(Lombok)이 제공하는 애너테이션으로, final이 붙은 속성을 포함하는 생성자를 자동으로 만들어 주는 역할을 한다. 따라서 스프링 부트(Spring Boot)가 내부적으로 QuestionController를 생성할 때 롬복으로 만들어진 생성자에 의해 questionRepository 객체가 자동으로 주입된다.
QuestionRepository의 findAll 메서드를 사용하여 질문 목록 데이터인 questionList를 생성하고 Model 객체에 ‘questionList’라는 이름으로 저장했다. 여기서 Model 객체는 자바 클래스(Java class)와 템플릿(template) 간의 연결 고리 역할을 한다. Model 객체에 값을 담아 두면 템플릿에서 그 값을 사용할 수 있다. Model 객체는 따로 생성할 필요 없이 컨트롤러의 메서드에 매개변수로 지정하기만 하면 스프링 부트가 자동으로 Model 객체를 생성한다.
스프링의 의존성 주입 방식으론 3가지가 있는데 , 생성자를 작성하여 객체를 주입하는 방식이 권장되는 방식이다.
(테스트 코드에서는 다른 방법인 autowired 방식을 사용함...)


타임리프의 속성
분기성
if 문의 사용
th:if="${question != null}"
반복문 속성
th:each="question : ${questionList}"
또는
th:each="question, loop : ${questionList}"
텍스트 속성
th:text="${question.subject}"
또는
<tr th:each="question : ${questionList}">
<td>[[${question.subject}]]</td>
<td>[[${question.createDate}]]</td>
</tr>
루트 URL
도메인명 뒤에 아무런 주소도 덧붙이지 않는 URL을 루트 URL이라고 한다
http://localhost:8080/question/list 는 루트 url 이 아니고 http://localhost:8080이 루트 url이다
현재는 루트 url이 매핑되지 않은 상황이므로 검색시 404 오류가 나오게 되어있다

메인 컨트롤러를 수정하여 루트 매서드를 추가해줘 루트 url과 매핑을 해준다
http://localhost:8080/로 검색을 하고 들어간 경우에도
테이블 화면이 출력되는것을 볼 수 있다

서비스
우리는 그동안 QuestionController에서 QuestionRepository를 직접 접근해 질문 목록 데이터를 조회했다. 하지만 대부분의 규모 있는 스프링 부트(Spring Boot) 프로젝트는 컨트롤러에서 리포지터리를 직접 호출하지 않고 중간에 서비스를 두어 데이터를 처리한다.
서비스의 이유?
모듈화
어떤 컨트롤러가 여러개의 리퍼지토리를 활용하여 데이터를 조회, 가공한다고 할때 서비스가 존재한다면 컨트롤러는 해당 서비스를 호출하여 사용하면 된다. 하지만 컨트롤러에서 이를 직접 구현할 경우 해당 기능을 필요로하는 모든 컨트롤러가 동일한 기능을 중복구현하게된다 (함수의 개념과 비슷?)
보안
서비스를 통해 db에 접근하는것이 보안상 안전하다. 이를 통해 해커가 컨트롤러를 제어할 수 있게 되더라도 리퍼지토리에는 직접 접근할 수 없게된다.
엔티티 객체를 DTO 객체로 변환
앤티티 클래스는 bd와 직접 맞닿아있어 이를 컨트롤러, 템플릿에 전달하여 사용하는 것을 좋지 않다.
서비스를 사용하기 위해 서비스 파일을 작성해준다
서비스 파일을 만드는 방법은 클래스명 위에 서비스 이너테이션을 삽입해주면 된다.
컨트롤러에서 서비스를 이용할 수 이도록 파일을 수정해준다

브라우저로 http://localhost:8080/question/list 페이지에 접속하면 리포지터리를 사용했을 때와 동일한 화면을 볼 수 있다.

'스프링부트' 카테고리의 다른 글
스프링부트 여름방학 9주차 (0) | 2024.08.30 |
---|---|
스프링부트 7주차 (1) | 2024.08.16 |
여름방학 5주차 스프링 부트 (0) | 2024.08.04 |