@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과 맞춰서 수정함