IT/디버깅

[디버깅] jdbSqlSyntaxErrorException Table not found 이슈 해결

happy_life 2023. 4. 5. 15:40

이번 포스팅에서는 JPA 사용 중 발생한 jdbSqlSyntaxErrorException Table not found  이슈를 해결하는 과정을 포스팅 하려 합니다.

 

 

1. Table not Found 이슈 상황

@SpringBootTest
class LatterServiceTest {
    @Autowired
    MemberService memberService;

    @Autowired
    LatterService latterService;

    @Autowired
    EntityManager em;

    @Autowired
    TransactionTemplate transactionTemplate;

    @AfterEach
    public void 지우기() {
        System.out.println("======@AfterEach======");
        memberService.deleteAll();
    }

    @Test
    public void 쪽지저장_조회ByMember() {
        transactionTemplate.execute(status -> {
            //given
            Member member = new Member();

            Latter latter1 = new Latter();
            Latter latter2 = new Latter();

            member.addLatter(latter1);
            member.addLatter(latter2);

            memberService.join(member);

            //when
            em.flush();
            em.clear();

            ArrayList<Long> ids = new ArrayList<>();
            ids.add(latter1.getId());
            ids.add(latter2.getId());

            //then
            Member findMember = memberService.findOneById(member.getId());
            List<Latter> findLatters = latterService.findAllByMemberId(findMember.getId());

            // 개수
            assertEquals(2, findLatters.size());

            for (Latter latter : findLatters) {
                assertTrue(ids.contains(latter.getId()));
            }

            return null;
        });
    }
   }

addLatter() 는 Member에서 역방향으로 참조하고 있기에 만든 편의 메서드 입니다. memberService에서 join을 하면 cascade 옵션이 걸려있기 때문에 latter도 insert가 나가야하는데 JdbcSQLSyntaxErrorException: Table "LATTER" not found 이슈가 발생한 것입니다.

 

 

 

2. Table not Found 이슈 해결

1. columnDefinition을 붙여 문제를 해결하려 하였지만, 여전히 Table을 생성하지 못했습니다.

@Column(columnDefinition = "BOOLEAN")
private boolean check;

 

2. @Column 어노테이션에 name까지 추가하고 문제를 해결하였습니다.

@Column(name = "isCheck", columnDefinition = "BOOLEAN")
private boolean check;

 

 

3. Table not Found 이슈 원인

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "BOOLEAN" not found; SQL statement:

    create table latter (
       latter_id bigint generated by default as identity,
        body varchar(255),
        check boolean,
        member_id bigint,

 

을 보니 BOOLEAN 타입을 DB에서 인식하지 못해 테이블이 만들어지지 못했고 이에 따라 이슈가 발생할 수 있다고 합니다.

 

하지만 실제로 h2 콘솔에서 boolean 타입이 가능한지 체크한 결과 가능한 것으로 확인했습니다.

boolean 가능

 

 

그렇다면 왜?

단순히 boolean으로만 하면 JPA에서 인식하지 못하기 때문입니다. 어떤 데이터 베이스에서는 boolean이 bit 혹은 number로 저장되는 한편, 다른 쪽에서는 String으로 저장되기도 하기 때문입니다. 특히 현재 사용하고 있는 h2에서는 boolean을 저장하기 위해 bit인 0,1 또는 BOOLEAN 타입으로 true, false로 저장할 수 있도록 이 둘을 모두 지원합니다. 따라서 특정하게 BOOLEAN 옵션을 주지 않았기 때문에 테이블을 생성할 수 없었던 것입니다.

 

 

 

 

추가 판단

서버 배포시에는 RDS로 mySql을 사용할 예정인데 문제가 없을까에 대해 고민해보았습니다. 물론 MySQL에서는 boolean 타입을 h2 처럼 BOOLEAN을 지원합니다. 따라서 예정처럼 mysql로 배포할 때는 큰 문제가 없을 것이라 판단하였습니다. 하지만 배포 상황에서 어떤 DB를 사용할 지가 변경될 수 있으므로 Boolean 타입은 사용하지 않는 것이 좋겠다는 판단을 하였습니다. 그래서 Enum타입으로 변경해 사용하기로 결정하였습니다. 변경 후의 Entity는 아래와 같습니다.

 

Latter.Class/Enum