[JPA] JPA와 연관관계

1

JPA

목록 보기
3/16
post-thumbnail

지난글과 지지난글에서 JPA에서의 연관관계와 패러다임의 불일치를 알아보았다.
이번에는 JPA가 기존 객체와 데이터베이스의 패러다임 불일치를 어떻게 해결해주는지 알아보자.

객체지향 모델링

객체는 참조를 통해서 관계를 맺는다. 따라서 아래 코드와 같이 참조를 사용하도록 모델링 해야한다.

class Member{

	String id;
    Team team;
    String username;
    
    Team getTeam(){
    	return team;
    }
}

class Team{

	Long id;
    String name;
}

Member.team 필드를 보면 포린 키의 값을 그대로 보관하는 것이 아닌 연관된 Team의 참조를 보관한다. 하지만 이처럼 객체지향 모델링을 사용하면 테이블에 객체를 저장, 조회하는 것이 쉽지 않다. 왜냐하면 객체 모델은 포린 키가 필요 없고 참조만 있으면 된다. 반면에 테이블은 참조가 필요 없고 포린 키만 있으면 된다.
쉽게 보자면 이렇게 봐도 좋다. 이러한 문제들 때문에 결국 개발자가 중간에서 변환 역할을 해야한다.

  • 저장 : 참조 -> 포린 키
  • 조회 : 포린 키 -> 참조

JPA와 연관관계

JPA는 위에서 언급한 패러다임의 불일치 문제를 해준다. 저장할 때 참조에서 포린키로 개발자가 직접 바꾸어 줘야했는데 JPA에서는 persist( ) 메서드 하나만 작성하면 위 과정이 생략되고 저장이 끝난다. 마찬가지로 객체를 조회할 때도 포린 키를 참조로 변환하는 일을 find( ) 메서드가 대신 해준다.

  • 저장 : jpa.persist(member);
  • 조회 : jpa.find(Member.class, memberId);

비교

데이터베이스는 기본 키(Primary Key)의 값으로 각 로우(row)를 구분한다. 반면에 객체는 동일성(identity) 비교와 동등성(equality) 비교라는 두 가지 비교 방법이 있다.

  • 동일성 비교 : == 사용해서 객체 인스턴스의 주소 값을 비교
  • 동등성 비교 : equals() 메서드 사용해서 객체 내부의 값을 비교

객체지향 모델링

String memberid = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getmember(memberId);

member1 == member2;

결과부터 말하자면 "false"가 반환된다. 왜냐하면 member1과 member2는 같은 데이터베이스 로우에서 조회하였지만, 객체의 관점에서 볼 때 둘은 다른 인스턴스이기 때문이다.


JPA

String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);

member1 == member2;

JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다. 그러므로 member1과 member2는 동일성 비교에 성공한다.


마치며 ...

객체 모델과 관계형 데이터베이스 모델은 패러다임의 불일치가 일어나며, 이로 인해 개발자가 너무 많은 시간과 코드를 소비한다. JPA는 이러한 패러다임의 불일치 문제를 해결해주고 정교한 객체 모델링을 유지하게 도와준다.

0개의 댓글