1. 연관관계의 주인에 값을 입력하지 않는 경우

Member{
	...
	@ManyToOne
	@JoinColumn(name="TEAM_ID")
	private Team team;
	...
}
Team{
	...
	@OneToMany(mappedBy="team")
	private List<Member> members = new ArrayList<>();
	...
}
...
team.getMembers().add(member);
em.persist(team);
...

두 객체의 양방향 관계에서, 해당 관계의 주인은 Member객체이다. 즉 Member.setTeam(team)을 해주어야 DB에 반영되는 것이지, team.getMembers().add(member)를 적용해도 DB에 반영되지 않는다.

반드시 연관관계의 양쪽 멤버 모두 값을 변경해주도록 하자.

어쨋든 객체지향 설계에서는 양방향 접근 시 정합성을 유지하려면 둘다 바꾸어야한다.

→ 왠만하면 둘다 바꿔주자. 코드 별로 안길다..

→ 주인관계만 바꾸어도, em.flush()하지 않으면 조회시 DB값이 반영되지 않을 수도 있다.

영속성 컨텍스트의 1차캐시로부터 값을 조회해오기 때문 → 양방향 연관관계의 세팅시 양쪽 값을 다 바꾸어주자.

...
team.getMembers().add(member);
member.setTeam(team);
em.persist(team);
...

2. 양방향 매핑 시 발생하는 무한루프

toString(), lombok, JSON생성 라이브러리로부터 발생하는 문제.

객체지향설계의 양방향 관계로 인해 상호간의 호출이 이루어진다. 여기서 발생하는 무한루프

ex) Member의 toString은 team을 포함, Team의 toString은 member를 포함하기 때문

ex) Entity를 Json으로 생성하는 순간 발생한다. 따라서 response에 직접 Entity를 리턴해주어선 안된다.

→ 컨트롤러에서는 절대 엔티티를 직접 반환해선 안된다. Interface 객체로 매핑해서 리턴해야한다.

→ 컨트롤러에서 엔티티를 직접 반환하면 엔티티를 변경하는 순간 API도 변경되기 때문

→ 별도 DTO를 만들어서 반환해주자

→ toString()은 되도록 쓰지않고, 직접 만들어 사용하자