Converter(Entity ↔ db 값 변환)
- 위와 같이 @Converter와 @Convert를 통하여 데이터베이스에 저장된 특정 값을 객체로 매핑해서 활용할 수 있음
- 이 때, database column에 생성되는 field의 type은 AttributeConverter의 두번째 generic type을 따라서 생성됨
@Converter(autoApply=true)
- AttributeConverter의 첫번째 generic type에 선언된 클래스를 필드로 가지고 있는 Entity에 대해 자동으로 Converter를 적용해주는 옵션임
- BookStatus와 같이 사용자가 만든 객체면 autoApply 사용해도 괜찮지만, String, Integer와 같은 일반적인 클래스를 변환할 때는 autoApply 적용 안하는 것이 좋음
Converter 사용 시 주의할 점
- 만약에 legacy 데이터여서 읽기만 하고 쓰기 상황은 없다고 생각하고 Converter의 convertoDatabaseColumn() 메서드를 구현하지 않았을 때 생기는 문제
- getAll() 메써드를 @Transactional을 적용함으로써, 끝날 때, dirty checking을 하게 됨
- Entity를 db 값을 변환했을 때 Transaction의 처음과 동일하지 않으면 update를 하게 되는데 converToDatabaseColumn() 이 null을 반환하기에 값이 달라졌음 → update 쿼리를 하게 됨
- 즉, 조회만 두번 했는데 dirty checking으로 인해 update 쿼리가 발생함으로 데이터가 null로 바뀌게 됨
- 여기서 알게 된것 ! ⇒ dirty checking 시, entity의 값을 db field값으로 변환한 뒤에 비교하고 update를 날림! convertToDatabaseColumn() 이 잘 구현되어 있으면 update 쿼리 안생김