JPA/Querydsl

Querydsl 13 - 조회 API 컨트롤러 개발

킹차니 2022. 1. 22. 10:11

조회 API 컨트롤러 개발

 

편리한 데이터 확인을 위해 샘플 데이터를 추가할 것이다. 샘플 데이터 추가가 테스트 케이스 실행에 영향을 주지 않도록 다음과 같이 프로파일을 설정하자.

spring:
  profiles:
    active: local

현재 프로젝트의 application.yml을 보면 아래와 같다.(main의 yml)

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/datajpa
    username: king
    password:
    driver-class-name: org.h2.Driver
  profiles:
    active: local #local

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true

logging.level:
  org.hibernate.SQL: debug
  org.hibernate.type: trace

 

그리고 test디렉토리 안에 resources 디렉토리를 만든 뒤, 위의 yml파일을 복사하여 붙여넣기 한다.

현재 yml파일은 main안에 하나, test 안에 하나씩 있는 것이다. 그리고 test의 profile.active: test로 바꿔준다.

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/datajpa
    username: king
    password:
    driver-class-name: org.h2.Driver
  profiles:
    active: test # active가 test임!!!!!

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true

logging.level:
  org.hibernate.SQL: debug
  org.hibernate.type: trace

위의 test안에 존재하는 yml은 spring.profiles.active: test임에 주의하자.

 

 

이제 조회 API 호출 시 데이터를 미리 테이블에 넣어 두기 위해 아래와 같은 InitMember를 만든다.

@Profile("local") /*local로 설정*/
@Component
@RequiredArgsConstructor
public class InitMember {

    private final InitMemberService initMemberService;

    @PostConstruct
    public void init(){
        initMemberService.init();
    }

    @Component
    static class InitMemberService{
        @PersistenceContext
        private EntityManager em;

        @Transactional
        public void init() {
            Team teamA = new Team("teamA");
            Team teamB = new Team("teamB");

            em.persist(teamA);
            em.persist(teamB);

            for (int i = 0; i < 100; i++) {
                Team selectedTeam = i%2 == 0 ?  teamA : teamB;
                em.persist(new Member("member"+i, i, selectedTeam));
            }
        }
    }
}

@Profile("local") : 현재 main 하위의 spring.profiles.active: local이라 되어 있다. 하여 스프링 부트를 실행하면 위의 InitMember가 빈으로 등록되로 @PostConstruct의 init메서드가 수행되면서 Member 100명이 insert될 것이다.

하지만 test에는 spring.profiles.active: test이므로 위의 InitMember가 등록되지 않는다.

 

이제 아래와 같이 조회용 api를 만들어 보았다. 쿼리 스트링으로 condition을 추가할 수 있다.

(memberJpaRepository.search 메서드는 여기를 참고)

@RequiredArgsConstructor
@RestController
public class MemberController {

    private final MemberJpaReposiotory memberJpaReposiotory;

    @GetMapping("/v1/members")
    public List<MemberTeamDto> searchMemberV1(@ModelAttribute MemberSearchCondition condition) {
        return memberJpaReposiotory.search(condition);
    }

}

 이제 요청을 날려볼 차례다.

 

해당 멤버의 team이름이 teamB이고, 나이가 15살 이상, 20살 이하인 member 조회 요청

 

응답:

우리가 원했던 결과를 아주 잘 가져온 것을 볼 수 있다.

 

 

 

 

 

김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.