본문 바로가기
JPA/Querydsl

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

by 킹차니 2022. 1. 22.

조회 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를 바탕으로 정리하였습니다.