<aside> ❗

용어 이해

** 객체 지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다. **

객체지향의 사실과 오해 - 조영호

오브젝트 - 조영호

</aside>

<aside> ❗

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

image.png

저장

// 참조 대신에 **외래 키를 그대로 사용** 
@Entity
public class Member {
	@Id @GeneratedValue
	private Long id;
	
	@Column(name = "USERNAME")
	private String name;
	
	@Column(name = "TEAD_ID")
	private Long teamId; // 외래키가 들어가게 됨 
	...
}

@Entity 
public class Team {
	@Id @GeneratedValue
	@Column(name = "Team_ID")
	private Long id;
	private String name;
}
// 팀 저장 
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());

// 연관관계 없음 
Team findTeam = em.find(Team.class, findMember.getTeamId());

</aside>

<aside> ❗

객체를 테이블에 맞추어 데이터 중심으로 모델링하면

협력 관계를 만들 수 없다.

<aside> ❗

단방향 연관관계

[객체 지향 모델링] - 객체 연관관계 사용

image.png

@Entity 
public class Member {
	@Id @GeneratedValue
	private Long id;
	
	@Column(name = "USERNAME")
	private String name;
	private int age;
	
	@ManyToOne // N : 1 일 때, N인 곳에 ManyToOne을 사용해야 한다. 
	@JoinColumn(name = "TEAM_ID")
	private Team team; 
}

ORM 매핑

image.png

// 팀 저장 
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();

<aside> ❗

객체 지향 모델링

[연관관계 수정]

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

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

</aside>

<aside> ❗

양방향 연관관계와 연관관계의 주인 1 - 기본

양방향 매핑

image.png

@Entity
public class Member {

	@Id @GeneratedValue
	private Long id;
	
	@Column(name = "USERNAME")
	private String name;
	private int age;
	
	@ManyToOne
	@JoinColumn(name = "TEAM_ID")
	private Team team;

}

@Entity
public class Team {

	@Id @GeneratedValue
	private Long id;
	private String name;
	
	@OneToMany(mappedBy = "team")
	// 구현체로 초기화해주는 것이 관례, add할 때 NullPointer 예외가 발생하지 않음
	List<Member> members = new ArrayList<Member>();
}
// 조회
Team findTeam = em.find(Team.class, team.getId());

List<Member> memberList = findTeam.getMembers(); // 역방향 조회 

<aside> ❗

연관관계의 주인과 mappedBy

객체와 테이블이 관계를 맺는 차이

image.png

[객체 연관관계 = 2개] - 단반향 연관관계가 2개가 있는 것 (양방향)

** 참조가 양쪽 객체에 있어야 한다. **

[테이블 연관관계 = 1개]

<aside> ❗

객체의 양방향 관계

// A -> B 
class A {
	B b;
} 

// B -> A 
class B {
	A a;
}

</aside>

<aside> ❗

테이블의 양방향 연관관계

SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID

SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID

</aside>

<aside> ❗

둘 중 하나로 외래 키를 관리해야 한다.

image.png

</aside>