[JPA] 단방향 연관관계

동동·2022년 4월 14일

JPA

목록 보기
4/18
post-thumbnail

⚙️ 기본 개념
객체의 연관관계를 공부하기 전에 객체와 테이블 연관관계의 차이를 이해해야 한다.
테이블에서는 테이블 간의 연관관계를 외래 키(Foreign Key)를 사용해 간단하게 매핑한다.
그럼 객체에서는?
참조관계를 활용해서 객체 간의 연관관계를 가지는데 여러가지의 매핑방법이 있다.

들어가기 전 용어 정리

  • 방향(Direction) : 단방향 / 양방향
  • 다중성(Multiplicity) : 다대일(N:1) / 일대다(1:N) / 일대일(1:1) / 다대다(N:M)
  • 연관관계의 주인(Owner) : 서로 참조관계에 있는(양방향 연관관계) 객체는 관계에 있어서 주인이 필요하다. 연간관계의 주인이 아닌 객체는 조회만 가능하다.



❓ 객체 간의 연관관계가 필요한 이유

// 멤버 객체 생성
@Entitypublic class Member {
	private Long id;
 

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

// 팀 객체 생성
@Entitypublic class Team {
	private Long id;
 

    private String name;}

@Id @GeneratedValueprivate Long id;private String name; ...

//팀 저장Team team = new Team();

team.setName("TeamA");
 em.
persist(team);



//회원 저장Member member = new Member();

member.setName("member1");//member객체에 TeamId를 저장할 때 team객체에서 Id를 얻어와서 저장함(외래키 식별자를 직접 다룸)
// -> 객체지향적이지 않음
member.setTeamId(team.getId());

em.persist(member);//회원 조회Member findMember = em.find(Member.class, member.getId());
//팀 조회
Team findTeam = em.find(Team.class, team.getId());
// -> 두 객체 사이에 전혀 연관관계가 없음

//회원 조회Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
// -> 회원의 팀을 조회하기 위해서는 위와 같은 코드인데 객체지향적이지 않음

-> 객체를 테이블에 맞추어 모델링하면 협력 관계를 만들 수 없고 객체지향적이지 않다.




⚙️ 객체 간에 연관관계를 갖고 객체 지향적으로 설계하는 법

@Entitypublic class Member {private Long id;
 

	@Column(name = "USERNAME")
    private String name;
    private int age;// 어노테이션을 사용해 연관관계를 매핑해준다.
    // TeamId가 아닌 Team 객체 자체를 멤버 변수로 갖는다.
	@ManyToOne@JoinColumn(name = "TEAM_ID")private Team team;
    
    //팀 저장Team team = new Team();

	team.setName("TeamA");
    em.persist(team);



	//회원 저장Member member = new Member();

    member.setName("member1");

	member.setTeam(team); //단방향 연관관계 설정, 참조 저장
    em.persist(member);
    
    //조회Member findMember = em.find(Member.class, member.getId());
	//참조관계를 사용해서 바로 연관관계 조회가능Team findTeam = findMember.getTeam();

- 어노테이션을 사용해 객체 간에 연관관계를 갖도록 매핑
- 참조관계에 있는 객체를 멤버 변수로 사용

profile
괴발개발

0개의 댓글