문제
H2DB 및 MySQL 타입 차이 이슈
JPA에서 String 타입만 선언 시, 기본적으로 MySQL에서는 TINYTEXT 타입으로 생성이 된다.
TINYTEXT 타입은 최대 255자의 문자열까지 저장할 수 있다.
Gifticon 엔티티의 gifticonUrl 필드는 TINYTEXT 타입으로 생성이 되어 있어서, 긴 길이의 URL은 저장이 되지 않는 문제가 있었다.
@Column(name = "gifticon_url")
private String gifticonUrl;
최초의 코드는 다음과 같다.
@Column(name = "gifticon_url", columnDefinition = "TEXT")
private String gifticonUrl;
그리고 변경한 코드는 다음과 같다.
이는 DB에 생성될 필드의 타입을 TEXT 로 설정하라는 의미다.
하지만, 테스트에서 사용되는 H2 DB는 이 TEXT 타입을 몰랐고, 그래서 오류가 발생했다.
- 테스트 코드의 절반이 실패가 되었다.
해결
우선, 당시의 PR 주소이다.
먼저, columnDefinition 속성을 사용하여 특정 DB에 종속적인 타입을 쓰기보다, @Lob 어노테이션을 사용하였다.
@Lob
@Column(name = "gifticon_url")
private String gifticonUrl;
하지만 이것만으로는 해결이 되지 않았다.
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 접속허용여부
아직 generate-ddl, ddl-auto 를 변경하니 해결이 되었는지 이유를 몰라서, 추후 더 알아볼 예정이다.
+ 튜터님께서는 보통 테스트에도 H2가 아닌, 본 서비스의 DBMS와 맞춘다고 한다. 그러니까 테스트용 DB도 MySQL로 맞추는 것이 좋다고 하셨다.
+ 위 문제는 columnDefinition으로 TEXT로 기입을 해주기보다, 아래처럼 최종 변경되었다.
@Column(name = "gifticon_url", length = 1024)
private String gifticonUrl;
이리 간단한 해결책을 왜 생각 못 했을꼬..
그리고 이후로 varchar와 text 타입에 대해, 그리고 tinytext mediumtext 등에 대해 더 알아봐야 겠다.
'TIL ✍️' 카테고리의 다른 글
24년 1월 23일(화요일) - 75번째 TIL (0) | 2024.01.31 |
---|---|
24년 1월 22일(월요일) - 74번째 TIL : 쿼리 최적화 (0) | 2024.01.31 |
24년 1월 18일(목요일) - 73번째 TIL : RDS 타임존 설정 (1) | 2024.01.31 |
24년 1월 17일(수요일) - 72번째 TIL (2) | 2024.01.18 |
24년 1월 16일(화요일) - 71번째 TIL (0) | 2024.01.18 |