본문 바로가기
JAVA & SPRING/JPA

JPA0 기본편(값 타입과 불변 객체, 값 타입 컬렉션)

by 눈오는1월 2024. 3. 4.
728x90

본 내용은 인프런 김영한 강사님 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를 이용해서 값을 접근해서 오버라이딩을 해야 한다.

값을 직접 접근해서 오버라이딩하는 경우 프록시일 때 접근을 못한다.

 

728x90