궁금증
- Cart 장바구니 엔티티는 복합키이기 때문에 @Embeddable 클래스를 가지고 있다.
이때 Cart 엔티티에서private CartEmbedded id = new CartEmbedded();라고 객체를 생성해주고 있는데(수업에서 이렇게 했기 때문에 그대로 하고있었음), 다른 자료들을 찾아보면 Embedded 클래스로 복합키를 만들때 다들 객체를 생성하고 있지 않았다.
그래서 생성할 필요가 있는건가? 의문이 들었지만 필요없는 것 같아서 지워버렸었는데, 테스트를 할 때 에러가 떴다.
org.springframework.orm.jpa.JpaSystemException: Could not set field value [1] value by reflection : [class com.myomi.cart.entity.CartEmbedded.num] setter of com.myomi.cart.entity.CartEmbedded.num; nested exception is org.hibernate.PropertyAccessException: Could not set field value [1] value by reflection : [class com.myomi.cart.entity.CartEmbedded.num] setter of com.myomi.cart.entity.CartEmbedded.num
그리고 에러로 찾은 블로그 글 https://cheolhojung.github.io/posts/record/jpa-composite-key-property-access-exception.html
Cart에서 CartEmbedded라는 타입의 @EmbeddedId 속성이 존재하는데, 테스트 할 때 그 복합키에 해당하는 변수에 값을 set해도, @EmbeddedId 로 설정한 속성에 값을 부여하지 않으면 일어나는 일이라고 하는 것 같다.이를 SimpleJpaRepository 라는 곳에서
saveWithGeneratedId 메소드에서setPropertyValue를 호출하면서 PostKeyword의id속성에 접근한다. 그러나, id 속성이 null이기 때문에 NullPointerException가 발생하는 것이다.
해결책
- 기존대로 new 키워드를 이용해서 객체를 생성해주면 된다고 한다.(가장 위의 스크린샷처럼)
에러는 났지만 궁금증은 해결돼서 좋다!