ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 연관관계 매핑 기초 - 단방향 연관관계
    김영한(인프런 강의)/자바 ORM 표준 JPA 프로그래밍 2020. 10. 7. 13:19
    반응형

    연관관계를 왜 만드는가?

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

         – 조영호(객체지향의 사실과 오해)

     

     

    예상 시나리오

        1) 회원과 팀이 있다. 

        2) 회원은 하나의 팀에만 소속될 수 있다. 

        3) 회원과 팀은 다대일 관계다.

     

    연관관계 없는 객체 모델링

    1. 연관관계(연관관계 없음)

    연관관계

     

    2. 특징

        1) 객체를 테이블에 맞추어 모델링을 해야 한다.

           - 참조 대신에 외래 키를 그대로 사용

    @Entity
    public class Member {
    
    	@Id
    	@GeneratedValue
    	private Long id;
    	@Column(name = "USERNAME")
    	private String name;
    	@Column(name = "TEAM_ID")
    	private Long teamId;
    
    	Getter(), Setter() ...
    }
    

     

    @Entity
    public class Team {
    	@Id
    	@GeneratedValue
    	private Long id;
    	private String name;
        
     	Getter(), Setter() ...
    }

            - 외래 키 식별자를 직접 다룸

    public class JpaStudyApplication {
    
    	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.setName("member1");
    			member.setTeamId(team.getId());
    			em.persist(member);
    
    			tx.commit(); // [트랜잭션] 커밋
    		} catch (Exception e) {
    			tx.rollback();
    		} finally {
    			em.close();
    
    		}
    		emf.close();
    	}
    }

            - 식별자로 다시 조회, 객체 지향적인 방법은 아니다.

    public class JpaStudyApplication {
    
    	public static void main(String[] args) {
    		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    
    		EntityManager em = emf.createEntityManager();
    		
    		EntityTransaction tx = em.getTransaction();
    		
    		//트랜잭션 시작
    		tx.begin();
    		
    		try {
    			//조회
    			 Member findMember = em.find(Member.class, member.getId());
    			 //연관관계가 없음
    			 Team findTeam = em.find(Team.class, team.getId());
    			
    			 tx.commit(); // [트랜잭션] 커밋
    		}catch (Exception e) {
    			tx.rollback();
    		}finally {
    			em.close();
    			
    		}
    		emf.close();
    	}
    }

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

            - 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다

            - 객체는 참조를 사용해서 연관된 객체를 찾는다. 

            - 테이블과 객체 사이에는 위의 코드로 설명한 것처럼 큰 간격이 있다.

     

     

     

    단방향 연관관계

    1. 연관관계(객체 연관관계 사용)

    ORM 매핑

    2. 특징

        1) 객체를 테이블에 맞추어 모델링

            - 객체의 참조와 테이블의 외래 키를 매핑

    @Entity
    public class Member {
    	@Id
    	@GeneratedValue
    	private Long id;
    	@Column(name = "USERNAME")
    	private String name;
    	private int age;
    	@ManyToOne
    	@JoinColumn(name = "TEAM_ID")
    	private Team team;
    
        Getter(). Setter() ...
    }

     

    @Entity
    public class Team {
    	@Id
    	@GeneratedValue
    	@Column(name = "TEAM_ID")
    	private Long id;
    	private String name;
        
        Getter(), Setter()
    }

            - 연관관계 저장

    public class JpaStudyApplication {
    
    	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.setName("member1");
    			member.setTeam(team); // 단방향 연관관계 설정, 참조 저장
    			em.persist(member);
    
    			tx.commit(); // [트랜잭션] 커밋
    		} catch (Exception e) {
    			tx.rollback();
    		} finally {
    			em.close();
    
    		}
    		emf.close();
    	}
    }

            - 참조로 연관관계 조회 - 객체 그래프 탐색

    public class JpaStudyApplication {
    
    	public static void main(String[] args) {
    		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    
    		EntityManager em = emf.createEntityManager();
    
    		EntityTransaction tx = em.getTransaction();
    
    		// 트랜잭션 시작
    		tx.begin();
    
    		try {
    			// 조회
    			Member findMember = em.find(Member.class, member.getId());
    			// 참조를 사용해서 연관관계 조회
    			Team findTeam = findMember.getTeam();
    
    			tx.commit(); // [트랜잭션] 커밋
    		} catch (Exception e) {
    			tx.rollback();
    		} finally {
    			em.close();
    
    		}
    		emf.close();
    	}
    }

            - 연관관계 수정

    public class JpaStudyApplication {
    
    	public static void main(String[] args) {
    		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    
    		EntityManager em = emf.createEntityManager();
    
    		EntityTransaction tx = em.getTransaction();
    
    		// 트랜잭션 시작
    		tx.begin();
    
    		try {
                // 새로운 팀B
                Team teamB = new Team();
                teamB.setName("TeamB");
                em.persist(teamB);
                // 회원1에 새로운 팀B 설정
                member.setTeam(teamB);
    
    			tx.commit(); // [트랜잭션] 커밋
    		} catch (Exception e) {
    			tx.rollback();
    		} finally {
    			em.close();
    
    		}
    		emf.close();
    	}
    }

     

     

     

     

    반응형
Designed by Tistory.