본문 바로가기
Spring/JPA

연관 관계가 필요한 이유

by YoonJong 2022. 9. 21.
728x90

연관관계가 필요한 이유 : 협력 공동체를 만들 수 없다.

 

Member.class

 - 현재 teamId 를 Long 타입으로 가지고 있다.

@Entity
public class Member {

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

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

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

 

Team.class

@Entity
public class Team {

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

    private String name;

 

객체를 테이블에 맞추어 모델링하면 외래 키 식별자를 직접 다루게 된다.

 

저장할때를 예를 들어보자.

team을 만들어서 teamA 로 이름을 설정하고, 영속화한다.

member 의 팀을 설정하려면, member에 team.getId() 를 통해 team id를 가져와서

설정하고 다시 영속화 해야한다.

 

검색할 때를 예를 들어보자

em.find 로 member의 id 를 통해 member를 찾는다.

찾은 멤버의 getTeamId() 를 통해 teamId 를 찾는다.

찾은 teamId 를 통해서 다시 find하여 Team을 찾는다.

 

 

아래와 같이 TeamId를 직접 다뤄야하는 불편함이 생긴다.

전혀 객체지향적이지 않으며, 협력관계를 가질 수 없다는 문제점이 있다.

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

Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId());
em.persist(member);

// 검색
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);

 

 

객체지향적으로 모델링 하려면??

단방향으로 설정해보자.

 

Member.class

 - Member 와 Team의 관계는 N:1 이다.

 ( 여러 멤버들은 한개의 팀에 속한다 / 한개의 팀에는 여러 멤버들을 가질 수 있다 )

//@Column(name = "team_id")
//private Long teamId;
// 아래와같이변경

@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();
728x90

'Spring > JPA' 카테고리의 다른 글

상속관계 매핑 ( @Inheritance , @DiscriminatorColumn )  (0) 2022.09.23
연관 관계 매핑  (1) 2022.09.22
필드와 컬럼 매핑  (0) 2022.09.20
데이터베이스 스키마 자동 생성  (0) 2022.09.20
객체와 테이블 매핑  (0) 2022.09.20

댓글