포스트

Day98 실습프로젝트(Spring boot)

페이징 처리 적용하기

1. 페이징 처리의 원리

  • SQL DataBase에서 쿼리문을 통해 select 할 수 있는 행의 갯수를 제한할 수 있다.
  • 이러한 특성을 이용해 한페이지에 게시될 수 있는 최대 행의 크기를 출력할 수 있다.

    select
      column_name
    from
      table_name
    order by 
      sort_option
    limit
      (pre_page_no * count), count;
    // count=한페이지에 출력 갯수
    // 페이지의 시작 행번호 = pre_page_no * count
    // ex limit 4,4 => select결과 5번째(0부터 시작)부터 4개의 결과를 보여준다.
    

2. 적용하기

1) 클라이언트

  • 클라이언트에서는 get요청을 통해 pageNo와 pageSize를 요청한다.

    http request localhost:8888/board/list?pageNo=#&pageSize=#

2) 컨트롤러

  • 컨트롤러에서 service단에 보낼 데이터를 가공하여 확정된 값을 service에 전달한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    @GetMapping("list")
    public void list(
            @RequestParam(defaultValue = "1") int pageNo,
            @RequestParam(defaultValue = "3") int pageSize,
            Model model) throws Exception {
      
      if (pageNo < 1) {
        pageNo = 1;
      }
      
      int length = boardService.countAll();
      
      int pageCount = length / pageSize;
      if (length % pageSize > 0) {
        pageCount++;
      }
      
      if (pageNo > pageCount) {
        pageNo = pageCount;
      }
      
      List<Board> list = boardService.list(pageNo, pageSize);
      model.addAttribute("list", list);
      model.addAttribute("pageNo", pageNo);
      model.addAttribute("pageSize", pageSize);
      model.addAttribute("pageCount", pageCount);
    }
    

3) Service 및 Dao

  • Service에서는 Dao에 전달 할 값을 Map을 통해 전달한다.

    1
    2
    3
    4
    5
    6
    7
    8
    
    public List<Board> list(int pageNo, int pageSize) throws Exception {
      
      HashMap<String, Object> options = new HashMap<>();
      options.put("rowNo", (pageNo - 1) * pageSize);
      options.put("length", pageSize);
      
      return boardDao.list(options);
    }
    
  • Dao에서는 Mapper에 전달할 값을 결정한다.

    1
    
    List<Board> list(Map<String, Object> options) throws Exception;
    

4) Mapper

  • mapper에서는 sql쿼리를 통해 결과를 List에 저장하여 반환한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    <select id="list" resultMap="BoardMap">
      select
      b.board_id,
      b.title,
      b.created_date,
      b.view_count,
      u.user_id,
      u.name
      from
      myapp_boards b inner join myapp_users u on b.user_id=u.user_id
      order by
      b.board_id desc
      limit
      #{rowNo}, #{length}
    </select>
    

Lombok 적용하기

1. Lombok의 기능

  • Lombok은 setter/getter, toString, hashCode 등 자동 생성 기능이 있다.

2. Lombok의 적용과정

  • Lombok이 Spring boot에서 적용 가능한 이유는 gradle이 컴파일 시 기능을 추가 해주기 때문인다.
  • gradle의 설정시 compileOnly설정에서 annotationProcesser를 추가하여 작업하는 중간 컴파일 과정이 있다.
  • 중간 컴파일 과정에서 Lombok이 메서드들을 추가해준다.

    1
    2
    3
    4
    5
    6
    7
    8
    
    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }
      
    // 위 기능이 적용된 annotationProcessor
    annotationProcessor 'org.projectlombok:lombok'
    

3. Lombok의 주요 annotation

1) @Getter, @Setter

  • @Getter: 각 필드에 대한 getter 메서드를 자동 생성한다.
  • @Setter: 각 필드에 대한 setter 메서드를 자동 생성한다.
  • 클래스나 특정 필드에 적용할 수 있으며, 접근 제어 수준을 설정할 수 있다.

2) @ToString

  • @ToString: toString() 메서드를 자동으로 생성해 준다.
  • 원하는 필드만 포함하거나 특정 필드를 제외할 수도 있다.

3) @EqualsAndHashCode

  • @EqualsAndHashCode: equals()hashCode() 메서드를 자동 생성한다.
  • 특정 필드를 제외하거나 상위 클래스의 메서드를 포함하는 옵션을 설정할 수 있다.
  • @EqualsAndHashCode(of={fieldName, fieldName})을 통해 특정 필드가 같으면 equals True를 리턴 할 수 도 있다.

4) @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

  • @NoArgsConstructor: 매개변수가 없는 기본 생성자를 생성한다.
  • @AllArgsConstructor: 모든 필드를 매개변수로 받는 생성자를 생성한다.
  • @RequiredArgsConstructor: final 또는 @NonNull이 붙은 필드만을 매개변수로 받는 생성자를 생성한다.

5) @Data

  • @Data: @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor가 결합된 어노테이션이다.
  • 간단한 DTO나 Entity 클래스에 유용하게 사용된다.

6) @Builder

  • @Builder: 빌더 패턴을 적용해 객체를 생성할 수 있게 한다.
  • 클래스 또는 생성자에 적용할 수 있으며, 플루언트한 API로 객체를 생성할 수 있다.

7) @Value

  • @Value: @Data와 유사하지만, 기본적으로 모든 필드를 final로 만들어 변경할 수 없는(immutable) 객체로 만든다.
  • @Getter, @ToString, @EqualsAndHashCode, @AllArgsConstructor가 포함되어 있다.

8) @SneakyThrows

  • @SneakyThrows: 지정된 예외를 선언하지 않고, 예외가 발생할 수 있는 메서드를 호출할 수 있게 한다.
  • 특정 예외를 체크하지 않도록 처리할 때 사용된다.

9) @NonNull

  • @NonNull: 해당 필드 또는 파라미터가 null이면 NullPointerException을 발생시키도록 설정한다.
  • 생성자, 메서드, 필드에 적용 가능하다.

10) @Slf4j (및 기타 로깅 어노테이션)

  • @Slf4j: slf4j 기반의 로깅 객체를 자동으로 생성해 준다.
  • 다른 로깅 프레임워크 (e.g., @Log, @Log4j2)와의 호환을 위한 어노테이션도 있다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.