728x90

Programming 275

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

JPA - 엔티티 매핑

- 엔티티 매핑 1. 객체와 테이블 매핑 : @Entity, @Table 2. 필드와 컬럼 매핑 : @Column 3. 기본 키 매핑 : @Id 4. 연관관계 매핑 : @ManyToOne, @JoinColumn - @Entity 1. @Entity가 붙은 클래스는, JPA가 관리, 엔티티라 한다. 2. 기본 생성자는 필수다. (final, enum, interface, inner 클래스 사용 X) 3. @Entity의 속성으로 name을 사용할 수 있다. 3.1. JPA에서 사용할 엔티티 이름을 지정한다. 3.2. 기본값은 클래스 이름을 그대로 사용한다. @Entity(name = "ooo") @Table 1. @Table은 엔티티와 매핑할 테이블 지정한다. 2. 실제 DB에 있는 테이블명과 매칭할 때 ..

Programming/JPA 2023.07.14

JPA - 영속성 관리

- JPA에서 가장 중요한 2가지 1. 객체와 관계형 데이터베이스 매핑하기 2. 영속성 컨텍스트 - 엔티티 매니저 팩토리와 엔티티 매니저 - 영속성 컨텍스트 1. 엔티티를 영구 저장하는 환경 2. EntityManager.persist(entity); 3. 영속성 컨텍스트는 논리적인 개념 4. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 - 엔티티의 생명주기 1. 비영속(new/transient) 1.1. 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 2. 영속(managed) 2.1. 영속성 컨텍스트에 관리되는 상태 3. 준영속(detached) 3.1. 영속성 컨텍스트에 저장되었다가 분리된 상태 4. 삭제(removed) 4.1. 삭제된 상태 - 비영속 - 영속 컨텍스트에 포함되어 있지 않고 객체..

Programming/JPA 2023.07.14

JPA - JPA 시작하기

- JPA 특징 1. JPA는 특정 데이터베이스에 종속하지 않는다. - 그림과 같이 Dialect 아래 여러가지 DB들이 종속되어 사용가능하다. 2. Hibernate.dialect의 경우 40가지 이상의 데이터베이스를 지원한다. - JPA 구동 방식 1. 프로젝트에서 설정한 Persistence.xml 파일에는 DB, DB 접속 관련 데이터들이 담겨있다. 2. EntityManagerFactory를 생성하면 DB와의 연결을 포함 대부분의 것들이 해결된다. 3. EntityManagerFactory 생성 이후 EntityManager을 생성하여 DB와 데이터를 주고 받는다. - Member 엔티티 생성 @Entity //관례상 @Table로 테이블 명을 작성해주지 않으면 클래스명이 테이블 명이 된다. p..

Programming/JPA 2023.07.12

Spring - 스프링 트랜잭션 전파2 - 활용

- 트랜잭션 전파 활용1 - 예제 프로젝트 시작 - 비즈니스 요구사항 1. 회원을 등록하고 조회한다. 2. 회원에 대한 변경 이력을 추적할 수 있도록 회원 데이터가 변경될 때 변경 이력을 DB LOG 테이블에 남겨야 한다. 2.1. 여기서는 예제를 단순화 하기 위해 회원 등록시에만 DB LOG 테이블에 남긴다. - Member @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String username; public Member() { } public Member(String username) { this.username = username; } } - JPA를 통해 관리하는 회원 엔티티이다..

Programming/Spring 2023.07.08

Spring - 스프링 트랜잭션 전파1 - 기본

- 스프링 트랜잭션 전파1 - 커밋, 롤백 package hello.springtx.propagation; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annota..

Programming/Spring 2023.07.08

Spring - 스프링 트랜잭션 이해

- 스프링 트랜잭션 추상화 - JDBC 트랜잭션 코드 예시 public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try { con.setAutoCommit(false); //트랜잭션 시작 //비즈니스 로직 bizLogic(con, fromId, toId, money); con.commit(); //성공시 커밋 } catch (Exception e) { con.rollback(); //실패시 롤백 throw new IllegalStateException(e); } finally { release(con); } } - JPA..

Programming/Spring 2023.07.07
728x90