JPA

데이터 중심 설계와 객체 중심 설계의 차이 – JPA 예제로 쉽게 이해하기

초코너무조코 2025. 4. 28. 17:25
728x90

안녕하세요!  오늘은 데이터 중심으로 모델링한 예제가 왜 협력 관계를 만들 수 없는지 쉽게 설명해볼게요.

우선 아래 코드를 보면서 어떤 부분이 문제가 되는지 살펴봅시다.

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

Member member = new Member();
member.setUsername("memberA");
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);

1. 데이터 중심 설계란?

데이터 중심 설계는 테이블 중심입니다.

예를 들어 Member 테이블에 team_id라는 외래키가 있으면, Java 코드에서도 Member 클래스에 그냥 teamId라는 필드(Long)만 두는 거죠.

이 경우, 연관된 객체(Team)는 직접 다루지 않고, 항상 teamId 값을 통해 별도로 조회해야 합니다.


2. 객체 중심 설계란?

객체 지향 프로그래밍에서는 객체끼리 직접 참조합니다.

Member가 Team에 소속되어 있다면, Member 객체는 바로 Team 객체를 참조해야 합니다.

이렇게 하면, member.getTeam().getName()처럼 바로 협력 관계를 통해 데이터를 다룰 수 있습니다.

public class Member { 
private String username; 
// 직접 객체로 참조!
private Team team;  
}

3. 왜 위 예제는 협력 관계가 안되나요?

위 코드는 Member 객체가 단순히 teamId(Long)만 가지고 있습니다.

이 말은, 객체 입장에서 Team이라는 다른 객체를 전혀 모른다는 뜻입니다.

그러니 Team의 이름을 알고 싶으면 어떻게 해야 하죠? teamId를 꺼내서,EntityManager로 find를 다시 해야 하죠.

Team findTeam = em.find(Team.class, findTeamId);

즉, 객체끼리 직접 소통하지 못하고, 매번 em.find() 같은 데이터베이스를 통해서만 관계를 맺는 겁니다.


4. 협력 관계가 중요한 이유

객체 지향 설계에서는 객체들이 메서드를 통해 협력하는 게 핵심이에요.

예를 들어,member.getTeam().getName();

이런 식으로 바로 연결해서 사용하는 게 객체 지향적입니다.

근데, 위 예제처럼 teamId만 가지고 있으면 이렇게 할 수 없고, getTeamId() → em.find(Team.class, teamId) → team.getName() 매번 이렇게 돌아가야 하죠.


5. 올바른 객체 중심 설계는?

Member member = new Member();
member.setUsername("memberA");
member.setTeam(team); // 바로 객체로 참조!
em.persist(member);

Member findMember = em.find(Member.class, member.getId());
Team team = findMember.getTeam(); // 이렇게 바로 가능!
String teamName = team.getName();

이렇게 하면, 데이터베이스를 다시 조회할 필요 없이 객체끼리 바로 연결됩니다.

이것이 객체 중심 설계이고, 협력 관계를 제대로 활용하는 방법입니다.


6. 정리하면

  • 데이터 중심 설계: 객체끼리 직접 연결되지 않고, id값으로만 관계를 맺음 → 협력 불가
  • 객체 중심 설계: 객체끼리 직접 연결 → 협력 가능 → 객체 지향의 장점 살림!

💡 마무리

JPA를 사용할 때 테이블 설계를 그대로 따라가기보다는, 객체의 관계를 잘 설계하는 게 중요해요. 그래야 코드도 더 직관적이고, 유지보수도 쉬워집니다.

728x90