[JPA] H2 Database 사용시 ApplicationRunner를 이용하여 테스트 데이터 미리 넣어두는 방법.

안녕하세요. 최근 사이드 프로젝트를 하면서 JPA를 활용하고 있는데요.

JPA가 MyBatis를 추격하며 꽤 많이 채용공고나 라이브러리 검색 비율을 높여가고 있는걸로 알고있습니다.

이에 따라 저도 사이드 프로젝트에서 JPA를 활용해서 프로젝트를 진행중입니다.

 

그 중 스펙이 Spring Boot 2.2 버전, Spring Data JPA, H2 Database 를 이용하여 개발하고 있습니다.

일단 H2 데이터베이스는 Test 에서만 활용하고자 하였으나 AWS RDS 비용이 얼마나 나오게 될지 두려워서..

이미 EC2로 임시서버 배포한 후, IOS/React 웹이 붙어서 AWS 요금이 얼마나 과금될지 두려워서 H2를 쓰려고 하였습니다.

 

그렇게 발생된 문제는!

서버를 내렸다가 배포하게되면 그동안 쌓였던 데이터는 날아가게 되지요.. H2 Database는 인메모리 데이터베이스입니다. 일단 별도로 db를 구축하면 되긴 하나 그럴 정도로 서버 리소스를 잡긴 싫었고(프리티어입니다..)

임시데이터 몇건만 넣어두고 싶었습니다.

 

단지 거쳐가는 디비로만 쓰고싶었어요.!!

 

그래서 생각해낸 방법이... 같은 데이터라도 JPA를 활용하므로 maven이 스프링 부트 프로젝트를 구동할 때, 다량의 insert 가 일어나도 별 상관이 없겠다 싶었습니다.


바로 활용해서!! ApplicationRunner 인터페이스를 구현하여 프로젝트 구동시 실행되는 로직을 추가해보겠습니다.

 

@Slf4j
@Component
public class ApplicationRunnerImpl implements ApplicationRunner {

    @Autowired
    MemberRepository memberRepository;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        for(int i = 0; i < 10; i++) {
            Member member = new Member("id", "password", "name", "nickname");
            memberRepository.save(member);
        }
    }
}

다음과 같은 ApplicationRunner 구현체를 만들어줍니다. 이는 Java 파일로 따로 뺀 형태이므로 메소드 Bean 형태로 수정을 해보자면!

 

@Component
public class SomethingComponent {
    @Autowired
    private MemberRepository memberRepository;

    @Bean
    public ApplicationRunner applicationRunner() {
        return args -> {
            for(int i = 0; i < 10; i++) {
                Member member = new Member("id", "password", "name", "nickname");
                memberRepository.save(member);
            }
        };
    }   
}

이런식으로 Bean으로 등록해서 쓸 수 있습니다. 

 

사실 둘다 같은거긴한데 저같은 경우는 더미데이터가 좀 많았고 추후 사라져야했기 때문에 파일로 따로 두고 필요없게되면 삭제하고자 따로 Java 클래스 파일로 분리해두었습니다.

 


 

사실 ApplicationRunner인터페이스를 사용하는 목적은 args에 파라미터를 설정하여 해당 파라미터값으로 프로젝트에 특정 설정을 셋팅하기 위해서 사용되는 경우가 더 많습니다. 

 

하지만 어디까지나 최종적으로 어플리케이션을 돌릴때는 제외할 것이고, 당분간! 이라는 점에 주목하여 활용을 하시는 것을 추천드립니다.

댓글

Designed by JB FACTORY