5. 연관관계 매핑 기초 - (5.1 단방향 연관 관계)

HotFried·2023년 9월 26일
0

용어

  • 방향(Directin): 단방향, 양방향
  • 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
  • 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인이 필요

단방향 연관관계

객체를 테이블에 맞추어 모델링해보자

회원과 팀은 다대일관계를 가진다.!
이때, 객체를 관계형 DB에 맞춰 모델링해보자

객체지향스럽지 않게 엔티티에 외래키 필드(teamId)를 만든다.
이렇게 하면, 객체에서 조회했을 때 member랑 team의 연관관계가 없다.


Member 엔티티

@Entity
public class Member {

	@Id @GeneratedValue
	@Column(name = "MEMBER_ID")
	private Long id;

	@Column(name = "TEAM_ID")
	private Long teamId;   // 관계형DB에 맞춘 방식
}

Team 엔티티

@Entity
public class Team {

@Id @GeneratedValue
private Long id;
}

회원저장

Member member = new Member();
member.setTeamId(team.getId());

member의 Team을 지정할때 member.setTeam()이 아닌 member.setTeamId 즉 외래키 식별자를 직접 다룬다.
객체가 아닌 외래키 식별자를 직접 다룬다.

객체지향적인 방법이 아니다!
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.

  • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
  • 객체는 참조를 사용해서 연관된 객체를 찾는다.

=> 패러다임의 차이


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

객체 지향적으로 모델링을 하면 Member는 Team 참조값을 갖게 된다.

Member 엔티티

@Entity
public class Member {

	@Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    @Column(name = "USERNAME")
    private String name;

    // 하나의 팀에 여러 멤버가 소속될 수 있다.
    // Member =>many, Team => one
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

Team 엔티티

@Entity
public class Team {

    @Id @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;

    private String name;
}

연관관계 수정

Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);

//회원1에 새로운 팀B 설정
member.setTeam(teamB);

연관 관계를 수정할 때는 값만 바꿔주면 자동으로 update 쿼리가 나간다.


참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
꾸준하게

0개의 댓글