이 글은 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 책을 참고하여 작성되었습니다.
PostsRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
아주 간단하게 annotation 없이도 생성이 가능하다. 그저 JpaRepository<Entity 클래스, PK 타입>을 상속하는 인터페이스를 만들면 CRUD 메서드가 자동으로 생성된다.
그리고 꼭 Entity 클래스(여기서는 Posts.java)가 함꼐 위치해야한다. 따라서 도메인 패키지에서 함께 관리한다.
save, findAll 기능을 테스트 하는 유닛 테스트 코드를 작성해보자.
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@AfterEach
public void cleanup() {
postsRepository.deleteAll();
}
@Test
public void 게시글저장_불러오기() {
//given
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("chaejm55@gmail.com")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
@Test
public void BaseTimeEntity_등록() {
//given
LocalDateTime now = LocalDateTime.of(2019, 6, 4, 0, 0, 0);
postsRepository.save(Posts.builder()
.title("title")
.content("content")
.author("author")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
System.out.println(">>>>>>>>> createDate="+posts.getCreatedDate()+", modifiedDate="+posts.getModifiedDate());
assertThat(posts.getCreatedDate()).isAfter(now);
assertThat(posts.getModifiedDate()).isAfter(now);
}
}
@AfterEach
: Junit4에서는 @After
로 사용되었다. 단위 테스트가 끝날 때마다 수행되는 메서드를 지정하며 테스트간 데이터 침범을 막기위해 사용된다. h2에 남은 데이터를 삭제해 테스트 실패를 방지해준다.postsRepository.save
: 테이블 posts에 insert/update 쿼리를 실행한다.postsRepository.findAll
: 테이블 posts에 있는 모든 데이터를 조회해온다.src/main/resources/application.properties에 spirng.jpa.show_sql=true
를 사용하면 콘솔에서 쿼리 로그를 확인할 수 있다. 또한 이 쿼리로그를 MySQL 버전으로 변경하려면 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
를 입력하면 된다.