김영한님이 지음, [자바 ORM 표준 JPA 프로그래밍] 책을 읽고 정리한 필기입니다.📢
JPA의 필요성
반복적인 SQL과 JDBC API 코드 작성
JPA를 사용하지 않고 SQL을 직접 다룰 경우 자바로 작성한 애플리케이션은 JDBC API를 사용해서 SQL을 데이터베이스에 전달하고 그 결과를 반환 받는다.
위 환경에서의 회원 조회 개발 시 필요한 스텝을 나열하면 아래와 같다.
-
회원 클래스 정의
1 2 3 4 5
public class Member{ private String memberId; private String name; ... }
-
회원용 DAO(데이터 접근 객체) 정의
1 2 3
public class MemberDAO{ public Member find(String memberId){...} }
-
회원 조회용 SQL 작성
1
SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?
-
JDBC API를 사용하여 SQL 실행
1
ResultSet rs = stmt.executeQuery(sql);
-
조회 결과를
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을 실행한다.
댓글남기기