πŸ“‹ κ²Œμ‹œνŒ κΈ°λŠ₯ μΆ”κ°€ - μ •λ ¬, 검색, 개수 μ œν•œ

jijiΒ·2023λ…„ 11μ›” 12일
0

Spring Boot Project 🌱

λͺ©λ‘ 보기
8/16

πŸ‘©πŸ»β€πŸ¦° κ²Œμ‹œκΈ€ 전체 쑰회 APIλ₯Ό μ‚¬μš©ν•˜λ‹ˆ ν•œ λ²ˆμ— λ‚ λΌμ˜€λŠ” λ°μ΄ν„°μ˜ κ°œμˆ˜κ°€ λ„ˆλ¬΄ λ§Žμ•„ 응닡속도가 λŠλ¦½λ‹ˆλ‹€.

  • 쑰회 μ‹œ 개수 μ œν•œ(limit)이 ν•„μš”ν•΄μš”.
  • μ •λ ¬ κΈ°λŠ₯ μΆ”κ°€
  • 검색 κΈ°λŠ₯ μΆ”κ°€

βœ” λͺ©ν‘œ

  • κ²Œμ‹œκΈ€ μž‘μ„± κΈ°λŠ₯
    • κ²Œμ‹œκΈ€μ— 생성 μ‹œκ°„λ„ 같이 μ €μž₯ βœ”
  • κ²Œμ‹œκΈ€ 전체 쑰회
    • 생성 μ‹œκ°„ 포함 βœ”
    • μ΅œμ‹  μž‘μ„±κΈ€ 순으둜 쑰회, μ΅œλŒ€ 개수 100개 βœ”
  • νŠΉμ • κ²Œμ‹œκΈ€ 쑰회
    • 생성 μ‹œκ°„ 포함 βœ”
  • κ²Œμ‹œκΈ€ 검색 κΈ°λŠ₯
    • 검색 ν‚€μ›Œλ“œλ‘œ κ²Œμ‹œκΈ€μ„ 검색 βœ”
    • 검색 ν‚€μ›Œλ“œκ°€ ν¬ν•¨λœ 제λͺ©μ„ 가진 κ²Œμ‹œκΈ€μ„ μ „λΆ€ 쑰회 (μ΅œλŒ€ 100개) βœ”
    • μ΅œμ‹ μˆœ μ •λ ¬ βœ”

πŸ“Œ 배운점

  • JPA Auditing μ‚¬μš©ν•˜μ—¬ 생성, μˆ˜μ • μ‹œκ°„ 관리
    • 문제 : update μ‹œ UpdatedAt에 이전 μ‹œκ°„μ΄ μ €μž₯됨.
    • update처럼 λ³€κ²½ 감지가 일어날 λ•ŒλŠ” ν•΄λ‹Ή μ—”ν‹°ν‹°λ₯Ό μ—…λ°μ΄νŠΈ ν•˜κΈ° μ΄μ „μ˜ μ‹œκ°„μ΄ μ €μž₯λœλ‹€.
    • ν•΄κ²° : dbμ—μ„œ λ³€κ²½ν•œ μ‹œμ μ„ 즉각 μ μš©ν•˜κ³  μ‹Άλ‹€λ©΄ db둜 flushλ₯Ό λ‚ λ €μ€€λ‹€.
    boardRepository.flush();

πŸ‘©πŸ»β€πŸ’» 개발 κ³Όμ •

1. 생성 μ‹œκ°„, μˆ˜μ • μ‹œκ°„μΆ”κ°€

1. main
@SpringBootApplication
@EnableJpaAuditing // JPA Auditing ν™œμ„±ν™”
public class BibiApplication {

2. BaseEntity.class
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseEntity {
  @CreatedDate
  @Column(updatable = false)
  private LocalDateTime createdAt;

  @LastModifiedDate
  private LocalDateTime updatedAt;
}

3. Post.class
@NoArgsConstructor
public class Post extends DataTime { // 상속

4. DTO λ³€κ²½
public class PostResponseDTO {
  ...
  private LocalDateTime createdAt;
  private LocalDateTime updatedAt;

  public PostResponseDTO(Post post) {
    ...
    this.createdAt=post.getCreatedAt();
    this.updatedAt = post.getUpdatedAt();
  }

2. 쑰회 μ‹œ 쑰건 μΆ”κ°€ + ν‚€μ›Œλ“œ 검색

1) μ΅œμ‹ μˆœ μ •λ ¬, 100개 κΉŒμ§€λ§Œ 쑰회

// BoardRepository
  List<Post> findTop100ByOrderByCreatedAtDesc();

// Service
   public List<PostResponseDTO> findAll(){
    List<Post> posts = boardRepository.findTop100ByOrderByCreatedAtDesc();

2) ν‚€μ›Œλ“œ 검색

  1. Controller - 기쑴의 κ²Œμ‹œκΈ€ μ „μ²΄μ‘°νšŒ λ©”μ„œλ“œμ— ν‚€μ›Œλ“œ νŒŒλΌλ―Έν„° μΆ”κ°€
  @GetMapping
  public ResponseEntity<List<PostResponseDTO>> getPostAll(@RequestParam(required = false) String keyword){
    List<PostResponseDTO> allPostDto = boardService.findAll(keyword);
    return ResponseEntity.ok(allPostDto);
  }
  1. Service - Repository 쿼리 μˆ˜μ •
// Repository
  @Query("SELECT p FROM Post p " +
      "WHERE :keyword IS NULL OR :keyword = '' OR LOWER(p.title) LIKE LOWER(CONCAT('%', :keyword, '%')) " +
      "ORDER BY p.createdAt DESC")      
  List<Post> findRecentPosts(@Param("keyword") String keyword);

// Service      
    public List<PostResponseDTO> findAll(String keyword){
    List<Post> posts = boardRepository.findRecentPosts(keyword);

➑ νŠΉμ • μ—”ν„°ν‹°μ—μ„œ title ν•„λ“œμ— λŒ€ν•œ λΆ€λΆ„ 일치 검색을 μˆ˜ν–‰ν•˜κ³ , createdAt ν•„λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ΅œλŒ€ 100개의 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

ν‚€μ›Œλ“œκ°€ 없을 경우 전체 쑰회.

0개의 λŒ“κΈ€