Spring Boot - 6

현곤·2024년 12월 17일

타임리프

<table>
    <thead>
        <tr>
            <th>제목</th>
            <th>작성일시</th>
        </tr>
    </thead>
    <tbody>
        <tr th:each="question : ${questionList}">
            <td th:text="${question.subject}"></td>
            <td th:text="${question.createDate}"></td>
        </tr>
    </tbody>
</table>

tr th:eqch="question : ${questionlist}"

th: 타임리프에서 사용하는 속성

이게 자바 코드랑 연결됨

<tr th:each="question : ${questionList}">

타임리프는 Model 객체에 저장한 questionList를 ${questionList} 로 읽을 수 있다.

questionList 에 저장된 데이터를 하나씩 꺼내 question 변수에 대입 후

questionList 의 개수만큼 반복하며 <tr> ... </tr> 문장으로 출력하라는 의미

td th:text="${question.subject}" /td

question 객체의 subject를 td 태그로 출력

td th:text="${question.createDate}" /td

question 객체의 createDate를 출력


분기문 속성

if, else if문과 같은 분기문

th:if="${question != null}"

question 객체가 null이 아닌 경우에만 이 속성을 포함한 요소가 표시

반복문 속성

th:each 반복문 속성은 자바의 for each문과 유사

th:each="question : ${questionList}"

이렇게도 사용 가능

th:each="question, loop : ${questionList}"

loop 객체를 이용해 루프 내에서 사용 가능

  • loop.index : 루프의 순서 (루프의 반복 순서, 0부터 1씩 증가)

  • loop.count : 루프의 순서 (루프의 반복 순서, 1부터 1씩 증가)

  • loop.size : 반복 객체의 요소 개수 (예를 들어 questionList의 요소 개수)

  • loop.first : 루프의 첫 번째 순서인 경우 true

  • loop.last : 루프의 마지막 순서인 경우 true

  • loop.odd : 루프의 홀수 번째 순서인 경우 true

  • loop.even : 루프의 짝수 번째 순서인 경우 true

  • loop.current : 현재 대입된 객체 (여기서는 question과 동일)

텍스트 속성

th:text=(속성) 해당 요소의 텍스트값을 출력

th:text="${question.subject}"

텍스트는 th:text 속성 대신 다음처럼 대괄호를 사용하여 값을 직접 출력 가능

<tr th:each="question : ${questionList}">
  <td>[[${question.subject}]]</td>
  <td>[[${question.createDate}]]</td>
</tr>

서비스

서비스 = 스프링에서 데이터 처리를 위해 작성하는 클래스

복잡한 코드를 모듈화할 수 있다.

A 컨트롤러가 어떤 기능을 수행하기 위해 C라는 리포지터리의 메서드 a, b, c를

순서대로 실행해야 한다고 가정했을 때,

B 컨트롤러도 A 컨트롤러와 동일한 기능을 수행해야 한다면?

A, B 컨트롤러가 C 리포지터리의 메서드 a, b, c를 호출해
사용하는 중복된 코드를 가진다.

이런 경우에 C 리포지터리의 메서드들을 호출하는 기능을 서비스로 만들고

컨트롤러에서 이 서비스를 호출하여 사용할 수 있다.

서비스를 사용하면 이런 모듈화가 가능하다.

엔티티 객체를 DTO 객체로 변환

Question, Answer << 엔티티 클래스

엔티티 클래스는 데이터베이스에 맞닿아있는 클래스로
컨트롤러, 타임리프와 같은 템플릿 엔진에 전달해 사용하는 것은 좋지않음

왜냐? 엔티티 객체에는 민감한 데이터가 포함될 수 있다.

타임리프에서 엔티티 객체를 직접 사용하면 민감한 데이터가 노출될 위험이 있음

엔티티 클래스는 컨트롤러에서 사용하지 않도록 설계하는 것이 좋음
그래서 Question, Answer을 대신해 사용할 DTO 클래스가 필요

Question, Answer을 DTO 객체로 변환하는 작업도 필요

엔티티 객체 >> DTO 객체로 변환하는 일서비스에서 처리

서비스는 컨트롤러와 리포지터리의 중간에서

엔티티 객체, DTO 객체를 서로 변환해 양방향에 전달하는 역할을 한다.

엔티티 <<- 서비스 ->> DTO

클래스 서비스로 만들기

개쉬움 그냥 클래스 위에 @Service 얹으면 끝

getList 메서드를 추가함으로써 질문 목록 데이터를 조회하여 리턴할 수 있게 함

리포지터리 직접 사용 X

컨트롤러 -> 서비스 -> 리포지터리 순으로 접근하는 과정 ^^b

profile
코딩하는 곤쪽이

0개의 댓글