Java / / 2023. 1. 17. 17:12

[spring] 환경에 따른 설정 파일 나누기 - application.yml/@Profile

반응형

해당 글은 김영한 님의 querydsl을 수강하며 정리하려고 적는 포스팅입니다.

 

조회 API 컨트롤러 개발

편리한 데이터 확인을 위해서 샘플 데이터를 추가한다.

샘플 데이터 추가가 테스트 케이스에 영향을 주지 않도록 다음과 같이 설정 파일을 나누고 Profile을 설정할 것이다.

 

Profiles 설정 - local

  • src/main/resources/application.yml
spring:
  profiles:
    active: local

 

Profiles 설정 - test

Test는 기존의 application.yml을 복사해서 아래 경로로 복사하고, 프로파일을 test로 수정한다.

  • src/test/resources/application.yml
spring:
  profiles:
    active: test

 

이렇게 둘을 분리하면 main 소스코드와 테스트 코드 실행 시 Profile을 분리할 수 있게 된다.

 

 

샘플 데이터 추가

package study.querydsl.controller;

import jakarta.annotation.PostConstruct;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import study.querydsl.entity.Member;
import study.querydsl.entity.Team;

@Profile("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을 실행 시, local 설정 파일이 적용되게 한다.
  • @PostConstructor를 사용하여 Main 실행 시 제일 먼저 수행되도록 한다.
    • 의존성 주입이 이루어지고 난 뒤, 초기화를 수행하는 메서드이다. 해당 메서드는 class가 service로직을 수행하기 전 발생한다.
    • Bean LifeCycle에서 단 한 번만 수행된다는 것을 보장한다. 여러 번 초기화되는 것을 방지할 수 있다.
  • @PostConstructor와 @Transactional은 분리가 되어야 한다
    • spring 라이프 사이클이 다르기 때문에 같이 쓰면 안 된다.

 

조회 컨트롤러 작성

package study.querydsl.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import study.querydsl.dto.MemberSearchCondition;
import study.querydsl.dto.MemberTeamDto;
import study.querydsl.repository.MemberJpaRepository;

import java.util.List;

@RestController
@RequiredArgsConstructor
public class MemberController {

    private final MemberJpaRepository memberJpaRepository;

    @GetMapping("/v1/members")
    public List<MemberTeamDto> searchMemberV1(MemberSearchCondition condition) {
        return memberJpaRepository.search(condition);
    }
}
  • 조회 컨트롤러를 작성했으니 애플리케이션을 실행하고 예제를 Postman으로 테스트해본다.
  • http://localhost:8080/v1/members?teamName=teamB&ageGoe=31&ageLoe=35

 

결과

[
    {
        "memberId": 32,
        "username": "member31",
        "age": 31,
        "teamId": 2,
        "teamName": "teamB"
    },
    {
        "memberId": 34,
        "username": "member33",
        "age": 33,
        "teamId": 2,
        "teamName": "teamB"
    },
    {
        "memberId": 36,
        "username": "member35",
        "age": 35,
        "teamId": 2,
        "teamName": "teamB"
    }
]

 

참고

아래 포스팅을 보면 위에서 사용한 Repository에 해당하는 내용을 확인할 수 있습니다.

 

 

[Querydsl] 동적 쿼리와 성능 최적화 조회 - where 조건 절 파라미터

해당 글은 김영한 님의 querydsl을 수강하며 정리하려고 적는 포스팅입니다. 해당 부분은 앞서 포스팅한 DTO, Builder를 사용한 조회 포스팅에서 추가로 수정한 것이다. 먼저 아래 게시글을 참고하면

jjunn93.com

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유