dasd412 / RemakeDiabetesDiaryAPI

혈당일지 api 리메이크
https://www.diabetes-diary.tk/
1 stars 0 forks source link

음식 수량 추가 후 기존 일지 엔티티 404 에러 발생 #46

Closed dasd412 closed 2 years ago

dasd412 commented 2 years ago
public enum AmountUnit {
    /* 개수 */
    count,

    /* 그램 */
    g,

    /* 킬로그램 */
    kg,

    /* 리터 */
    L,

    /* 밀리리터 */
    mL
}

라는 enum 추가하였더니 기존 엔티티들에서 404 에러가 발생한다.

dasd412 commented 2 years ago

db를 확인해보면, 기존 엔티티들엔 amount_unit 이 null로 되어 있다.

java enum에 대해 조사해보니 enum의 valueOf()메서드의 경우, 파라미터인 name이 null이면 null pointer exception을 던진다. 서버의 로그를 보아도 null pointer exception이 확인되었다. 그리고 db에는 기존 데이터들이 잘 유지되고 있었다.

dasd412 commented 2 years ago

해결한 방법은 다음과 같다.

  1. 새로운 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를 해제해놓고 해야 한다.
dasd412 commented 2 years ago

해보니 null pointer exception 없이 다시 잘 나오긴 한다.

하지만, 개인적으로 아쉬운 점이 있다. 개발 초기 단계니까 이러한 db 일괄 변경이 가능한 것이다. 데이터가 얼마 없고 대부분 테스트 데이터라 망정이지 , 잘 갖춰진 서비스에서 이러한 일을 하는 것은 리스크가 클 것이다.

dasd412 commented 2 years ago

db 데이터 자체를 바꾸는 것은 뭔가 좀 그렇다. db 단에서 문제가 발생하는 것이 아니라 java enum의 valueOf() 문제, 즉 자바 어플리케이션 단에서 발생하는 것이다. 따라서 발생한 레이어에서 해결하는 것이 더 적합해보인다.

dasd412 commented 2 years ago

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가 안된다.

dasd412 commented 2 years ago

흠... 어쩔 수 없이 다시 원래 방안을 하기로 선택해야겠다. 어차피 null이니까 의미가 없던 값이기도 하니..?