오봉이와 함께하는 개발 블로그

Querydsl - 조회 API 컨트롤러 개발 본문

BE/JPA

Querydsl - 조회 API 컨트롤러 개발

오봉봉이 2022. 9. 20. 01:43
728x90

조회 API 컨트롤러 개발

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

프로파일 설정
src/main/resources/application.properties

spring.profiles.active=local

테스트는 기존 application.properties를 복사해서 다음 경로로 복사하고, 프로파일을 test로 수정
src/test/resources/application.properties

spring.profiles.active=test

이렇게 분리하면 main 소스코드와 테스트 소스 코드 실행시 프로파일을 분리할 수 있다.

샘플 데이터 추가

@Profile("local")
@Component
@RequiredArgsConstructor
public class InitMember {

    private final InitMemberService initMemberService;

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

    @Component
    static class InitMemberService {
        @PersistenceContext
        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") 설정한 프로파일을 통해 local에서만 실행되도록 설정했다.

@PostConstruct메소드 init()을 사용하지 않고 그대로 사용하는 방법도 있지 않을까?
하지만, 스프링 라이프 사이클상 @PostConstruct@Transactional을 같이 사용할 수 없기 때문에 따로 메소드를 만들어서 실행했다.

그대로 사용(불가능한 방법)

@PostConstruct
@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));
    }
}

조회 컨트롤러

@RestController
@RequiredArgsConstructor
public class MemberController {

    private final MemberJpaRepository memberJpaRepository;

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

결과

[
    {
        "memberId": 34,
        "username": "member31",
        "age": 31,
        "teamId": 2,
        "teamName": "teamB"
    },
    {
        "memberId": 36,
        "username": "member33",
        "age": 33,
        "teamId": 2,
        "teamName": "teamB"
    },
    {
        "memberId": 38,
        "username": "member35",
        "age": 35,
        "teamId": 2,
        "teamName": "teamB"
    }
]
인프런 김영한 지식공유자님 강의 : 실전! Querydsl
728x90
Comments