/////
Search
Duplicate

H2DB 및 MySQL 타입 차이 이슈

기록 날짜
2024/01/20
작성자
김재윤
주제
DB
MySQL
H2DB

문제

JPA에서 String 타입만 선언 시, 기본적으로 MySQL에서는 TINYTEXT 타입으로 생성이 된다.
TINYTEXT 타입은 최대 255자의 문자열까지 저장할 수 있다.
Gifticon 엔티티의 gifticonUrl 필드는 TINYTEXT 타입으로 생성이 되어 있어서, 긴 길이의 URL은 저장이 되지 않는 문제가 있었다.
따라서, 최초의 코드는 다음과 같다.
@Column(name = "gifticon_url") private String gifticonUrl;
Java
복사
그리고 변경한 코드는 다음과 같다.
@Column(name = "gifticon_url", columnDefinition = "TEXT") private String gifticonUrl;
Java
복사
이는 DB에 생성될 필드의 타입을 TEXT 로 설정하라는 의미다.
하지만, 테스트에서 사용되는 H2 DB는 이 TEXT 타입을 몰랐고, 그래서 오류가 발생했다.
테스트 코드의 절반이 실패가 되었다.

해결방안

우선, 당시의 PR 주소이다.
먼저, columnDefinition 속성을 사용하여 특정 DB에 종속적인 타입을 쓰기보다, @Lob 어노테이션을 사용하였다.
@Lob @Column(name = "gifticon_url") private String gifticonUrl;
Java
복사
하지만 이것만으로는 해결이 되지 않았다.
application-test.yml 파일에서,
spring.jpa.generate-ddl 부분을 on 으로,
spring.jpa.properties.hibernate.ddl-auto 부분을 create 으로 변경해주니 정상적으로 테스트가 전부 통과되었다.
spring: config: activate: on-profile: test # JPA jpa: database: h2 generate-ddl: on defer-datasource-initialization: true properties: hibernate: ddl-auto: create auto_quote_keyword: true # 예약어 사용가능 globally_quoted_identifiers: true # 예약어 사용가능 show_sql: true # sql 로깅 generate_statistics: true # 쿼리수행 통계 format_sql: true # SQL문 정렬하여 출력 highlight_sql: true # SQL문 색 부여 # DB datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb;MODE=MySQL;NON_KEYWORDS=user # exclude the user keyword from the list of reserved words username: sa password: h2: console: # H2 DB를 웹에서 관리할 수 있는 기능 enabled: true # H2 Console 사용 여부 path: /h2-console # H2 Console 접속 주소 settings: web-allow-others: true # 외부 배포 이후 H2 접속허용여부
Java
복사
아직 generate-ddl, ddl-auto 를 변경하니 해결이 되었는지 이유를 몰라서, 추후 더 알아볼 예정이다.
이후에 해결:
@Column(name = "gifticon_url", length = 1024) private String gifticonUrl;
Java
복사