조회 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를 바탕으로 정리하였습니다.
'JPA > Querydsl' 카테고리의 다른 글
Querydsl 15 - data jpa + query dsl 페이징 (0) | 2022.01.30 |
---|---|
Querydsl 14 - data jpa + query dsl 리포지토리 (0) | 2022.01.30 |
Querydsl 12 - 동적쿼리와 성능 최적화 조회(where 절 파라미터) (0) | 2022.01.22 |
Querydsl 11 - 순수 JPA 리포지토리와 Querydsl, 동적쿼리 Builder (0) | 2022.01.21 |
Querydsl 10 - SQL function 호출하기 (0) | 2022.01.20 |