문제
•
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 타입을 몰랐고, 그래서 오류가 발생했다.
◦
테스트 코드의 절반이 실패가 되었다.
해결방안
•
•
먼저, 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
복사