[JAVA ORM 표준 JPA 프로그래밍] 1. JPA? ~ 영속성 컨텍스트

Junho Bae·2021년 1월 3일
1

SPRING JPA

목록 보기
1/5
post-custom-banner

인프런 김영한님의 <JAVA ORM 표준 JPA 프로그래밍> 강의 노트를 간략하게 정리하고자 합니다. 제가 보려고 정리하는 거니까 간단하게 할겁니다 ㅎㅎ; 혹시라도 잘못 이해한 부분이 있을 수 있습니다! 피드백은 언제나 환영입니다.

1. JPA?

현재의 모던 어플리케이션 개발은 대체로 객체지향을 활용하고 있으나, 현재 DB의 주주류는 RDBMS입니다. 그러다 보니, 객체를 관계형 DB에 맞추어 관리를 해야 했습니다. 즉, 이러한 sql문 중심의 개발은 여러 문제가 있었습니다.

1) 반복되고 지루한 코드

CRUD 쿼리를 다 짜야 하고, Java를 sql로 바꾸고 sql을 java로 바꿔야 하고,테이블 하나 만들거나 변경될 때 마다 수십개의 crud 쿼리를 짜야합니다. 가령, 유저 테이블에 전화번호 컬럼 없이 개발을 진행하는 도중 전화번호 컬럼이 필요하다면 수 많은 sql문을 다시 써야 합니다.

2) 패러다임의 불일치 : 객체 vs 관계형 데이터베이스

애당초에 관계형 db와 객체는 사상 자체가 다릅니다. 객체는 결국 잘 수항화, 정보은닉, 캡슐화, 상속, 다형성 등을 활용하는 것이 목표이고, RDBMS는 데이터를 정교하게 짜는 것이 목표입니다. 이러한 지향성의 차이가 존재하다보니 그 간격이 분명히 존재할 수밖에 없습니다.

3) 객체와 rdbms의 차이

rdbms에는 객체에 존재하는 상속 개념이 없습니다. 관계형 데이터베이스는 pk와 fk로 조인을 해야 합니다. 물론 슈퍼타입과 서브타입의 개념이 그나마 유사하기는 합니다.

이러다 보니, 객체답게 모델링을 할 수록 오히려 매핑 작업만 늘어납니다. 엄청나게 많은 sql문을 작성해야 하는 것이죠. 객체를 자바 컬렉션에 저장 하듯 rdbms에 저장 할 수는 없을까? 하는 고민에서 jpa가 시작합니다.

2. JPA 소개

1) ORM(Object-relational mapping)

객체는 객체대로, db는 db대로 설계를 하고, orm 프레임워크가 알아서 매핑을 해주는 것입니다. 즉, 개발자가 직접 jdbc api를 쓰는게 아닌 jpa를 쓰면 쿼리를 생성해 주어 패러다임의 불일치를 해결해 주는 것입니다.

2) JPA 표준 명세와 구현체

jpa는 인터페이스의 모음으로, 현재 jpa2.1 표준 명세를 구현한 3가지 구현체 중, hibernate를 가장 많이 사용합니다.

3) JPA를 왜 써야할까?

A. sql 중심적인 개발에서 객체 중심의 개발이 가능합니다.

B. 생산성 역시 sql문을 직접 사용하는 것 보다 훨씬 훌륭합니다. 마치 자바 컬렉션에 넣었다 뺐다 하는 것 처럼 관리가 가능합니다.

C. 유지 보수적인 측면에서도 더 좋습니다. 기존에는 만약 필드가 변경되면 쿼리문을 전부 수정해야 하지만, jpa를 사용한다면 그렇지 않습니다.

3. 영속성 컨텍스트

JPA에서 가장 중요한 것 두가지는 1)객체와 관계형 DB 매핑하기(DB를 어떻게 설계하고 어떻게 매핑할 것인가?) 와 2)영속성 컨텍스트(실제 JPA가 내붸서 어떻게 동작하는지, 메커니즘) 입니다. 영속성 컨텍스트에 대해서 우선 알아보겠습니다.

1) Entity Manager Factory와 Entity Manager

웹 어플리케이션 실행 -> 엔티티 매니저 팩토리 생성 -> 요청들에 따라 각각 엔티티 매니저 팩토리에서 엔티티 매니저를 생성 -> 각각의 매니저가 db 커넥션을 이용해 처리.

2) 영속성 컨텍스트?

영속성 컨텍스트는 JPA를 이해하는데 가장 핵심입니다. "엔티티를 영구 저장하는 환경"이라는 의미입니다.

EntityManager.persist("Entiy")

persist 메서드를 호출하는 것은 객체를 db에 저장한다고 생각할 수 있지만 사실은 "엔티티를 영속화" 하는 것으로, db에 직접 저장하는 것이 아니라, "영속성 컨텍스트"에 저장하는 것입니다.

영속성 컨텍스트란 논리적인 개념으로 눈에 보이지 않습니다. 엔티티 매니저를 생성하면, 영속성 컨텍스트라는 공간이 생긴다고 생각하면 좋겠습니다(대충 1차 캐시를 영속성 컨텍스트라고 생각해도 될 것 같습니다. 물론 어느정도 차이가 있기는 있습니다).

3) 엔티티의 생명주기

	Member member = new Member();

A. 비영속 : 위와 같이 최초로 객체를 생성한 상태로, 영속성 컨텍스트와는 아무런 관련이 없는 상태 입니다.

	em.persist(member);

B. 영속(managed) : 영속성 컨텍스트에 의해 관리되는 상태입니다. 이후 다루겠지만, 물론 위와 같이 persist 메서드를 호출한다고 해서 쿼리가 바로 날아가지는 않고, tx.commit() 시점에 실질적인 쿼리가 날아갑니다! 즉, 이 시점에 바로 DB에 반영되는 것은 아닙니다.

C. 준영속 : 그렇습니다.

profile
SKKU Humanities & Computer Science
post-custom-banner

0개의 댓글