본문으로 바로가기
728x90
반응형

Date: 2021년 12월 7일
Status: Completed
Task: Develop

  • 주의

    • Entitiy 정의는 본 주제에서 벗어나므로 다루지 않을 것
  • Test

    • DB: MySQL Employees
  • Layer

    • Controller
      • End Point
    • Service
      • Repository에 의존
    • Repository
      • JpaRepository에 의존
    • Entity
      • employees DB와 연결된 테이블의 Entity
  • Package

      import org.springframework.data.domain.Page;
      import org.springframework.data.domain.Pageable;
    • 삽질하다가 다른 패키지의 Pageable을 사용했다
    • 헷갈리지 말고 위의 Pageable 객체를 사용하도록 하자

Controller 계층

  1. 컨트롤러 계층에서는 다음과 같이 Service에 DI를 걸어주자

      EmployeesService employeesService;
    
      public EmployeesController(EmployeesService employeesService) {
              this.employeesService = employeesService;
      }
    • 위와 같이 DI를 걸어주는 이유는 @Autowire를 이용한 DI는 순환참조 문제를 야기시킬 수 있기 때문
  2. Method를 다음과 같이 구성하자

     @GetMapping("/employees")
     public Page<EmployeesEntity> selectEmployees(final Pageable pageable) {
             return employeesService.FindEmployeesByPageRequest(pageable);
     }
    • 페이지네이션 처리를 위해 리턴 타입을 Page 객체로 만들어주자
    • 실제로 페이지네이션을 처리하기 위해서는 Service 계층에 페이지네이션 처리를 위임하자
    • Request 파라미터로 pageable 인수를 넘겨 Request 시 파라미터로 페이지에 옵션을 걸 수 있도록 해주자

Service 계층

  1. Service 계층 DI

     @Service
     public class EmployeesService {
    
             EmployeesRepository employeesRepository;
    
         public EmployeesService(EmployeesRepository employeesRepository) {
             this.employeesRepository = employeesRepository;
         }
     }
    • Service 계층은 Controller와 Repostiory를 이어주는 역할이므로 Repsitory에 대한 의존성을 주입
  2. Service 계층에서 페이징 처리하기

     public Page<EmployeesEntity> FindEmployeesByPageRequest(Pageable pageable) {
         return employeesRepository.findAll(pageable);
     }
    • FindEmployeesByPageRequest를 요청한 Controller에게 JpaRepository의 구현체인 Repository에게 findAll(Pageable pageable) 을 요청하여 결과값을 리턴

Repository 계층

  1. JpaRepository 상속

     @Repository
     public interface EmployeesRepository extends JpaRepository<EmployeesEntity, Integer> {
     }
    • Repository 계층은 JpaRepository 를 상속받아놓기

SQL Logging

  • 아무런 옵션없이 End Point에 기본 요청할 떄

      Hibernate: 
          select
              employeese0_.emp_no as emp_no1_0_,
              employeese0_.birth_date as birth_da2_0_,
              employeese0_.first_name as first_na3_0_,
              employeese0_.gender as gender4_0_,
              employeese0_.hire_date as hire_dat5_0_,
              employeese0_.last_name as last_nam6_0_ 
          from
              employees employeese0_ limit ?
      Hibernate: 
          select
              count(employeese0_.emp_no) as col_0_0_ 
          from
              employees employeese0_
  • 페이지네이션 정보를 요청할 떄

      GET "/employees?page=1&size=5", parameters={masked}
      Hibernate: 
          select
              employeese0_.emp_no as emp_no1_0_,
              employeese0_.birth_date as birth_da2_0_,
              employeese0_.first_name as first_na3_0_,
              employeese0_.gender as gender4_0_,
              employeese0_.hire_date as hire_dat5_0_,
              employeese0_.last_name as last_nam6_0_ 
          from
              employees employeese0_ limit ?,
              ?
      Hibernate: 
          select
              count(employeese0_.emp_no) as col_0_0_ 
          from
              employees employeese0_
728x90
반응형

'Frame Work > Spring Boot' 카테고리의 다른 글

[Study] Interceptor와 Servletfilter  (0) 2021.12.08
[JWT] SpringBoot에서 JWT 발급과 검증처리  (0) 2021.12.08
[Spring Boot] Getter, Setter  (0) 2021.06.20
[Spring Boot] 시작하기  (0) 2021.06.20