본문 바로가기

Spring/JPA

JPA 연관관계 매핑-단방향 매핑

'객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.' -조영호(객체지향의 사실과 오해)

객체를 테이블에 맞추어 모델링 (연관관계가 없는 객체)

실무에선 이렇게 많이 쓰더라.. teamId 꺼내서 다시 Team에서 조회한다. 객체 연관관계가 없다.

실무에선 왜 이런 식으로 쓰게 되는걸까? 객체를 테이블에 맞추어 모델링하면 어떤 장점이 있을까????

위 그림처럼 만들어보자.

Member.java

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

Team.java

@Entity
public class Team{
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO)
	private Long id;
	private String name;
	...
	//Getter & Setter
}

그러면?

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

//멤버 저장
Member member = new Member();
member.setTeamId(team.getId());
member.setName("안녕");
em.persist(member);

이런 식으로 db에 두 개의 테이블이 만들어진다.

★여기서 조회를 한다면?

Member findMember = em.find(Member.class, member.getId());
Long teamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, teamId);

연관 관계가 없기 때문에 두 번 조회해야 한다.

식별자로 다시 조회, 객체 지향적인 방법은 아니다... DB에서 가져올 때 서로 연관 관계가 없음...

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

-테이블은 외래 키로 조인을 사용해서 연관 테이블을 찾는다 -객체는 참조를 사용해서 연관된 객체를 찾는다(객체의 참조가 없음..) -DB TABLE과 OBJECT 사이에는 이런 큰 간격이 있다!

연관관계 매핑 이론!

단방향 매핑

이젠 객체에 teamId(fk)를 넣지 말고, Team team 객체를 넣어보자. 좀 더 객체 지향적으로 만들어보자!

[객체 연관 관계] → 한 방향! 단방향 매핑

//    @Column(name = "TEAM_ID")
//    private Long teamId;
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;

@ManyToOne

하나의 team이 여러 개의 멤버를 가지고 있잖아요? 멤버의 입장에선.. 다 대 일로 연결되기 때문에 ManyToOne.

@JoinColumn(name="TEAM_ID") 조인 컬럼이름 뭐야? 테이블 만들어진 거.. TEAM_ID(FK) 폴인 키야!

그러면 이렇게 매핑이 됨. 연관관계 매핑이라고 부름

다시 코드가 어떻게 바뀌는지 보자!

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

//멤버 저장
Member member = new Member();
//member.setTeamId(team.getId());
member.setName("안녕");
member.setTeam(team);
em.persist(member);

객체 자체를 member.setTeam(team)으로 해줌. 단방향 연관관계 설정(참조)이 되었음. 그리고 좀 더 객체 지향적으로 바뀐 듯?

다시 조회한다고 하면?

//Member findMember = em.find(Member.class, member.getId());
//Long teamId = findMember.getTeamId();
//Team findTeam = em.find(Team.class, teamId);
//원래는 가져와서 조회를 했었야하는데..

// 조회
Member findMember = em.find(Member.class, member.getId());
// 참조 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();

좀 더 객체지향적으로 접근 가능. findMember.getTeam()! 객체를 가져오게 됐지 뭐.

DB입장에선 바뀐 거 없음.

객체만 좀 더 객체 지향적으로 접근할 수 있게 바뀌었음. JPA장점! 패러다임!

이것이 바로! 연관 관계 매핑이다! 이 모든 과정을 쿼리로 짠다?

연관관계 수정

//새로운 팀B
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);

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

해당 포스팅은 T아카데미에서 진행한 김영한 강사님의 JPA 유튜브 강의를 듣고 정리한 것입니다 : ) https://www.youtube.com/watch?v=WfrSN9Z7MiA&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U

반응형

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

JPA 내부 구조. 영속성 컨텍스트  (0) 2021.04.12
JPA 연관관계 매핑 -양방향 매핑  (0) 2021.04.11
JPA 필드와 칼럼 매핑  (0) 2021.04.11
JPA persistence.xml과 라이브러리 설정  (0) 2021.04.11
JPA 기초와 매핑 : 실습  (0) 2021.04.11