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 라이센스를 따릅니다.