반응형

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.
기본값 타입
JPA 의 데이터 타입 분류
엔티티 타입
- @Entity로 정의하는 객체
- 데이터가 변해도 식별자로 지속해서 추적 가능
ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자(id)로 인식이 가능한 것
값 타입
- int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
- 식별자가 없고 값만 있으므로 변경 시 추적 불가
ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체, 100 -> 200으로 변경되었으면 200이란 값이 과거에 어떤 값이었었는지 추적이 불가능하다. - 기본값 타입
- 자바 기본 타입(int, double)
- 래퍼 클래스(Integer, Long)
- String
- 임베디드 타입(embedded type, 복합 값 타입)
- ex) X, Y 좌표 값을 합쳐 Position으로 사용하고 싶을 때 사용
- 컬렉션 값 타입(collection value type)
- ex) Java 컬렉션에 기본값이나 임베디드 타입을 넣을 수 있는 것
기본값 타입
- 생명주기를 엔티티에 의존
- ex) 회원을 삭제하면 이름, 나이 필드도 함께 삭제
- 값 타입은 공유 X
- ex) 회원 이름 변경 시 다른 회원의 이름도 함께 변경되면 안 된다.
- 자바의 기본 타입은 절대 공유가 안 된다.
- int, double 같은 기본 타입(primitive type)은 절대 공유 불가
- 기본 타입은 항상 값을 복사한다.
- Integer 같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 변경 불가
int a = 10;
int b = a;
a = 20;
System.out.println("a = " + a); // 20
System.out.println("b = " + b); // 10
위 코드를 보면 b에 a를 대입했지만 a에 20을 넣은 뒤에는 b는 a의 값을 따라서 20이 되지 않고 10이 된다. 즉, a가 저장되는게 아니라 a가 갖고 있는 10이라는 값이 복사가 되어 b에 저장된다.
Integer a = new Integer(10);
Integer b = a;
a.setValue(20); // 에러가 발생하지만 setValue라는게 있다고 가정해보자.
System.out.println("a = " + a);
System.out.println("b = " + b);
컬렉션의 경우 b에 a를 저장하면 a의 래퍼런스가 저장되어 a가 복사되지만 setValue()처럼 값을 변경할 수 있는 방법이 없어 사이드 이펙트가 발생하지 않는다.
반응형