1. PostsRepositoryTest

  1. PostsRepositoryTest 클래스 생성

    PostsRepositoryTest에서는 save, findAll 기능을 테스트함

  2. PostsRepositoryTest 작성

    PostsRepositoryTest 코드

    package com.jojoldu.book.springboot.domain.posts;
    
    import org.junit.After;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.List;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class PostsRepositoryTest {
    
        @Autowired
        PostsRepository postsRepository;
    
        @After //...1
        public void cleanup() {
            postsRepository.deleteAll();
        }
    
        @Test
        public void 게시글저장_불러오기() {
            //given
            String title = "테스트 게시글";
            String content = "테스트 본문";
    
            postsRepository.save(Posts.builder() //...2
                    .title(title)
                    .content(content)
                    .author("[email protected]")
                    .build());
    
            //when
            List<Posts> postsList = postsRepository.findAll(); //...3
    
            //then
            Posts posts = postsList.get(0);
            assertThat(posts.getTitle()).isEqualTo(title);
            assertThat(posts.getContent()).isEqualTo(content);
        }
    }
    
    1. @After

      • Junit에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정
      • 보통은 전체 테스트를 수행할 때 테스트 간 데이터 침범을 막기위해 사용
      • 여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그대로 남아 있어 다음 테스트 실행 시 테스트가 실패할 수 있다.
    2. postsRepository.save

      • 테이블 posts에 insert/update 쿼리를 실행
      • id 값이 있다면 update, 없다면 insert 쿼리가 실행
    3. postsRepository.findAll

      • 테이블 posts에 있는 모든 데이터를 조회

    별다른 설정이 없이 @SpringBootTest를 사용할 경우 H2 데이터베이스를 자동으로 실행한다.

  3. 테스트 실행

2. 실제로 실행된 쿼리는 어떤 형태일까?

실행된 쿼리 로그를 볼 수는 없을까?

쿼리 로그를 ON/OFF 할 수 있는 설정이 있다.

자바 클래스로도 구현 가능하나, 스프링 부트에서는 application.properties 등의 파일로 한 줄의 코드로 설정할 수 있도록 지원한다.

  1. application.properties 생성

  2. 콘솔에서 쿼리 로그 확인하기

  3. 옵션이 잘 적용 되었나?

    create table 쿼리를 보면 id bigint generated by default as identity라는 옵션으로 생성된다.

    이는 H2의 쿼리 문법이 적용되었기 때문

    H2는 MySQL의 쿼리를 수행해도 정상적으로 작동하기에 이후 디버깅을 위해 출력되는 쿼리 로그를 MySQL버전으로 변경해보자.

    역시 application.properties에 옵션을 추가한다.

    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
    
  4. 다시 테스트 코드 수행 후 옵션 적용 확인

Reference