본 내용은 인프런 김영한 강사님 JPA 기본 편 강의를 듣고 정리한 내용입니다.
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런
K-개빈 킹 이 수식어가 어울리는 강사, 대한민국에서 사투리가 가장 섹시한 강사, 내 프로젝트에 의존성으로 추가하고 싶은 강사 강의결제를 고민하는 분들께 1) 너무 훌륭한 강의입니다. 무엇보
www.inflearn.com
값 타입 사용법
값 타입은 조금이라도 단순화하려고 만든 개념이기에, 단순하고 안전하게 사용해야 한다.
즉, 값 타입을 여러 엔티티에서 공유하면 굉장히 위험하다.
위 코드를 했을 때 위 위 코드의 원하는 결과는 member1의 주소만 바뀌는 것을 원할 것이다.
그러나 실행시켜보면 member2까지 값이 newCity로 변해있고 업데이트 쿼리가 2번 발생하는 것을 알 수 있다.
이러한 버그를 side effect라고 하는데 이런 버그는 굉장히 찾아내기 힘들다.
위 코드는 바로 밑에 적혀 있지만, 실제 스프링에서는 다른 계층에서 작업을 하기 때문에 진짜 정말 찾기 힘들다.
이러한 문제를 해결하기 위해 값 타입을 복사해서 사용해야 한다.
그러나 이러한 해결 방안도 타입만 맞게 될 경우 값을 다 대입할 수 있기 때문에, 객체의 공유 참조는 피할 수 없다.
여기서 나오는 개념이 불변 객체이다.
객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단할 수 있다. 값 타입들은 모두 불변 객체로 설계해야 한다.
불변 객체로 설계하는 방법으로는 Setter를 만들지 않거나, Setter를 private로 변경하면 된다.
비교
값타입을 비교할 경우 equals()를 재정의를 해야 한다.
이때 equals() 를 재정의 할 때 주의사항으로는 getter를 이용해서 값을 접근해서 오버라이딩을 해야 한다.
값을 직접 접근해서 오버라이딩하는 경우 프록시일 때 접근을 못한다.
'JAVA & SPRING > JPA' 카테고리의 다른 글
JPA 기본편0(양방향 연관관계와 연관관계의 주인) (0) | 2024.03.11 |
---|---|
JPA0 기본편(값 타입 컬렉션) (0) | 2024.03.04 |
JPA 기본편0(값 타입 {기본값 타입, 임베디드 타입}) (0) | 2024.03.04 |
JPA 기본편0 (연관관계 관리 즉시로딩과, 지연로딩) (0) | 2024.03.04 |
JPA 기본편(프록시) (0) | 2024.03.04 |