[JPA기본] 1. JPA 소개

kiwonkim·2021년 11월 25일
0

[ 강의 내용 ]

인프런 김영한 강사님의 자바 ORM 표준 JPA 프로그래밍 - 기본편을 정리할 예정입니다. 해당 강의는 JPA 에 대한 소개와 원리에 대한 강의입니다.

[ 기존 방식 한계 ]

객체지향 프로그래밍과 RDBMS

객체지향 프로그래밍은 다형성, 상속 등을 활용하여 매우 유연성 높은 프로그래밍을 가능케한다.
관계형 데이터베이스는 데이터의 무결성과 일관성을 보장하며, Join 을 통해 복잡한 쿼리를 가능케하는 장점이 있다.
현대 개발은 주로 객체지향 방식으로 개발을 해서 이를 관계형 DB에 저장하고 관리하는 것이 보편적이다.

JDBC 사용

String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES(?,?)";

pstmt.setString(1, member.getMemberId());
pstmt.setString(2, member.getName());

pstmt.excuteUpdate(sql);

순수 JDBC를 사용하여 member 객체를 MEMBER 테이블에 삽입하는 과정이다. 작성한 쿼리문에 모든 객체의 필드를 대입한 뒤 실행한다.

기존방식의 한계 - SQL 의존성

public class Member {
	private String memberId;
    private String name;
    private String tel; // 추가됨
}

String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES(?,?,?)";

Member 의 필드에 tel 이 추가되었다고 가정하자. SQL 을 변경하는 것은 물론, SQL에 객체의 필드를 대입해주는 부분도 개발자가 일일이 수정해야할 것이다. 즉 객체를 수정할 때마다 SQL도 수정하게되어 SQL 에 의존적인 개발을 하게된다.

기존방식의 한계 - 엔티티 신뢰문제

public class Member {
	private String memberId;
    private Team team;
    private Order order;
}

String sql = "SELECT M.*, T.* FROM MEMBER M JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID"

Member.getOrder(); ??

Member 객체의 필드로 Team 객체와 Order 객체가 있다고 가정하자. 이때 SQL 문의 Join 문으로 필드의 Team 객체를 함께 가져와서 Member 객체에 넣어줬다. 그런데 Order 문과는 Join 을 하지 않았기에 getOrder 시 Null이 조회될 것이다.
즉 조회한 엔티티의 필드 범위가 SQL에 의해 결정되기에, 엔티티의 필드값을 신뢰할 수 없게된다.


[ JPA 의 등장 ]

JPA란

JPA 는 자바 진영의 ORM 기술 표준이다. ORM 이란 객체 관계 매핑을 말하는데. 객체와 관계형 데이터베이스의 중간에서 매핑시켜주는 프레임워크를 말한다. 정확히는 JAVA 어플리케이션과 JDBC 사이에서 동작한다. JPA 는 인터페이스의 모음이며, 구현체로는 주로 Hibernate 를 사용한다.

JPA의 장점

1. 생산성
저장 : em.persist(객체)
조회 : em.find(타입, PK값)
수정 : 조회한 객체 수정하면 자동 flush
삭제 : em.remove(객체)
-> SQL 직접 짤 필요없이 JPA가 CRUD 를 자동제공한다. 생산성이 증대.

2. 유지보수
객체의 필드가 변경되어도 쿼리문을 JPA가 짜므로 일일이 SQL을 수정할 필요가 없다. JPA가 자동으로 반영해서 수정한 SQL문을 생성한다.

3. JPA와 패러다임 불일치 해결

  • 상속
    상속 테이블을 DB에 삽입시 자동으로 쪼개서 삽입해준다.
  • 엔티티 신뢰
    필드 객체를 get으로 조회할 경우 자동으로 Select Join 문을 실행해서 필드 객체를 채워준다. 따라서 엔티티의 필드를 신뢰할 수 있게 된다.

4. 성능 개선

  • 캐시
    하나의 트랜잭션의 동일한 Select 문들은 캐싱해둔 같은 객체를 반환한다.
  • 쓰기지연
    트랜잭션을 커밋할 때 까지 INSERT SQL 을 모아두었다가 커밋 직전에 한번에 수행한다.
  • 지연로딩
    객체의 필드를 get으로 조회할 때 쿼리날려서 필드 값을 가져오는 지연로딩을 지원한다.

[ 정리 ]

기존 JDBC 방식은 객체를 수정해도 SQL문 까지 모두 수정해야하는 SQL 의존 개발이 이루어진다. JPA 는 객체<->테이블의 SQL 문을 자동으로 생성해주므로 생산성이 향상되고 유지보수가 용이하다.

0개의 댓글