728x90

Programming/JPA 23

JPA - 기본 문법과 기능 (기본 문법, 프로젝션, 페이징)

- JPA는 다양한 쿼리 방법을 지원한다. 1. JPQL 2. QueryDSL 3. JDBC API 직접 사용, MyBaits, SpringJdbcTemplate 함께 사용 - JPQL 1. JPA를 사용하면 엔티티 객체를 중심으로 개발한다. 2. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 3. JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. 4. SQL과 문법이 유사하다. SELECT, FROM, WHERE GROUP BY, HAVING, JOIN 지원 5. JPQL은 엔티티 객체를 대상으로 쿼리 6. SQL은 데이터베이스 테이블을 대상으로 쿼리 //검색 String jpql = "select m From Member m where m.name like ..

Programming/JPA 2023.07.18

JPA - 값 타입 컬렉션

- 값 타입 컬렉션 - 값 타입을 하나 이상 저장할 때 사용한다. - 값 타입 컬렉션은 관계형 데이터 베이스에 담을 수 없다. 값만 넣을 수 있다. - 컬렉션을 저장하기 위한 별도의 테이블이 필요하다. - 값 타입, 엔티티를 구분해야 한다. - 클래스 타입으로 컬렉션을 매핑하면 해당 속성들을 컬럼명으로 사용하고, String과 같이 데이터가 단일일 경우 해당 필드명을 컬럼명으로 사용하는 것이 기본이고 예외적으로 @Column(name = "XXX")를 통해 컬럼명을 지정할 수 있다. - @ElementCollection, @CollectionTable 사용한다. - 값 타입 컬렉션 사용 1. 값 타입 저장 2. 값 타입 조회 - 값 타입 컬렉션도 지연 로딩 전략 사용한다. 3. 값 타입 수정 - 참고: ..

Programming/JPA 2023.07.17

JPA - 값 타입과 불변 객체, 값 타입의 비교

- 값 타입과 불변 객체 - 값 타입 공유 참조 1. 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. 2. 부작용(side effect) 발생한다. Address address = new Address("city", "street", "zipcode"); Member member1 = new Member(); member1.setUsername("member1"); member1.setHomeAddress(address); em.persist(member1); Member member2 = new Member(); member2.setUsername("member2"); member2.setHomeAddress(address); em.persist(member2); member1.get..

Programming/JPA 2023.07.17

JPA - 임베디드 타입

- 임베디드 타입 1. 새로운 값 타입을 직접 정의할 수 있다. 2. JPA는 임베디드 타입이라고 한다. 3. 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다. 4. int, String과 같은 값 타입을 사용한다. - 임베디드 타입 사용법 1. @Embeddable: 값 타입을 정의하는 곳에 표시 2. @Embedded: 값 타입을 사용하는 곳에 표시 3. 기본 생성자 필수 - Member @Entity public class Member extends BaseEntity{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; //기..

Programming/JPA 2023.07.17

JPA - 영속성 전이(CASCADE)와 고아 객체

- 영속성 전이 : CASCADE 1. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. ex) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장한다. - 영속성 전이 : 저장 @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) - 주의 할 점 1. 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다. 2. 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐이다. - CASCADE 종류 1. ALL : 모두 적용 2. PERSIST : 영속 3. REMOVE : 삭제 - Parent @Entity public class Parent { @Id @GeneratedValue @Col..

Programming/JPA 2023.07.17

JPA - 즉시 로딩, 지연 로딩

- 지연 로딩 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn private Team team; - fetch = FetchType.LAZY로 설정하게 되면 지연 로딩으로 변경된다. - 지연 로딩이란 해당 객체를 프록시 객체를 생성하여 객체를 참조하는 것이다. Member member = new Member(); member.setUsername("member1"); member.setTeam(teamA); em.persist(member); em.flush(); em.clear(); Member m = em.find(Member.class, member.getId()); - 지연 로딩으로 설정했을 경우 Member를 조회 했을 때 Member 객체에 대해서만 쿼리를 ..

Programming/JPA 2023.07.17

JPA - 프록시

- 프록시 기초 - em.find() vs em.getReference() 1. em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 2. em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 - 프록시 특징 1. 실제 클래스를 상속 받아서 만들어진다. 2. 실제 클래스와 겉 모양이 같다. 3. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. 4. 프록시 객체는 실제 객체의 참조(target)를 보관한다. 5. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. - 프록시 객체의 초기화 Member findMember = em.getReference(Member.class, member.getId())..

Programming/JPA 2023.07.17

JPA - 고급 매핑

- 상속관계 매핑 1. 관계형 데이터베이스는 상속 관계없다. 2. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 3. 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 - 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 1. 각각 테이블로 변환 -> 조인 전략 2. 통합 테이블로 변환 -> 단일 테이블 전략 3. 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 - 주요 어노테이션 1. @Inheritance(strategy=InheritanceType.XXX) 1.1. JOINED: 조인 전략 1.2. SINGLE_TABLE: 단일 테이블 전략 1.3. TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 2. @Discriminat..

Programming/JPA 2023.07.14

JPA - 다양한 연관관계 매핑

- 연관관계 매핑시 고려사항 3가지 1. 다중성 2. 단방향, 양방향 3. 연관관계의 주인 - 다중성 1. 다대일 : @ManyToOne 2. 일대다 : @OneToMany 3. 일대일 : @OneToOne 4. 다대다 : @ManyToMany - 단방향, 양방향 1. 테이블 1.1. 외래 키 하나로 양쪽 조인 가능 1.2. 사실 방향이라는 개념이 없다. 2. 객체 2.1. 참조용 필드가 있는 쪽으로만 참조 가능 2.2. 한쪽만 참조하면 단방향 2.3. 양쪽이 서로 참조하면 양방향 - 연관관계의 주인 1. 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다. 2. 객체 양방향 관계는 A->B, B->A처럼 참조가 2군데이다. 3. 객체 양방향 관계는 참조가 2군데 있다. 둘 중 테이블의 외래 키를 관..

Programming/JPA 2023.07.14

JPA - 연관관계 매핑 기초

- 객체 지향 모델링 (객체 연관관계 사용) - 객체 지향 모델링 (객체의 참조와 테이블의 외래 키를 매핑) @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; // @Column(name = "TEAM_ID") // private Long teamId; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; - 객체 지향 모델링 (ORM 매핑) - 객체 지향 모델링 (연관관계 저장) //팀 저장 Team team = new Team(); team.setName("Team..

Programming/JPA 2023.07.14
728x90