본문 바로가기

JPA

(6)
스프링 영속성 관리 (영속성 컨텍스트) 이번 장에서는 스프링의 영속성 관리, 영속성 컨텍스트에 대해서 살펴본다. JPA에서 가장 중요한 2가지 요소를 꼽자면 하나는 ORM (객체와 관계형 데이터베이스 매핑)이고 나머지 하나는 영속성 컨텍스트이다. 아래의 그림과 같이 하나의 트랜잭션이 시작이 되면 각 트랜잭션마다 EntityManagerFactory에서 EntityManager를 생성하여 각자의 영속성 컨텍스트가 생성이된다. 영속성 컨텍스트란? 엔티티를 영구 저장하는 환경이라는 뜻 아래의 코드와 같이 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다. entityManager.persist(entity) 엔티티의 생명주기 비영속(new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Member member = new.. 더보기
JDBC란? (SQL Mapper, ORM) JDBC 란 Spring 환경에서 개발을 하면서 JDBC라는 단어는 많이 들어봤지만 굳이 JDBC에 대해 알려고 하지 않았다. 그래서 지금까지 묻어두었던 JDBC를 한번 알아보려 한다. 우리는 알게 모르게 JDBC를 많이 사용하고 있다. 그치만 JDBC를 직접 사용하는 경우는 드물 것이다. 아마도 JPA나 MyBatis와 같은 ORM, Sql Mapper와 같은 기술들을 사용하면서 이 기술들에서 JDBC 인터페이스를 호출하는 경우가 많을 것이다. JDBC란 무엇이고 왜 필요한 것일까? 이전에는 서버와 데이터베이스 간의 통신, 쿼리 요청, 결과 응답을 수행하는 과정에 대해서 표준화된 인터페이스가 존재하지 않았다. 따라서 애플리케이션 개발자가 데이터베이스에 접속(TCP/IP)하는 코드, 쿼리를 요청하는 코드.. 더보기
JPA - 프록시 프록시 프록시 기초 em.find() vs em.getReference() em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체의 초기화 Member member = em.getReference(Member.class, "id1"); member.getName(); 코드 실행 결과 Team team = new .. 더보기
JPA - 다양한 연관관계 매핑 연관관계 매핑시 고려사항 3가지 다중성 단방향, 양방향 연관관계의 중요성 다중성 다대일: @ManyToOne 일대다: @OneToMany 일대일: @OneToOne 다대다: @ManyToMany 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A→B, B→A 처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음, 둘중 테이블의 외래 키를 관리할 곳을 지정해야 함 연관관계의 주인: 외래 키를 관리하는 참조 주인의 반대편: 외래 키에 영향을 주지 않음, 단순 조회만 가능 다대일 [ N.. 더보기
JPA - 양방향 연관관계와 연관관계의 주인 객체와 테이블 사이의 연관관계 차이 Team, Member의 예시에서 Member → Team, Team → Member 로의 연관관계도 필요하다면 객체, 테이블 설계에서 어떻게 다를까? 테이블 연관관계 테이블 연관관계는 외래키 하나로 해결이 된다. (Team→Member, Member→Team) 양쪽으로 조인이 가능하다. 그러나 객체의 관점에서 바라보면 다르다. 객체 연관관계 Member에서 team에 대한 참조를 갖는것은 물론, Team에서도 Member list에 대한 참조를 선언해줘야 한다. 연관관계의 주인과 mappedBy 객체와 테이블이 관계를 맺는 차이 객체와 테이블이 관계를 맺는 차이를 정리하면 다음과 같다. 객체 연관관계 = 2개 회원 → 팀 연관관계 1개 (단방향) 팀 → 회원 연관관계.. 더보기
JPA - 테이블 지향 모델링 vs 객체 지향 모델링 with jpa 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원과 팀은 다대일 관계이다. 객체를 테이블에 맞추어 모델링 @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "TEAM_ID") private Long teamId; private String name; } @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; } 객체를 테이블에 맞추어 모델링을 하면 외래키 식별자를 직접 다뤄야 한다. 객체자.. 더보기