Closed dasd412 closed 2 years ago
db를 확인해보면, 기존 엔티티들엔 amount_unit 이 null로 되어 있다.
java enum에 대해 조사해보니 enum의 valueOf()메서드의 경우, 파라미터인 name이 null이면 null pointer exception을 던진다. 서버의 로그를 보아도 null pointer exception이 확인되었다. 그리고 db에는 기존 데이터들이 잘 유지되고 있었다.
해결한 방법은 다음과 같다.
새로운 enum name을 추가한다.
public enum AmountUnit {
/* 개수 */
count,
/* 그램 */
g,
/* 킬로그램 */
kg,
/* 리터 */
L,
/* 밀리리터 */
mL,
/* 수량 단위 없을 경우 */
NONE
}
2. 그다음 null인 amount_unit 들을 전부 변경했다.
update food
set amount_unit = 'NONE' where amount_unit is null
참고로, 일괄 변경을 db 단에서 하려면 safe update mode를 해제해놓고 해야 한다.
해보니 null pointer exception 없이 다시 잘 나오긴 한다.
하지만, 개인적으로 아쉬운 점이 있다. 개발 초기 단계니까 이러한 db 일괄 변경이 가능한 것이다. 데이터가 얼마 없고 대부분 테스트 데이터라 망정이지 , 잘 갖춰진 서비스에서 이러한 일을 하는 것은 리스크가 클 것이다.
db 데이터 자체를 바꾸는 것은 뭔가 좀 그렇다. db 단에서 문제가 발생하는 것이 아니라 java enum의 valueOf() 문제, 즉 자바 어플리케이션 단에서 발생하는 것이다. 따라서 발생한 레이어에서 해결하는 것이 더 적합해보인다.
https://stackoverflow.com/questions/30707621/spring-jpa-default-value-for-enum-field-in-enum 위 링크를 참고해서
@Enumerated(EnumType.STRING)
@Column(columnDefinition = "varchar(32) default 'NONE'")
private AmountUnit amountUnit = AmountUnit.NONE;
와 같이 적용하였는데 빌드를 다시 해도 ddl update가 안된다.
흠... 어쩔 수 없이 다시 원래 방안을 하기로 선택해야겠다. 어차피 null이니까 의미가 없던 값이기도 하니..?
라는 enum 추가하였더니 기존 엔티티들에서 404 에러가 발생한다.