티스토리 뷰

Back-end/JPA

[JPA#2] JPA란?

douStory 2022. 2. 13. 22:32
728x90

JAVA진형의 ORM

객체는 객체대로 설계를 하고 관계형 데이터 베이스는 관계형 데이터베이스 답게 설계를 한다음에

중간의 차이를 ORM으로 처리를 해준다는 개념이다

 

JPA의 동작은 어떻게 하느냐 JPA가 엔티티를 분석한다

JDBC API를 사용해서 쿼리를 JPA가 보낸다.

패러다임의 불일치를 해결해준다는 것이 가장 큰 의의라고 할 수 있다

 

조회할때? 

요청하면 SELECT SQL 생성을 해준다

JDBC API를 사용해서

ResultSet매핑

패러다임의 불일치를 해결해준다

 

JPA의 소개

 

역사? 과거에는 EJB라는게 있었다.

EJB는 자바 표준으로 하고 있었다 과거의 ORM이라고 할 수 있음

근데 너무 아마추어 였다, 인터페이스도 굉장히 많이 상속받아서 무겁고 

심지어 작동도 잘안됐다. 

 

이걸 사용하던 어떤분이 화가나서 ORM 프레임워크를 만들었는데 하이버네이트였다.

하이버네이트를 만들었던 개발자를 JAVA에서 데려와서 JPA를 만들었다.

 

JPA는 인터페이스의 모음이라고 할 수 있다.

거의 하이버네이트라고 할 수 있다.

 

이거 말고도 웃긴일이 하나 더있었음

EJB에 컨테이너 역할을 해주는 애가 있었다.

근데 그것도 참 못만들었었다.

그래서 EJB를 사용하지 말고 순수하게 사용하자 그래서 스프링이 나오게 되었다.

 

그래서 결론은 몬난 EJB 덕분에 스프링도 나오고 JPA 나왔기 때문에 감사해야한다.

 

JPA를 왜 사용해야할까?

 

생산성 적인 측면에서 살펴보자

저장 : jpa.persist(member) 이런식으로 쿼리가 다 만들어져 있다.

주목해야할 것은 

수정 : member.setName("변경할 이름")

라고 치면 그냥 수정이 된다.

이게 생각보다 혁신적인 기능이다. 

 

유지보수의 측면은?

기존에는 필드변경시 모든 SQL을 수정했어야 한다.

인서트 셀렉트 업데이트 각각 모두 수정을 했어야한다 마이바티스인 경우?

근데 엔티티만 수정하면 JPA는 바로 사용이 가능하다.

 

JPA가 정말 대단한 건 패러다임의 불일치 해결해줬다는 것이다.

 

자바의 객체 상속관계와 / Table 슈퍼 타입 서브관계로 나눌 수 있는데.

Jpa.persist(member) 라고 하면 쿼리가 두번 짜져야 하는데 

JPA가 알아서 테이블 구조에 맞게 쿼리를 각각 날려주기 때문에

개발자는 테이블 구조를 생각하지 않고 개발에 집중 할 수 있어진다.

 

이게 생각보다 굉장히 혁신적인 내용이다.

 

JPA와 연관관계, 객체 그래프 탐색

연관관계 저장.

member.setTeam(team);

jpa.persist(member);

 

신뢰할 수 있는 엔티티, 계층

지연 로딩이라는 기능으로 SQL이 나가는 타이밍에 객체를 체워줘서 

믿을 수 있는 데이터를 만들 수 있다.

 

동일한 엔티티에서 조회한 데이터는 같음을 보장한다

 

JPA의 성능 최적화 기능 

JPA를 쓰면 성능이 더떨어질까 고민을 할수가 있음.

중간계층이 있으면 할 수 있는게 있음

데이터를 모아서 보네는 버퍼링과, 저장기능인 캐싱 과 같은 기능 을 사용하여 성능을 향상 시킬 수 있음

 

1차 캐시와 동일성 보장

같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회성능을 향상 시킨다.

트렌젝션 한번 사이의 캐시보장이긴하지만 정말 약간의 성능 향상을 기대 할 수 있다.

 

트랜잭션을 지원하는 쓰기 지연

버퍼기능

JTBC BATCH 기능을 사용하면 SQL을 한번에 쓸 수 있는데 굉장히 코드가 복잡하다.

그러나 JPA에서는 커밋되는 순간 한번에 보내는 옵션이 있다.

 

지연로딩과 즉시로딩

JPA에서 굉장히 중요한 부분이다. 

지연로딩이 뭐냐면 맴버객체를 JPA를 통해서 꺼낸다 

근데 맴버만 딱 가져온다 

그리고 팀객체를 가져온다

맴버를 조회할때 팀을 함께 가져올 수도 잇고

나중에 팀이 사용될 때 가져올 수 도 있고

그걸 옵션으로 자연스럽게 설정할 수 있다.

 

맴버만 주로 사용하고 팀은 가끔가다 한번씩 쓴다 그럼 지연로딩이 괜찮고

맴버와 팀이 항상 함께 쓰인다 그럼 즉시로딩이 괜찮을 수 있다.

 

'Back-end > JPA' 카테고리의 다른 글

[JPA#1] JPA를 사용하는 이유  (0) 2022.02.03
댓글