프로젝트를 진행하면서, 엔티티를 설계하는 도중 추천등록의 여부를 필드로 설정해야했다. 추천된 콘텐츠인지, 추천되지 않은 콘텐츠인지 두가지 구분만 필요했기에, boolean 값으로 컬럼을 설정해주었었다.
db를 확인해보니, boolean의 경우에 db에 저장되는 값이 내가 의도하였던 TRUE / FALSE가 아닌것이었다.
공식 문서에 따르면, Boolean 타입을 생각하고 컬럼을 생성하면 tinyint(1)로 생성. 하지만 boolean인 원시값으로 필드를 저장하여서 나의 경우는 bit(1)로 생성되었다.
Spring Data JPA가 메서드 이름을 해석하여 동적으로 쿼리를 생성하게 되는게 명명규칙이다. 여기서 중요한 점은 boolean 타입이 tinyint로 매핑될 때, true는 1로, false는 0으로 저장된다는 것이다.
하지만 bit(1)로 저장된 boolean 필드는 1 또는 0으로 저장되긴 하지만, 이것이 TRUE 또는 FALSE 값으로 자동으로 해석되지 않는다.
따라서 Spring Data JPA가 메서드 이름을 기반으로 쿼리를 생성할 때findByIsRecommendedTrue()
메서드는 자동으로 할당되지 않았던 것이다.
해결방법 2가지를 생각해보았다.
1. jpa 매핑에 따라서 메소드명을 변경해주는 것.
List<Tag> findByIsRecommended(boolean isRecommended);
1번의 방식으로 수정했을때, 나가게 되는 쿼리문은 이렇다.
(MySQL에서는 TRUE를 1로, FALSE를 0으로 저장하는 경우도 있다.)
SELECT * FROM Tag WHERE is_recommended = TRUE;
2. boolean을 사용하지 않는 방법.
- Boolean 사용
- enum 타입 사용
나의 경우는 null 값을 허용해주고 싶지 않아서 기존 Boolean이 아닌 boolean을 택했었고, 해당 true/false 여부를 다른 클래스에서도 사용해주고 있기 때문에, 확장성과 프로젝트 성격을 고려하여 enum 타입을 사용하기로 하였다.