클래스 Member의 구조
@Table(name = "member")
@Entity
@Setter
@Getter
@ToString(exclude = "certKey")
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "content", nullable = false)
private String content;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "writer_no")
private User user;
@Column(name = "reg_date", updatable = false)
@CreationTimestamp
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime regDt;
@Builder
public BoardImp(Long id, String title, String content, Member writer, LocalDateTime regDate) {
this.id = id;
this.title = title;
this.content = content;
this.writer = writer;
this.regDate = regDate;
}
}
이전 코드
이전 코드는 `PagenationVO` 클래스 사용해 페이지 정보를 담아 아래와 같이 Repository 코드를 작성했었다.
public interface BoardRepository extends JpaRepository<Board, Long> {
@Query(value = "select b.* from board c join member m on b.writer = m where b.writer=:member order by b.reg_date desc limit :size, :offset",
nativeQuery = true)
List<Board> findBoardsByUserOrderByRegDateDesc(Member member, int size, int offset);
}
- 쿼리는 `select b.* from board c join member m where b.writer=:user order by b.reg_date desc limit :size, :offset` 또는 `select b.* from board c join member m where b.writer=:user order by b.reg_date desc limit :size offset :offset`과 같이 작성할 수 있다.
수정 후 코드
Service
/**
* Board의 regDate(작성일자)를 기준으로 내림차순한 결과를
* size으로 페이징하여 page번째 페이지를 가져온다.
*/
public List<Board> getBoardByUser(Member member, int page) {
Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.DIRECTION.DESC, "regDate"));
Page<Board> page = boardRepository.findBoardsByWriter(member, pageNo);
return page.getContent();
}
아래는 `Sort.by` 메서드 사용시 들어가는 파라미터 종류이다. 이 외에도 다양한 파라미터를 받으니 자세히 알고자 하면 `Sort` 클래스를 살펴보자. 여기서 Direction은 정렬(오름차순/내림차순), property(properties)는 정렬 기준이 되는 필드를 말한다. 엔티티의 필드명을 작성하면 된다.
- `Sort.by(Direction direction, List<String> properties)`
- `Sort.by(Direction direction, String... properties)`
- `Sort.by(Direction direction, properties)`
- `Sort.by(properties)`
`Direction`은 아래와 같이 사용할 수 있다.
- `Sort.by(Sort.DIRECTION.ASC, 필드명)` 또는 `Sort.by(Sort.DIRECTION.DESC, 필드명)`
- `Sort.by(필드명).ascending()` 또는 `Sort.by(필드명).descending()`
Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
Page<Board> findBoardsByUser(Member member, Pageable pageable);
}
'Backend > JPA' 카테고리의 다른 글
JPA) Example, ExampleMatcher 사용해 조건에 맞는 값 조회하기 (0) | 2024.07.05 |
---|---|
JPA) 지연 로딩 성능 최적화(N + 1 문제 해결, fetch 조인) (0) | 2024.05.25 |
JPA) 영속성 컨텍스트(Persistence Context) (0) | 2024.05.24 |
JPA(Java Persistence API) - 도커에 올린 DB(H2)와 연동하기 (0) | 2023.11.17 |