Spring/JPA
(JPA) JPA를 사용해야하는 이유
주누
2021. 3. 7. 21:26
생산성 측면
저장 : jpa.persist(member)
조회 : Member member = jpa.find(memberId)
수정 : member.setName("변경할 이름")
삭제 : jpa.remove(member)
위와 같이 상당히 간편한 과정으로 CRUD를 처리할 수 있다.
유지보수 측면
class Member {
private final Integer memberId;
private final String name;
}
INSERT INTO MEMBER (MEMBER_ID, NAME) VALUES ...
SELECT MEMBER_ID, NAME FROM MEMBER ...
기존의 코드에는 Member에 필드 값을 추가한다면 여러 가지 부가적인 과정들을 처리해야 하지만 JPA는 필드만 추가시켜주면 된다.
class Member {
private final Integer memberId;
private final String name;
// 추가
private final String tel;
}
패러다임의 불일치 해결
앞의 포스팅에서 언급한 객체와 관계형 데이터베이스 간의 패러다임의 불일치를 해결해준다.
예를 들어 아래와 같은 코드를 작성하면
jpa.persist(son);
기타 작업 (INSERT 쿼리를 두 개로 쪼개서 날린다.) 은 JPA가 처리해준다. (SELECT도 마찬가지로 JOIN으로 알아서 해결해 준다.)
INSERT INTO PARENT ...
INSERT INTO SON ...
연관관계 해결
앞의 포스팅에서 클래스에서 필드의 타입을 인스턴스로 하였을 때 연관관계의 불일치가 일어난다고 하였는데 JPA는 이러한 과정을 해결해준다. (지연 로딩)
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
엔티티의 신뢰성 문제 해결
class MemberService {
public void process() {
Member member = memberDAO.find(memberId);
// 호출할 수 있을까?
member.getTeam();
member.getDelivery().getOrder();
}
}
앞의 포스팅에서 find시에 쿼리를 일일이 찾아서 호출 여부를 확인해야만 하였다고 언급하였지만 JPA는 이러한 과정을 해결해준다.
즉 JPA가 가져온 데이터는 신뢰할 수 있는 데이터라는 뜻이다.
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장해준다.
Integer memberId = 100;
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1= member2;
위의 결과가 TRUE로 나온다.
성능 최적화 기능
- 1차 캐시와 동일성을 보장한다.
- 트랜잭션을 지원하는 쓰기 지연 (버퍼링)
- 즉시 로딩과 즉시 로딩 - 최적화가 필요할 때 즉시 로딩으로 바꿔서 성능 최적화를 이룰 수 있다.
References
www.inflearn.com/course/ORM-JPA-Basic/dashboard