JPA에 대해 알아보자
Updated:
JPA 소개
기존의 문제점
-관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술인 반면, 자바 같은 객체지향 프로그래밍 언어는 기능과 속성을 한 곳(객체)에서 관리하는 기술이다. 그렇기 때문에 이 둘 사이에서 패러다임의 문제가 발생한다
-또한, 아무리 자바 코드를 잘 짠다 할지라도 결국 SQL을 통해야만 DB에 접근할 수 있다. 그러다 보니 DB를 다루다 보면 객체지향 보다는 데이터 모델링에 더 집중하게 되고 결국 SQL에 종속적인 개발을 하게 된다
객체지향과 관계형DB의 차이
-연관관계: 객체는 다른 객체의 정보에 접근하기 위해 ‘참조’ 라는 방식을 사용하고 관계형DB는 PK 또는 FK를 통해서 ‘JOIN’ 하는 방식을 사용한다
-상속: 객체는 상속관계가 존재하지만 관계DB는 상속관계가 존재하지 않는다
-이 외에도 데이터타입 등 여러가지 차이점이 존재한다
JPA의 등장
-이런 상황에서 JPA가 자바 진영의 ORM(Object-Relational Mapping) 기술 표준으로서 모습을 드러낸다
-ORM(Object-Relational Mapping)이란 위에서 설명한 객체지향에서의 관점과 관계형DB에서의 관점 사이의 패러다임 불일치를 해결해주는 기술이다
-즉, 객체는 객체대로 설계하고 관계형DB는 관계형DB대로 설계하면 ORM이 중간에서 알아서 연결해주는 것이다
JPA의 동작
-JPA는 CRUD가 모두 정의되어 있어서 아래와 같이 적기만 하면 된다
→저장: jpa.persist(엔티티명)
→조회: jpa.find(엔티티명.class, 엔티티의ID값)
→수정: 엔티티인스턴스명.set속성명(“변경할 값”) eg)member.setName(“lim”)
→삭제: jpa.remove(엔티티명)
JPA의 특징
-기존에는 필드 변경 시에 모든 SQL을 수정해야 했지만 JPA를 사용하면 엔티티와 DB에 각각 필드와 컬럼만 추가해주면 됨
-만약 상속받고 있는 테이블이 있다면, jpa.persist()를 실행하면 자동으로 두군데 모두 INSERT 쿼리를 날려준다. 또한, 조회 역시 마찬가지다
성능 최적화 기능
java
String memberId="1";
Member member1=jpa.find(Member.class, memberId);
Member member2=jpa.find(Member.class, memberId);
member1==member2 //true를 반환해줌
-위의 코드와 같이 동일한 트랜잭션에서 조회할 경우에는 1차캐시를 이용하여 동일한 엔티티를 반환한다. 1차캐시가 무엇인지는 뒤에서 자세히 살펴보자
-또한, JPA는 또다른 성능 최적화 기능이 있는데, 트랜잭션을 커밋하기 전까지 INSERT SQL을 모두 모아서 커밋 시에 한번에 DB에 보낸다는 것이다
-지연로딩(객체가 실제 사용될 때 로딩)과 즉시로딩(JOIN SQL로 한번에 연관된 객체까지 미리 조회)를 상황에 맞게 사용하여 JPA의 성능을 더욱 향상시킬 수 있다. 보통, 2개 객체간의 관계를 설정할 때, 지연로딩으로 설정해놓고 나중에 성능 최적화를 위해 즉시로딩이 필요할 때에 해당 엔티티에서 fetch = FetchType.EAGER로 바꿔주기만 하면 된다.

Leave a comment