Search
Duplicate

[스프링 게시판] 게시판 리스트 화면 출력

@3/10/2023

목표

테스트 데이터를 화면에 출력

아이콘 경로 문제

/assets/spring.png, assets/spring.png, ../assets/spring.png 모두 안 먹힘
static 디렉터리만 접근할 수 있는 게 문제였음. assets 디렉터리를 static 내부로 옮기니 잘 보임

디렉터리 문제

DTO를 서비스 계층에 둬야할지, repository 계층에 둬야할 지 애매한 것 같음. 패키지를 도메인 단위로 쪼개는 것도 좋은 방법인 것 같음

커밋 메시지의 모호함 문제

Test 코드를 변경할 때와 Production 코드를 변경할 때를 구분하면 좋을 것 같긴 한데, 기존 말머리 컨벤션이 썩 마음에 들지 않음
커밋 메시지가 영 코딩 컨벤션과 달라서 읽기 힘들 것 같음
아래처럼 메서드는 괄호를 붙이고, 파일 확장자를 표시하는 게 명확해보임
Add findCommentById() to CommentService.java
Java
복사
아니면 아래처럼
Add CommentService.findCommentById()
Java
복사
일단 연습용 프로젝트이기 때문에 이런저런 방식으로 자유롭게 작성해보고, 나중에 이슈 추적이 필요할 경우 어떤 쪽이 편한 지 보는 게 좋겠음

코드가 사라지는 현상

PostService의 post() 메서드에 @Transactional 메서드가 사라짐
분명 테스트도 수차례 돌려서 잘 됐는데 히스토리에도 안 보이고 기묘함.. 어쨌든 다시 추가해줌

어느 순간 hibernate 로그가 안 찍힘

main application.yaml에 다음 추가함
logging.level: org.hibernate.SQL: debug
Java
복사
Test도 안 됐는데, 원인을 찾아보니 들여쓰기가 돼있었음
Spring 에 들어가는 속성이 아니라 Logging 자체 속성

fetch join 문제

list를 뽑아오려니 fetch join 시 불필요한 유저 데이터, 내용 등을 같이 가져옴
em.createQuery("select p from Post p join fetch p.user")
Java
복사
예를 들어 유저 테이블에서는 유저 이름만 가져오면 되는데, 유저 이름만 뽑기 위해선 fetch join에 유저 엔티티 별칭을 사용해야하겠지만, 강의에서는 이를 추천하지 않았음([강의 요약] 김영한 - 자바 ORM 표준 JPA 프로그래밍 - 기본편). 영한님은 아래 방법을 조언함
만약 엔티티가 가진 모양 그대로 데이터를 가져오는게 아닌 경우 일반 조인 + DTO 활용
따라서 게시판 List를 가져올 때의 별도 DTO를 만들어 사용하기로 함
프로젝션 사용법 → 참고
UserDTO resultList = em.createQuery("select new jpabook.jpql.UserDTO(m.username, m.age) from Member m", MemberDTO.class) .getResultList();
Java
복사

PostListDTO 생성 및 JPQL 프로젝션

일단 댓글 개수는 복잡하니 나중에 하기로 하고 JPQL에서 필요한 데이터만 뽑아올 DTO 생성함
package dev.gyuray.forum.repository.post; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; @AllArgsConstructor @Getter @Setter public class PostListDTO { private Long postId; private String title; private String userName; private LocalDateTime regDate; private Integer view; // private Integer commentCount; }
Java
복사
아래는 JPQL 프로젝션을 통해 DTO에 데이터를 담는 과정
public List<PostListDTO> findAll() { String query = "select new dev.gyuray.forum.repository.post.PostListDTO(" + "p.id, " + "p.title, " + "u.name, " + "p.regDate, " + "p.view" + ") " + "from Post p " + "join p.user u " + "order by p.id desc"; return em.createQuery(query, PostListDTO.class) .getResultList(); }
Java
복사

IntelliJ Class import 실패 문제

인텔리제이가 한번 튕기고 나더니 다음처럼 뻔히 있는 클래스를 인식 못함
캐시를 삭제하고 인덱싱을 다시 해보라고 함
별도 옵션은 체크 안 하고 Invalidate and Restart 눌러서 재시작하니 해결됨

Thymeleaf 작업

사용 선언
<html xmlns:th="http://www.thymeleaf.org">
Java
복사
페이징
<!-- Board Table --> <div class="container"> <table class="table align-middle"> <thead> <tr class="text-center"> <th scope="col" class="col-1">번호</th> <th scope="col" class="col-6">제목</th> <th scope="col" class="col-2">작성자</th> <th scope="col" class="col-1">조회수</th> <th scope="col" class="col-2">작성일</th> </tr> </thead> <tbody class="table-group-divider"> <tr th:each="postListDTO : ${postListDTOs}" class="text-center"> <td th:text="${postListDTO.postId}">2</td> <td th:text="${postListDTO.title}" class="text-start">공지사항 글제목</td> <td th:text="${postListDTO.userName}">운영자</td> <td th:text="${postListDTO.view}">1</td> <td th:text="${postListDTO.regDate}">2023-03-01 12:34:56</td> </tr> </tbody> </table> </div>
Java
복사
DTO와 크로스 체크 해보는데 순서가 달라서 헷갈렸음. DTO 필드 순서를 html과 맞춰서 수정함

결과