@Enumerated와 hibernate 타입 검증 관련 해결을 어떻게 해야할지 모르겠습니다.
4175
작성한 질문수 1
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
안녕하세요 강의에서 설명해주신 대로 따라하려고 했습니다.
단 , ddl-auto : create 대신 미리 SQL 문으로 테이블을 생성해놓고 ddl-auto: validate로 실행시 에러가 납니다. 이는 실제로 배운 것을 사용할 수 없는 아주 치명적인 부분이라고 생각하여 질문을 드립니다.
[문제 설명]
강의에서 설명해주신대로 위와 같이 Enumerated 를 사용하여 status 를 정의 하였습니다.
말씀해주신대로 value = EnumType.STRING을 사용했습니다.
UserStatus 는 당연히 enum 타입으로 했구요.
@Column(name = "status", length = 32) @Enumerated(value = EnumType.STRING)
private UserStatus status;
이때 status 가 있는 테이블은 아래와 같은 SQL문으로 생성하였습니다.
VARCHAR(255)로 생성한 점을 자세히 봐주세요!
dbms: MySQL
CREATE TABLE user
(
`id` BIGINT NOT NULL AUTO_INCREMENT,
`status` VARCHAR(255) NOT NULL check (status in ('CREATED', 'WITHDRAW')),
PRIMARY KEY (id)
);
또한 application-yml 에는 아래와 같이 ddl-auto 를 validate 로 하였습니다.
jpa:
hibernate:
ddl-auto: validate
properties:
hibernate:
format_sql: true
show-sql: true
하지만 이를 실행하면 아래와 같은 status의 타입 오류 에러가 나옵니다.
Schema-validation: wrong column type encountered in column [status] in table [user]; found [varchar (Types#VARCHAR)], but expecting [enum ('created','withdraw') (Types#ENUM)]이는 db의 status 의 타입이 enum 이길 기대했지만 실제로는 VARCHAR이기 때문에 에러가 발생한다는 것입니다. (ddl-auto의 validate에 의해 검증 수행)
MySQL에서 타입에 enum을 적용하면 해결되지만 쓰는 것을 최대한 지양해야 한다고 알고 있습니다.
따라서 mysql 의 status 컬럼의 타입을 enum 대신 column 타입을 varchar(255)로 두고 사용하려고하는데 위와 같은 에러가 나서 실행이 되지 않습니다.
ddl-auto : none 으로 설정하면 임시적으로 실행은 할 수 있지만 validate 로 검증을 항상 진행하려고 합니다.
[질문 내용]
1. mysql의 타입을 varchar로 두고, ddl-auto: validate 를 사용하면서 에러 없이 실행할 수 있는 방법이 궁금합니다.
2. ddl-auto : create로 하게 되면 자동 생성되는 sql문에서는 status에 enum 대신
create table user (
id bigint not null,
status varchar(255) check (status in ('CREATED', 'WITHDRAW')),
primary key (id)
)
위처럼 varchar로 column 속성을 주면서 validate 할때만 에러가 나는것이 이상한 것 같은데 왜 그럴까요?
3. 이를 현업에서는 어떻게 해결하고 계신지 궁금합니다.
답변 3
2
안녕하세요. 임준호님
다음과 같이 columnDefinition을 사용하시면 됩니다.
@Column(columnDefinition = "varchar(255)")
@Enumerated(EnumType.STRING) // 무조건 STRING으로 사용
private OrderStatus status; // 주문상태 [ORDER, CANCEL]감사합니다.
0
I think you can use STRING type for Enumerated annotation, and then use @Enumerated(EnumType.STRING) annotation to map the enum values to their names. This way, you can avoid the problems caused by ORDINAL type, such as changing the enum order or adding new enum values. However, you still need to validate the input values, because the user can enter anything that is a string. You can use @NotNull annotation to prevent null values, and then use @Size annotation to limit the input values to a certain length. For example, @Size(min = 4, max = 5). This way, you can reject the input values that are too short or too long. You can also use @Pattern annotation to check if the input values match a regular expression. For example, @Pattern(regexp = "ADMIN|USER"). This way, you can reject the input values that are not ADMIN or USER.
sdk 설정 오류
0
53
2
오탈자 - @Transactional
0
56
1
src/test/resources 테스트 경로 문제
0
50
1
상품 등록후 H2 db 출력 순서 바꿀 수 있나요?
0
64
1
MemberRepositoryTest 실행오류
0
81
1
boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)
1
183
2
강의 마지막 QueryDSL 사용 부분 질문있습니다
1
142
2
클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.
0
51
1
도메인 모델 패턴 vs 트랜잭션 스크립트 패턴
0
71
1
기본 생성자
0
60
1
h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.
0
103
1
멤버서비스테스트 부분에서 막힙니다.
0
165
4
실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?
0
116
1
초반에 h2 다운로드 과정 꼭 필요한가요?
0
120
2
자신 필드에도 get으로 접근하는 이유가 있을까요?
0
114
1
24분 27초 연관관계 편의 메서드 위치
0
113
1
단건 주문만 가능하게 한건 의도한 부분이신가요?
0
109
2
빌드 툴, Gradle
0
59
1
h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다
0
77
2
Repository에서 EntityManager 주입 방식 차이
0
90
1
롬복과 사용자 정의 setter 메서드
0
73
1
주문 목록 조회 fetch join 질문드립니다
0
82
1
dirty checking 질문드립니다.
0
83
1
동시성 관련 질문입니다
0
75
1





