Updated:

1. SQL을 직접 다룰 때 발생하는 문제점

  • 진정한 의미의 계층 분할이 어렵다
  • 엔티티를 신뢰할 수 없다
  • SQL에 의존적인 개발을 피하기 어렵다

JPA는 이러한 문제들을 해결한다!
개발자가 직접 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 된다.
그러면 JPA가 개발자 대신에 적절한 SQL을 생성해서 데이터베이스에 전달한다.

// 저장 기능
jpa.persist(member);

// 조회 기능
String memberId = "helloId";
Member member = jpa.find(Member.class, memberId);

// 수정 기능
member.setName("이름변경");

// 연관된 객체 조회
Team team = member.getTeam();

2. 패러다임의 불일치

  1. 상속
    • 객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이라는 기능이 없다
    • JDBC API를 사용해서 코드를 완성하려면 부모 객체에서 부모 데이터만 꺼내서 SQL을 작성하고, 자식 객체에서 자식 데이터만 꺼내서 SQL을 작성해야 하는데, 작성해야할 코드량이 만만치 않다
  2. 연관관계
    • 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다
    • 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다
  3. 객체 그래프 탐색
    • SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다
    • 비즈니스 로직에 따라 사용하는 객체 그래프가 다르므로, 언제 끊어질지 모를 객체 그래프를 함부로 탐색할 수 없는 문제가 있다
    • JPA를 사용하면 객체 그래프를 마음껏 탐색할 수 있다 member.getOrder().getOrderItem()...
    • JPA는 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룬다고 해서 지연 로딩이라 한다.
  4. 비교
    • 데이터베이스는 기본 키의 값으로 각 로우(row)를 구분한다
    • 객체는 동일성(identity) 비교와 동등성(equality) 비교라는 두 가지 비교 방법이 있다
      • 동일성 비교는 == 비교다. 객체 인스턴스의 주소 값을 비교한다
      • 동등성 비교는 equals() 메소드를 사용해서 객체 내부의 값을 비교한다

Leave a comment