BE전문가 프로젝트

연관관계 매핑 기초 본문

JPA

연관관계 매핑 기초

원호보고서 2022. 10. 9. 13:34
  • 객체와 테이블 연관관계의 차이를 이해
  • 객체의 참조와 테이블의 외래키를 매핑
  • 용어 이해
용어 설명
방향 단방향, 양방향
다중성 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N)
연관관계의 주인 객체 양방향 연관관계는 관리 주인이 필요

 

연관관계가 필요한 이유

객체지향 설계의 목표는 자율적인 객체들의 "협력 공동체" 를 만드는 것이다.

 

 

예제 시나리오

  • 회원과 팀이 있다.
  • 회원은 하나의 팀에만 소속될 수 있다.
  • 회원과 팀은 다대일 관계이다.

 

연관관계 설정 전

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JPAMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();                                     //트랜잭션 시작

        try {

            Team team = new Team();
            team.setName("TeamA");
            em.persist(team);

            Member member = new Member();
            member.setUsername("member1");
            member.setId(team.getId());
            em.persist(member);

            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}

위에 코드를 보면 객체 지향적인 느낌이 아닌 DB를 계속 다녀와야하는 로직을 수행하고 있다는 것을 알 수 있다.

 

객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력관계를 만들 수 없다!

  • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
  • 객체는 참조를 사용해서 연관된 객체를 찾는다.
  • 테이블과 객체 사이에는 이런 큰 간격이 있다.

 

단방향 연관관계

객체 지향 모델링(객체 연관관계 사용)

 

@Entity
public class Member {

    @Id
    @GeneratedValue
    private Long id;

    @Column(name="USERNAME")
    private String username;

    @Column(name="TEAM_ID")
    private Long teamId;

    @ManyToOne
    @JoinColumn(name="TEAM_ID")
    private Team team;
    
 }

 

fk를 사용하려면 jpa에게 다중성(일대일, 다대일, 일대다, 다대다)을 알려줘야 한다.

  • @ManyToOne을 이용하여 다대일을 설정한다.
  • 참조할 Column의 이름을 설정한다.

연관관계 설정 후

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JPAMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();                                     //트랜잭션 시작

        try {

            Team team = new Team();
            team.setName("TeamA");
            em.persist(team);

            Member member = new Member();
            member.setUsername("member1");
            member.setTeam(team);
            em.persist(member);

            Member foundMember = em.find(Member.class, member.getId());

            Team foundTeam = foundMember.getTeam();
            
            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}

 

Comments