Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 부트스트랩 #Bootstrap #웹개발첫걸음 #스파르타코딩클럽
- 스파르타코딩클럽 #크롤링 #스크래핑
- #내일배움단 #코딩프로젝트 #국비지원 #내일배움카드 #스파르타코딩클럽
- 스파르타코딩클럽 #코딩 #jQuery #Ajax
- 항해99솔직후기 #항해99 #부트캠프추천
Archives
- Today
- Total
이모저모
JPA의 데이터 타입 본문
JPA기본강의 필기 _ 김영한님
JPA의 데이터 타입
- Entity type
- @Entity로 정의
- 데이터가 변해도 지속하는 식별자를 통해 추적 가능
- Value type(값타입)
- int, Integer, String 같이 단순한 값으로 사용하는 자바 기본 타입 및 객체
- 식별자 없이 값만 있으므로 변경시 추적 불가
- 3가지 종류
- 기본값 타입
- 자바 기본타입(int, double), 래퍼클래스(Integer, Long), String
- 생명주기를 entity에 의존
- 기본타입은 절대 공유되지 않는다.
- (래퍼클래스, String의 경우라고 해도, 참조값을 공유할 수는 있지만 변경은 안 된다)
- 임베디드 타입(embedded type, 복합 값 타입)
- 새로운 값 타입을 직접 정의할 수 있음
- JPA는 임베디드 타입
- 주로 기본값 타입을 모아서 만들어서 복합값타입이라고도 함
- int, String과 같은 값타입
- 사용방식
- @Embeddable: 값처럼 삽입시킬 클래스위에 어노테이션 달기
- @Embedded: 임베더블 값을 자신의 컬럼으로 매핑하는 클래스의 임베디드컬럼 위에 어노테이션 달기
- 주의) 임베디드 타입의 값타입을 여러 엔터티에서 공유하는 경우
- → 나는 회원1의 주소(임베디드 값)만 변경하고 싶었던 건데, 이전에 같은 임베디드 값을 들고 있던 회원2의 주소도 같이 변경되어 버리는 문제. (절대 반갑지 않은 side effect)
- → 값을 복사해서 사용하면 되겠다..?
- → 그러나! 임베디드 타입처럼 직접 정의한 값타입은 자바의 기본 타입이 아니라 객체 타입
- 객체타입은 참조를 전달! 그렇다면 결국 하나의 객체를 공유하는 것...
- 그렇다면 어떻게 해야 할까?
- → 불변객체로 만들기! (생성자로만 값 설정하고, setter를 빼거나 private으로 만들거나)
- 그렇다면 실제로 값을 바꾸고 싶을 때는 어떻게 해야 하나?
- → 새로 만들어야 함. (값이라는 것은 애초에 갈아끼워야 하는 것이니까~)
- 값타입의 비교
- 임베디드 타입에 대해서, 기본적으로 객체이기 때문에 서로 다른 인스턴스에 대해 동일성을 확보할 수 없다.
- 그러나 값타입은 값이 같으면 같다고 말해주어야 한다.
- 그럼 어떻게 이 같음을 인식할까?
- 동일성 비교(==) vs 동등성 비교(equals) 를 구분함으로써!!
- 값타입의 비교는 동등성비교를 사용.
- 기본값 타입
- 값타입 컬렉션
- 값타입의 컬렉션을 저장하고 싶을 때 ( 예: Address 임베디드타입의 리스트 형태인 addressHistory)
- 해당 컬럼에는 @ElementCollection, @CollectionTable (→ 컬렉션을 저장하기 위한 별도의 테이블 필요하므로) 어노테이션 달기
- 값 타입 컬렉션도 지연로딩 전략을 사용
- 영속성 전이, 고아 객체 제거 기능을 가짐. (일대다 매핑에서 배웠던 것과 비슷한 느낌)
- 제약
- 값 타입 컬렉션에 변경사항이 발생하면, 일부만 변화하는 것이 아니다!
- 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장
- 값을 변경하면 추적이 어렵다...
- 실무에서는?! 값 타입 컬렉션 대신에 일대다 관계 사용~ (값타입을 엔터티로 승급)
- 일대다 엔터티 테이블들 사이의 관계로 다루고 + Cascade.ALL + orphanRemoval = true 이렇게 사용
- 그래도 쓸 때가 있다. => 언제? 정말 정말 단순할 때 (select box. radio button 등등)
'coding > Java, Spring' 카테고리의 다른 글
JPA _ proxy, eager loading, lazyloading (0) | 2022.02.21 |
---|---|
JPA - Entity mapping, 연관관계의 주인 (0) | 2022.02.21 |
JPA - 영속성 컨텍스트 (0) | 2022.02.21 |
절차/객체/관점 지향 프로그래밍 (0) | 2022.02.21 |
request scope와 provider, proxy (0) | 2022.02.17 |
Comments