김영한님이 지음, [자바 ORM 표준 JPA 프로그래밍] 책을 읽고 정리한 필기입니다.📢

JPA의 필요성

반복적인 SQL과 JDBC API 코드 작성

image

JPA를 사용하지 않고 SQL을 직접 다룰 경우 자바로 작성한 애플리케이션은 JDBC API를 사용해서 SQL을 데이터베이스에 전달하고 그 결과를 반환 받는다.

위 환경에서의 회원 조회 개발 시 필요한 스텝을 나열하면 아래와 같다.

  1. 회원 클래스 정의

    1
    2
    3
    4
    5
    
     public class Member{
       private String memberId;
       private String name;
       ...
     }
    
  2. 회원용 DAO(데이터 접근 객체) 정의

    1
    2
    3
    
     public class MemberDAO{
       public Member find(String memberId){...}
     }
    
  3. 회원 조회용 SQL 작성

    1
    
     SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?
    
  4. JDBC API를 사용하여 SQL 실행

    1
    
     ResultSet rs = stmt.executeQuery(sql);
    
  5. 조회 결과를 Member객체로 매핑

    1
    2
    3
    4
    5
    6
    7
    
     String memberId = rs.getString("MEMBER_ID");
     String name = rs.getString("NAME");
        
     Member member = new Member();
     member.setMemberId(memberId);
     member.setName(name);
     ...
    

문제점

  • 객체를 데이터베이스에 CRUD하려면 너무 많은 SQL과 JDBC API를 코드로 작성해야 함
  • 각 테이블마다 반복 필요

SQL에 의존적인 개발

  • 어떠한 문제가 발생했을 때 최악의 경우 DAO의 코드를 확인하고 어떤 SQL이 실행되고 어떤 객체들이 함께 조회되는지 일일이 확인해야 하는 문제가 존재함
  • ex)회원 객체에 필드를 하나 추가할 때도 DAO의 CRUD코드와 SQL 대부분을 변경 해야 함
  • 진정한 의미의 계층 분할이 아님
    • 논리적으로 아주 엔티티와 아주 강한 의존관계를 가지고 있음
  • SQL에 모든 것을 의존하는 상황에서는 엔티티를 신뢰할 수 없음

JPA와 문제해결

개발자가 직접 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용 → JPA는 개발자 대신에 적절한 SQL을 생성해서 데이터베이스에 전달

저장기능

1
jpa.persist(member); //저장

persist() : 객체를 데이터 베이스에 저장한다.

  • JPA가 객체와 매핑정보를 보고 적절한 INSERT SQL을 생성하여 데이터베이스에 전달한다.

조회 기능

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

find() : 객체 하나를 데이터베이스에서 조회한다.

  • JPA는 객체와 매핑정보를 보고 적절한 SELECT SQL을 생성하여 데이터베이스에 전달하고 그 결과로 Member객체를 생성하여 반환한다.

수정 기능

1
2
Member member = jpa.find(Member.class, memberId);
member.setName("이름변경"); //수정

JPA는 별도의 수정 메소드를 제공하지 않고, 조회한 객체의 값을 변경만 하면 트랜젝션 커밋 시 적절한 UPDATE SQL이 데이터베이스에 전달된다.

연관된 객체 조회

1
2
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam(); //연관된 객체 조회

JPA는 연관된 객체를 사용하는 시점에 적절한 SELECT SQL을 실행한다.

JPA 카테고리 내 다른 글 보러가기

댓글남기기