[Spring/TIL] columnDefinition = "TINYINT(1)" 사용 시 주의할 점

resilient

·

2023. 4. 12. 21:00

728x90
반응형

진행 중인 사이드 프로젝트에서 유저의 활성상태를 체크하기 위해 Member라는 엔티티에 activated 라는 Boolean 타입의 column을 추가해서 사용하고 있습니다.

 

local에서 테스트를 할 경우 DB는 h2를 사용하고 있었는데요. 

 

굉장히 오랜시간동안 Error executing DDL ~ 에러가 발생했고 해결한 과정을 짧게라도 기록해 놓으려고 합니다.

 

결과부터 정리하자면, H2 데이터베이스에서는 TINYINT 타입을 지원하지 않습니다.

 

먼저 Member 엔티티의 코드를 보겠습니다.

 

@Getter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Member extends BaseTimeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 50, unique = true)
    private String email;

    @Column(nullable = false, length = 20, unique = true)
    private String password;

    @Column(nullable = false, length = 20, unique = true)
    private String nickname;

    @Column(name = "profile_image")
    private String profileImage;

    @Column(name = "phone_number")
    private String phoneNumber;

    @Enumerated(EnumType.STRING)
    private Role role;

    @Column(columnDefinition = "TINYINT(1)")
    private Boolean activated;

    @OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
    private List<Post> postList = new ArrayList<>();

    @OneToMany(mappedBy = "member")
    @Builder.Default
    private List<MemberOrganization> memberOrganizationList = new ArrayList<>();

    public Member(String email, String password) {
        this.email = email;
        this.password = password;
    }
}

 

여기서 activated를 보면 columnDefinition = "TINYINT(1)" 옵션을 붙여줬습니다.

 

왜 붙여줬냐? 라고 하면 이전 프로젝트에서는 h2를 사용하지 않고 local에서도 mysql로 연결해서 사용을 했었고 TINYINT 타입을 사용했기 때문이죠.

 

여기서 문제가 발생했습니다. 아래광 같은 ddl 관련 에러가 계속해서 발생했고, 이유를 전혀 알 수 없었죠.

 

결국 JPA가 테이블 생성을 위해 날려주는 쿼리를 직접 h2 콘솔에 찍어보고 난 이후에 해결할 수 있었습니다.

 

h2에서는 TINYINT타입이 매핑이 안되더군요...

 

아래 스택오버플로우를 참고했습니다.

 

Getting MappingException when reading TINYINT value from H2 database as boolean/Boolean

I am using R2DBC H2 for integration testing my reactive application (which is based on Spring Webflux , Java). Versions Driver: io.r2dbc:r2dbc-h2:0.8.4.RELEASE (Spring boot 2.3.2.RELEASE) Java: 11...

stackoverflow.com

 

결국에는 아래와 같이 ColumnDefintion 옵션을 지워줬습니다. h2 데이터베이스에는 true, false 값이 들어가게 되죠.

 

@Column
private Boolean activated;

 

정리

 

이번에는 짧게 에러를 마주하고 해결하는 과정을 기록해 봤습니다.

에러를 보고 구글링을 해서 원인을 파악하는 방법 또한 매우 좋은 방법이지만 이번에 깨달은 사실은 디버깅의 중요성입니다.

 

구글링을 통해서 원하는 정보를 한 번에 얻으면 좋겠지만 그렇지 않은 경우를 개발을 하다 보면 반드시 마주하게 됩니다.

 

그럴 경우 이 에러를 해결하기 위해 어디서부터 들여다봐야 할지 파악하는 능력이 좋은 개발자가 되기 위해서는 반드시 필요하다고 생각이 들었습니다.

 

이번 에러도 'h2콘솔에 직접 쿼리를 날려 봐야겠다'라는 생각은 같이 프로젝트에 참여하고 있는 친구의 아이디어였습니다.

 

앞으로도 많은 에러를 마주하게 될 텐데 '에러를 해결하기 위해 어떻게 접근해서 해결해 볼까?'와 같은 유연한 사고방식을 가질 수 있도록 경험을 많이 쌓아 보려고 합니다.

반응형