자동으로 처리되는 날짜/시간 설정
=>엔티티의 등록시간과 수정 시간에 대한 설정을 위한 클래스를 구성
=>@EnableJpaAuditing 어노테이션 적용
MyBatis를 이용하는 경우에 SQL을 위해서 전달되는 객체는 모두 SQL 처리가 끝난 후에 어떻게 되든 상관없는 객체
JPA에서 사용하는 엔티티 객체들은 영속 콘텍스트 라는 곳에서 관리되는 객체
엔티티 클래스와 Querydsl
=>다양한 상황에 맞게 동적으로 JPQL을 생성하는 방법
=>JOOQ나 Querydsl이 주로 사용
=>Querydsl의 경우 별도의 Q도메인이라는 클래스를 생성
Querydsl
-> 코드내부에서 상황에 맞는 쿼리를 생성할 수 있음. 이를 위해서 Q도메인 사용
-> Querydsl 라이브러리를 이용해서 엔티티 클래스를 Q도메인 클래스로 변환하는 방식을 이용하기 때문에 추가적인 설정 필요
build.gradle에 다음과 같은 내용 처리
=>build.gradle에 plugins 추가
=>build.gradle 파일에 라이브러리 추가
=>Gradle의 task 추가
Querydsl의 실습은 다음과 같은 조건 처리
=>‘제목/내용/작성자’ 와 같이 단 하나의 항목으로 검색하는 경우
=>‘제목 + 내용’ / ‘내용 +작성자’ / ’제목 + 작성자’ 와 같이 2개의 항목으로 검색하는 경우
=>'제목 + 내용 + 작성자’ 와 같이 3개의 항목으로 검색하는 경우
Querydsl의 사용법
=>BooleanBuilder 생성
=>조건에 맞는 구문은 Querydsl에서 사용하는 Predicate 타입의 함수를 생성
=>BooleanBuilder에 작성된 Predicate를 추가하고 실행
서비스 계층과 DTO
DTO를 이용하는 이유
=>JPA의 경우 엔티티 객체가 단순한 객체가 아니라 영속 컨텍스트에 영향을 받는 객체이므로 DTO로 처리하면 순수한 데이터를 사용하는 것이 가능
=>엔티티 객체는 가능하면 불변을 유지하는 것이지만 DTO는 가변
=>검증(validate)이나 화면에 필요한 추가적인 기능들을 사용 가능
=>엔티티 클래스와 유사하게 작성되므로 코드의 양이 늘어나는 단점
목록 처리
화면에서 필요한 Entity들을 DTO 변환
ETO 타입의 Pageable 객체 필요
목록처리 DTO
=>Page<Guestbook> GuestBookDTO 타입으로 변환
=>페이지 번호, 검색 조건등의 처리는 PageRequestDTO라는 별도의 DTO 작성해서 처리
페이지 결과 처리 DTO
=>Page<엔티티>로 나오는 결과를 DTO의 목록으로 변환하고, 결과를 화면까지 전달하기 위해서 PageResultDTO라는 클래스 설계
=>DTO의 리스트와 페이지 구성에 필요한 정보를 파라미터로 받아서 처리할 수 있도록 구성
=>다양한 상황에서 사용하기 위해서 타입은 제네릭으로 처리하고 java.util.Function을 이용하여 유연한 구조로 처리
서비스 계층의 목록 처리
dtoToEntity => 앞쪽에서 오는것을 Entity로 변환
EntityToDTO => 뒤에서 오는것을 앞으로
목록 데이터의 페이지 처리
=>Page<엔티티> 내부에는 페이지 처리에 필요한 많은 정보들이 존재하므로 이를 이용
=>PageResultDTO에서는 페이지 구성에 필요한 정보들을 정희하고 이를 추출해서 사용
-화면에서 시작하는 페이지 번호(start)
-화면에서 끝 페이지 번호(end)
-이전/다음 이동 링크 여부 (prev, next)
-현재 페이지 번호(page)
페이지 번호 계산
=>현재 페이지를 기준으로 화면에 출력되어야 하는 마지막 페이지 번호를 우선 처리
tempEnd = (int)(Math.ceil(페이지번호 / 10.0)) * 10;
=>화면의 시작 페이지 번호는 tempEnd – 9로 처리
start = tempEnd - 9;
=>실제 데이터가 부족한 경우를 위해 마지막 페이지 번호는 전체 데이터의 개수를 이용해서 다시 계산
totalPage = result.getTotalPages(); //result는 Page<Guestbook>
end = totalPage > tempEnd ? tempEnd: totalPage;
=>기타 필요한 이전 페이지 여부/ 다음 페이지 존재 여부 계산
prev = start > 1;
next = totalPage > tempEnd;
등록페이지와 등록 처리
=>화면에서 POST방식으로 전달된 데이터들을 GuestbookDTO로 처리하고 서비스 계층에서는 Guestbook엔티티 객체로 처리
=>목록 화면으로 redirect한 후에 모달 창을 이용해서 등록 처리 결과를 보여주는 처리