'객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.' -조영호(객체지향의 사실과 오해)
객체를 테이블에 맞추어 모델링 (연관관계가 없는 객체)
실무에선 이렇게 많이 쓰더라.. 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 |
Uploaded by Notion2Tistory v1.1.0