데이터베이스(must-have skills)/ORM_JPA

자바 ORM 표준 JPA 프로그래밍 정리 - 1장 소개

트밀 2022. 7. 7. 18:59
목차 
  • 이론
    • 소개
    • 시작
    • 영속성관리
    • 엔티티 매핑
    • 연관관계 매핑 기초
    • 다양한 연관관계 매핑
    • 고급 매핑
    • 프록시와 연관관계 관리
    • 값타입
  • 객체지향 쿼리 언어
  • 실무
    • 스프링 데이터JPA
    • 웹 어플리케이션과 영속성 관리
  • 고급주제
    • 컬렉션과 부가기능
    • 고급주제와 성능최적화
    • 트랜잭션과 락, 2차캐시

 

그 시작 ,바로 귀찮음. 

crudSQL작성과 객체를 다시 테이블에 매핑하는 무한 반복 작업 ..... 

이 해결을 위해 ORM(Object–relational_mapping)[각주:1]을 찾고, 그것을 적용하니 엄청난 장점(dbms를 바꿔도 되고, 생산성상승,테스트코드작성편리)이 생겼다. 

기존 Rdbms 개발 과정의 힘든 점 - 무한반복, sql의존적 개발

출처  - 김영한 저 , 자바 ORM 표준 JPA 프로그래밍

 

CRUD매핑하는 작업의 무한반복,  출처  - 김영한 저 , 자바 ORM 표준 JPA 프로그래밍

단순 회원을 관리하는 Member클래스를 CRUD 프로그램을 JDBC API로 짠다고 하면 항상 수반되는 작업(sql작성,jdbc함수호출,객체매핑)이 너무 반복되고 많다. 

 

또한 List와 같은 자바컬렉션은 RDBMS에서는 없어서 추가작업이 더 들어간다. 

 

엔티티에 강하게 의존하는 SQL 의존적 환경의 개발에서는 엔티티(비즈니스 요구사항을 모델링한 객체,ex)Member,Team)를 신뢰할 수 없다. (=계층분할의 의미가 없다. )

 

추가요구사항이 생긴다면?

엔티티를 신뢰할 수 없으니 dao의 코드를 항상 확인 및 수정해야 하고 동시에 sql도 수정해야 한다. 

 

그에 반해 JPA는 API만 사용하면 된다. 

    Member member = jpa.find(Member,class, memberID);

 

 

패러다임의 불일치

객체를  영속화하는 것은 2가지 - 파일과 db가 있다. 파일은 직렬화로 가능은 하지만 검색이 너무 힘들다는 단점이 있어 db가 많이 사용된다. 

DB에는 객체지향의 추상화,상속,다양성 같은 개념이 없다. 

 

패러다임의 불일치로 발생하는 구체적예시(상속)

조인의 과정과 테이블이 여러개가 만들어져 관리가 어렵다. jpa는 이 귀찮은 과정을 대신 해줌.

 

 

패러다임의 불일치로 발생하는 구체적예시(연관관계=참조)

객체는 참조가 있는 방향으로만 조회가능하지만, 테이블은 Join을 사용하기에 양방향 전부 조회 가능하다. 

물론 객체를 처음부터 테이블에 맞게 만들어도 되지만, 이경우 Team team =  member.getTeam()같은 객체지향의 프로그래밍을 지향하하기 어렵다. 

정리 - 객체모델은 외래키가 필요없고 단지 참조만 있으면 된다. 반면 db는 참조는 없어도 되고 외래키만 필요하다. 결국 개발자는 중간역할을 해야하고, Jpa는 이것을 대신 해준다. 

 

★패러다임의 불일치로 발생하는 구체적예시(객체그래프탐색)

위 그림과 같은 경우에서 member에서 item을 얻는 연관관계 그래프를 객체모델에서는 가능하다. 

Item item = member.getOrder().getOrderItem().getItem()

그러나 DB에서는 해당 외래키가 있는지에 따라 달려있다. 또한 그렇다고 해서 관련된 키를 전부 객체의 필드로 올려놓는 것은 메모리 낭비이다. 

Jpa는 지연로딩으로 해결해서 설정에 따라 함께조회할지 나중에 조회할 지를 설정할 수 있다. 

 

 

패러다임의 불일치로 발생하는 구체적예시(비교)

객체모델은 동등성비교와 동일성비교가 있다. 

반면 데이터는 primary key값으로 row를 구분한다. 

따라서 같은 데이터라고 해도 자바에서는 동일하지 않은 인스턴스가 발생하는 문제가 발생한다. 

jpa는

equals를 재정의해서 해결하면 되지 않을까? 이게 불편해서? 

 

그렇다면 JPA란?

 

 

자바진영의 ORM기술표준이다. 

어플리케이션과 JDBC API 사이에서 동작한다. 

 

언어마다 그것의 구현정도는 저마다 다르겟지만 거의 orm프레임워크를 가지고 있다. 

자바진영에서는 엔티티빈과 하이버네이트가 있지만 하이버네이트가 더 우세하다. 결국 ejb3.0에서 하이버네이트 기반으로 자바표준이 만들어졌는데 그것이 JPA이다. 

 

버전별특징

■ JPA 1.00(JSR 220) 2006년: 초기 버전이다. 복합 키와 연관관계 기능이 부족했다.

■ JPA 2.0(JSR 317) 2009년: 대부분의 ORM 기능을 포함하고 JPA Criteria가 추가 되었다.

■ JPA 2.1(JSR 338) 2013년: 스토어드 프로시저 접근, 컨버터, 엔티티 그래프 기능 이 추가되었다.

 

왜 JPA를 사용하여야 하는가?

생산성 - crud용sql과 반복적인 코드 작성 x 

유지보수 - 삭제하거나 수정해야할 코드가 줄어든다. 

패러다임불일치 문제 해결 

성능 -힌트, 같은 코드에 대한 쿼리실행반복x(캐싱)  

데이터접근추상화와 벤더독립성 - 한가지 데이터제품에 의존하지 않아도 된다. 

표준 -구현체도 바꿀수 있다. 

 

자주물어보는 질문

1.sql과 db를 잘알아야 됩니다. 

2.다양한 성능최적화기능, 직접적 sql호출 등이 있어서  더빠르기도 합니다. 단, 잘 기술을 이해못하면 그 유명한 N+1문제를 겪기도 합니다. 

3.통계보다는 실시간처리쿼리에 더 적합한 기술이긴 합니다.  그러한 경우에는 JPA의 네이티브SQL이나 SQL매퍼형태프레임워크(JdbcTemplate,Mybatis)를사용하십시오. 

4. SQL매퍼형태프레임워크(JdbcTemplate,Mybatis)는 sql과 객체를 매핑, 반면 JPA는 테이블과 객체를 매핑.

5. 수많은 프로젝트,대기업과 테스트코드가 있어 하이버네이트를 신뢰할 수 있다. 

6. 국내는 마이바티스가 우세하지만 해외는 하이버네이트가 우세하다. (책은 2014년도 조사),따로 내가 찾은 자료(그림 참고)[각주:2]

"클라우드 네이티브 자바"의 저자 'Josh Long'의 트위터

7.학습곡선은 높다. 매핑방법,핵심개념(영속성콘텍스트)가 부족하면 안쓰느니만 못합니다. JPA는 객체지향과 RDBMS라는 2기둥위에 있는 기술이라서 이 기둥을 모르면 안됩니다.