2022. 7. 19. 23:33ㆍ개발공부 기강잡자/Java&Spring
JUnit 의 테스트 코드를 통해서 데이터를 삽입하는데 DB에 저장되지 않는다..!
왤까..!
실습 코드
@Test
void testJpa() {
for (int i = 1; i <= 300; i++) {
String subject = String.format("테스트 데이터입니다:[%03d]", i);
String content = "내용무";
this.questionService.create(subject, content);
}
}
DB의 Question 테이블에 300개의 데이터를 넣는 코드이다.
그런데 db에 데이터가 하나도 들어가지 않았다.
내 코드
@Transaction
@Test
void testJpa() {
for (int i = 1; i <= 300; i++) {
String subject = String.format("테스트 데이터입니다:[%03d]", i);
String content = "내용무";
this.questionService.create(subject, content);
}
}
@Transactional 이 문제였다...!
@Transactional을 지우고 실행했더니 300개의 데이터가 무사히 insert 됐다.
이유가 뭘까?
우선 @Transactional 어노테이션에 대해 알아봐야 할 것 같다.
@Transactional Annotation
1. 트랜잭션이란
데이터베이스에서 한번에 처리되어야할 연산의 단위를 의미한다.
"All or Nothing"이라고도 하는데, 일련의 데이터베이스 연산을 수행하고 나서 성공적이면 Commit을 통해 데이터베이스에 반영하거나, 중간에 실패하면 연산들을 Rollback하여 데이터베이스에 반영되지 않도록 한다.
2. 사용법
메소드, 클래스, 인터페이스 위에 @Transactional을 작성하여 사용하는 것이 일반적
적용된 범위에서는 트랜잭션 기능이 적용되어 자동으로 commit / rollback 한다.
3. 이게 왜 문제였는가?
JUnit에서는 @Transactional 어노테이션이 있으면 트랜잭션 후에 Commit이 아니라 Rollback을 시킨다. 따라서 insert를 위해 데이터 300개 create하는 연산이 rollback 되었기 때문에 db 상에 기록이 되지 않은 것 같다.
이전에 @Transactional 어노테이션을 사용한 이유는 JUnit 코드에서 데이터 2건을 조회할 때, Lazy 방식(필요한 시점에 데이터를 가져오는 방식)을 사용하면서 DB의 세션이 종료되지 않기 위해서 사용했다. 그때는 데이터를 조회해서 출력하기 위해서였기때문에 @Transactional을 써서 Rollback되어도 문제가 없었지만, insert 하는 경우에는 Rollback되면 db에 반영되지 않기 때문에 주의해야할 것 같다.
간단하게 @Transactional 어노테이션에 대해 살펴보았고, @Test 코드에서 왜 오류가 났는지 알아보았다.
다음번엔 자세하게 @Transaction의 쓰임에 대해 공부하도록 하자!
(위 내용이 틀릴 수도 있습니다. 문제가 있을 경우, 댓글을 통해 알려주시길 바랍니다.)
'개발공부 기강잡자 > Java&Spring' 카테고리의 다른 글
[Spring] thymeleaf - Error resolving template 에러 (0) | 2022.08.20 |
---|---|
[Spring] STS에서 git clone 으로 프로젝트 import 하기 (0) | 2022.08.05 |
[Spring Boot] 2022.07.07 ~ 2022.07.15 점프 투 스프링 실습 회고 (0) | 2022.07.19 |
[Spring Boot] @Annotation 정리 (0) | 2022.07.14 |
[Spring/JPA] H2 Database 설정 - Windows 홈디렉터리에 파일 생성하기 | h2-console 접속 오류 (0) | 2022.07.11 |