참치코더의 꿈 메모장

JPA / 기본값 타입, 임베디드 타입 정리, 불변객체란?, 그에 따른 비교 본문

JPA

JPA / 기본값 타입, 임베디드 타입 정리, 불변객체란?, 그에 따른 비교

참치깡 2025. 10. 24. 17:28
728x90

기본값 타입 : 자바 기본형 또는 Wrapper 클래스(Integer 등등), String 등

임베디드 타입(복합 타입) : 여러 필드를 묶어 하나의 값 타입처럼 사용하는 것

컬렉션 값 타입  : 값 타입을 Collection에 담아 사용하는 것

 

임베디드 타입(Embedded Type)

 

- 여러 속성을 묶어 논리적으로 하나의 값 타입으로 활용하는 것

- 엔티티의 재사용성과 응집도를 높임

- 실제 DB에는 해당 엔티티 테이블에 컬럼으로 펼쳐짐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;
}
 
 
@Entity
public class Member {
    
    @Embedded
    private Address address;
}
 
/*
 
   1. 객체 지향적인 설계가 가능하다. (캡슐화 강화)
   2. 재사용성 증가한다.
   3. 해당 값 타입에 의미 있는 메서드 추가가 가능하다.(isValid())
*/
 
 
cs

 

값 타입은 참조 공유 하면 안된다...

 

깂 타입은 엔티티가 아니므로, 공유되면 사이드 이펙트가 발생한다.

1
2
3
4
5
Address address = new Address("Seoul""Gangnam""123");
Member m1 = new Member(address);
Member m2 = new Member(address); // 공유된 값을 변경하면 전체 객체의 값이 변경되는 사이드 이펙트 발생!!!
 
// -> 따라서 값 타입은 불변으로 만들어야 한다.
cs

 

 

값 타입과 불변 객체

 

불변객체를 만드는 방법

 

1.  Setter 제거한다.

2.  모든 필드를 가능하면 final로 선언한다.

3. 값 변경시 새로운 객체를 생성하는 방식으로 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Embeddable
public class Address{
    private final String city;
    private final String street;
    private final String zipcode;
 
    public Address(String city, String street, String zipcode){
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }
}
 
// -> 값 변경 시 
//address = new Address("Busan", address.getStreet(), address.getZipcode());
 
cs

 

값 타입의 비교

 

동일성 비교(==) : 기본값 타입 비교할때 사용(대략 얕은 비교를 한다.)

동등성 비교(.equals) : 임베디드/컬렉션 값타입 비교시 사용한다.(깊은 비교를 한다.)

 

-> 뭐든 일단 동등성 비교를 하는 것이 좋고, .equals를 사용하면 반드시 재정의가 필요하다.

   (메모리 참조값을 비교하지 않고, 해당 실제 값을 비교)

 

 

728x90
Comments