본문 바로가기

Back-End/JPA17

[JPA] 값 타입 이 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 수강하며 정리한 글입니다. 기본값 타입 임베디드 타입(복합 값 타입) 값 타입과 불변 객체 값 타입의 비교 값 타입 컬렉션 JPA에서는 데이터 타입을 엔티티 타입과 값 타입으로 분류할 수 있다.엔티티 타입이란 @Entity로 정의하는 객체를 말한다. 데이터가 변해도(예: 회원의 나이) 식별자로 추적 가능하다. 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바의 기본 타입이나 객체를 말한다. 식별자가 없고 값 자체이므로 변경하면 추적이 불가능하다. 값 타임은 기본값 타입, 임베디드 타입, 컬렉션 값 타입으로 나눌 수 있다. 기본값 타입 생명 주기를 엔티티에 의존한다. 회원을 삭제하면 이름과 나이 필드가.. 2023. 1. 25.
[JPA] 프록시와 연관 관계 관리 이 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 수강하며 정리한 글입니다. 프록시 즉시 로딩과 지연 로딩 영속성 전이(CASCADE)와 고아 객체 프록시 데이터베이스에서 member를 조회할 때, member의 이름만 필요한 경우(A)가 있고, member가 속한 team의 정보가 필요한 경우(B)가 있다. A는 member의 정보만 가져오는 것이, B는 team의 정보까지 가져오는 것이 효율적일 것이다. Member member = em.find(Member.class, 1L); printMember(member); // A printMemberAndTeam(member); // B 🌕 em.find() vs em.getReference() em.find(): 데이터베이스를 .. 2023. 1. 24.
[JPA] 고급 매핑(상속 관계 매핑, @MappedSuperclass) 이 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 수강하며 정리한 글입니다. 상속 관계 매핑 @MappedSuperclass 상속 관계 매핑 관계형 데이터베이스는 상속 관계가 없다. 모델링 기법 중 슈퍼 타입 서브 타입 관계가 객체의 상속과 유사하다. 슈퍼 타입 서브 타입 논리 모델을 실제 물리 모델로 구현하는 방법에는 세 가지 방법이 있다. 🌕 조인 전략 각각 테이블로 변환한다. 장점은 테이블 정규화가 되어 있고, 외래 키 참조 무결성 제약 조건을 활용할 수 있다는 점과 저장 공간이 효율화 되어 있다는 것이다. 단점은 조회 시 조인을 많이 사용해서 성능이 저하되고, 조회 쿼리가 복잡하다는 것이다. (ALBUM의 데이터를 조회하려면 ITEM과 조인 해야 한다) 또한 데이터 저장 .. 2023. 1. 23.
[JPA] 다양한 연관 관계 매핑 이 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 수강하며 정리한 글입니다. 다대일 [N:1] 일대다 [1:N] 일대일 [1:1] 다대다 [N:M] 다대일 [N:1] 🌕 단방향 // Member.java @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; 🌕 양방향 // Team.java @OneToMany(mappedBy = "team") private List members = new ArrayList(); 일대다 [1:N] 더보기 🌕 단방향 // Team.java @OneToMany @JoinColumn(name = "TEAM_ID") private List members = new ArrayList(); 엔티티가 관리.. 2023. 1. 23.
[Spring Data JPA] 커서 기반 페이지네이션(Pagination) 보호되어 있는 글 입니다. 2022. 11. 19.
[JPA] 연관관계 매핑 이 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 수강하며 정리한 글입니다. 객체와 테이블 연관 관계의 차이 객체의 참조와 테이블의 외래키 매핑 방향, 다중성, 연관관계의 주인 객체를 테이블에 맞춰서 모델링 하면 협력 관계를 만들 수 없다. 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾지만, 객체는 참조를 사용해서 연관된 객체를 찾기 때문이다. 아래와 같이 외래키의 식별자를 직접 다루게 된다. member1이 속한 팀을 알고 싶을 때에도 member1의 teamId를 통해 team 객체를 찾아야 하는 과정이 계속 생긴다. 객체 지향적이지 않다. // 팀 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team).. 2022. 9. 10.