1. 기본값 타입
이번내용은 JAVA의 데이터 타입에 대한 간단한 내용입니다.
JPA의 데이터 타입 분류
JPA 최상위 데이터를 크게 2가지로 분류한다.
1. 엔티티 타입
- @Entity로 정의하는 객체
- 데이터가 변해도 식별자로 지속해서 추적 가능
- 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능
2. 값 타입
- int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
- 식별자가 없고 값만 있으므로 변경시 추적 불가
- 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체
값 타입 분류
- 기본값 타입 (기본적으로 공유가 되지않거나 되더라도 불변함으로 개발자가 안전하게 마음껏 사용할 수 있다.)
• 자바 기본 타입(int, double)
• 래퍼 클래스(Integer, Long)
• String - 임베디드 타입(embedded type, 복합 값 타입)
- 컬렉션 값 타입(collection value type)
기본값 타입
- 예): String name, int age
- 생명주기를 엔티티의 의존 ex)회원을 삭제하면 이름, 나이 필드도 함께 삭제
- 값 타입은 공유하면X ex)회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨
자바의 기본 타입은 절대 공유되지 않는다.
- int, double 같은 기본 타입(primitive type)은 절대 공유되지 않는다.
- 기본 타입은 항상 값을 복사함
int a = 10;
int b = a;
a = 20;
a,b 출력결과
a == 20
b == 10
- Integer같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 사이드 이펙트를 방지하기 위해변경자체가 불가능하게 만들어졌다. 참고로 래퍼 클래스나 String은 값이 아닌 reference을 가져간다.
Integer a = new Integer(10);
Integer b = a; //10이라는 값이 아닌 a의 reference가 넘어간다.
a.setValue(20); //setValue는 없는 메소드이지만, 있다고 가정
a,b 출력결과
a == 20;
b == 20;
같은 인스턴스를 공유하기 때문에 출력값이 동일하다.
2. 임베디드 타입(복합 값 타입)
- 새로운 값 타입을 직접 정의할 수 있다
- JPA는 임베디드 타입(embedded type)이라 한다.
- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다.
- 임베디드 타입도 int, String과 같은 하나의 값 타입이다.
임베디드 타입 사용법
- @Embeddable: 값 타입을 정의하는 곳에 표시 (둘 중 하나만 넣어도 상관없는데, 둘다 넣는걸 권장)
- @Embedded: 값 타입을 사용하는 곳에 표시 (둘 중 하나만 넣어도 상관없는데, 둘다 넣는걸 권장)
- 기본 생성자 필수
임베디드 타입의 장점
- 재사용
- 높은 응집도
- Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함 (당연)
임베디드 타입과 테이블 매핑
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
public boolean isWork(){
...
}
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
@Entity
public class Member{
...
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
}
main{
Member member = new Member();
member.setWorkPeriod(new Period(...));
member.setHomeAddress(new Address("city", "street", "zipcode"));
em.persist(member);
}
임베디드 타입의 장점
- 임베디드 타입은 엔티티의 값일 뿐이다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
- 객체와 테이블을 아주 세밀하게(find-grained) 매핑하는 것이 가능
- 모델링이 깔끔하게 떨어지고, 코드 보기도 편하고, 객체지향적인 관점에서도 좋다.
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.
임베디드 타입과 연관관계
Address나 PhoneNumber에서 값 타입뿐만 아니라 다른 Entity를 참조할 수 있다.
@AttributeOverride: 속성 재정의
한 엔티티에서 같은 값 타입을 사용하고싶다면?
public class Member{
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city", //기존
column = @Column(name = "WORK_CITY")), //변경 (새로운 테이블 컬럼명)
@AttributeOverride(name = "street",
column = @Column(name = "WORK_STREET")),
@AttributeOverride(name = "zipcode",
column = @Column(name = "WORK_ZIPCODE"))
})
private Address workAddress;
}
• @AttributeOverride : 1개 일 경우
• @AttributeOverrides : 2개 이상
• 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null
※출처 - 인프런 김영한 JPA
'JPA' 카테고리의 다른 글
JPA - 값 타입의 비교 (0) | 2022.05.02 |
---|---|
JPA - 값 타입과 불변 객체 (0) | 2022.04.12 |
JPA - 영속성 전이(CASCADE)와 고아 객체 (2) | 2022.04.11 |
JPA - 즉시 로딩과 지연 로딩 (0) | 2022.04.11 |
JPA - 프록시 (0) | 2022.04.11 |
댓글