@DataJpaTest - h2 DB사용시 user table 예약어 에러

Sol's·2023년 1월 5일
0

오류

목록 보기
8/18

Sql 에러

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 테이블 생성이 불가능하다고 한다.

해결 방법

  1. User -> Users로 변경

    @Table 어노테이션을 이용해 바꾸면 된다.
    JPA 쓰는 이유가 자바 개발자가 DB에 무관심하기 위해서라서
    table 명을 자바 애플리케이션 개발단계에선 신경안써도 된다.

  2. properties.yml의 url에 NON_KEYWORDS=USER 설정 추가
spring:
  datasource:
    url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER

필자는 1번의 방법으로 해결하였다.

간단한 문제였는데 많은 시간을 소비했다...

profile
배우고, 생각하고, 행동해라

0개의 댓글