Soft Delete가 정상작동하는지 확인하기위해 @DataJpaTest를 활용해 h2 DB를 사용했다.
이 전 포스팅 참고
잘 동작하는지 확인하기위해 TestCode를 작성했다.
@DataJpaTest
class PostRepositoryTest {
@Autowired
PostRepository postRepository;
@Autowired
UserRepository userRepository;
@Test
@DisplayName("soft delete 테스트")
void post_softDelete_success() {
//Post에 적용할 user를 생성
User user = User.builder()
.userName("userName")
.password("password")
.role(UserRole.ROLE_USER)
.build();
//user 저장
User saveUser = userRepository.save(user);
//Post 저장
Post post = Post.builder()
.title("test")
.body("softDeleteTest")
.user(saveUser)
.build();
//글쓰기
Post savePost = postRepository.save(post);
//게시글 확인
assertEquals(postRepository.count(),1L);
assertEquals(savePost.isSoftDeleted(),false);
//게시글 삭제
savePost.deleteSoftly(LocalDateTime.now());
//게시글 삭제 확인
assertEquals(postRepository.count(),0L);
assertEquals(savePost.isSoftDeleted(),true);
}
}
그리고 테스트를 돌렸더니... 역시나 에러발생😂
TestCode를 작성하면 유독 에러가 많이나는것 같다.
그래서 더 오기가 생긴다ㅎㅎ
could not prepare statement; SQL [insert into user (id, created_at, deleted_at, last_modified_at, password, role, user_name) values (default, ?, ?, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into user (id, created_at, deleted_at, last_modified_at, password, role, user_name) values (default, ?, ?, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
그리고 더 내려가다보면
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "insert into [*]user (id, created_at, deleted_at, last_modified_at, password, role, user_name) values (default, ?, ?, ?, ?, ?, ?)"; expected "identifier"; SQL statement:
insert into user (id, created_at, deleted_at, last_modified_at, password, role, user_name) values (default, ?, ?, ?, ?, ?, ?) [42001-214]
검색해 봤을때 테이블을 못찾거나, 필드를 못찾는다는거였는데 왜 User에서 에러가 날까? 라는 생각을 했다.
그래서 H2 DB에서 User가 예약어인지검색을 해보았다.
그결과 H2 데이터베이스 2.1.212 버전에서 user 키워드가 예약어로 지정되어 있어서 user 테이블 생성이 불가능하다고 한다.
@Table 어노테이션을 이용해 바꾸면 된다.
JPA 쓰는 이유가 자바 개발자가 DB에 무관심하기 위해서라서
table 명을 자바 애플리케이션 개발단계에선 신경안써도 된다.
spring:
datasource:
url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER
필자는 1번의 방법으로 해결하였다.
간단한 문제였는데 많은 시간을 소비했다...