[Spring] CommandLinerRunner(스프링 부트 구동 시점에 특정 코드 실행 시키기)

Ariul·2022년 8월 20일
0
post-thumbnail

Troubleshooting

문제

에러는 아니고 문제 상황을 더 효율적으로 해결할 수 있는 방법을 담았다!

상황: 다른 팀원 분이 포스트 기능을 구현하기로 함. 나는 댓글포스트 좋아요 기능을 담당함. 만들다 보니, "어랏 포스트가 미리 구현되어 있지 않으면 내 기능을 구현할 수 없잖아? 그럼 포스트 엔티티, 컨트롤러, 서비스 등등 다 만들어야 테스트 할 수 있나? 근데 커밋할 때 충돌나면 어떡해? 아, feature 브랜치를 분리해서 괜찮으려나? ..."를 고민하다 동욱님께 SOS 요청! 동욱님은 이렇게 하면 충돌이 발생할 것이므로, 포스트 엔티티만 가지고 테스트 할 수 있는 방법을 알려주셨다.

해결 과정

  • CommandLinerRunner(스프링 부트 구동 시점에 특정 코드 실행 시키기)
    CommandLineRunner 인터페이스를 구현한 클래스를 스프링 빈으로 등록하게 되면, 스프링이 초기화 작업을 마치고 나서 해당 클래스의 run(String... args) 메서드를 실행시켜주는 방법이다.

    @Bean
    public CommandLineRunner demo() {
        return (args) -> {
        };
    }

    CommandLineRunner가 @FunctionalInterface(추상 메서드가 하나인 인터페이스)이기 때문에 람다(lambda)로 변경할 수 있다.

    @SpringBootApplication
    public class InssagramApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(InssagramApplication.class, args);
        }
    
        @Bean
        public CommandLineRunner demo(PostRepository postRepository, UserRepository userRepository) {
            return (args) -> {
                userRepository.save(User.builder()
                        .email("email@inssagram.com")
                        .username("username")
                        .password("password")
                        .build());
    
                for (int i = 0; i < 5; i++) {
                    postRepository.save(Post.builder()
                            .title("title" + i)
                            .contents("contents" + i)
                            .user(userRepository.findById(1L).get())
                            .build());
                }
            };
        }
    
    }
    

    demo 메서드의 파라미터로 PostRepository와 UserRepository를 주입받고 builder를 이용해서 User와 Post 객체를 생성하면..!
    두둥-! Post 테이블이 생성되고 만든대로 값이 들어가 있다!

  • INSERT QUERY
    INSERT INTO 문과 함께 VALUES 절을 사용하여 테이블에 새로운 레코드 추가하기
    다시 Post 테이블을 확인해보면 레코드가 추가되었다!
    오케이. 이걸 요리조리 요리해서 컬럼을 추가하면 PostService랑 PostController를 만들지 않아도 내가 필요한 부분을 테스트할 수 있겠군~!

회고

원래 도메인이 분리되어 있을 땐 이런 상황이 잘 발생하지 않는데,
지금 프로젝트는 워낙 스코프가 작고 그걸 또 나누다 보니 이런 상황이 발생했다.

근데 스프링으로 간단하게 다 해결할 수 있구나~ 역시 대단한 친구.
그리고 MySQL.. 여전히 아직은 YourSQL 이지만 이제 내 걸로 만들어야지!

출처:
http://www.tcpschool.com/mysql/mysql_basic_insert
https://jeong-pro.tistory.com/206 [기본기를 쌓는 정아마추어 코딩블로그:티스토리]

profile
정성과 진심을 담아 흔적을 기록하자💡

0개의 댓글