본문 바로가기

내일배움캠프/Today I Learned

[TIL] 나의 스물아홉번째 회고록

JPA심화 

 

📚JPA란?

JPA란(Java Persisitence API) 어플리케이션과 JDBC 사이에서 동작하는 API

 

*JPA 개념에서 빠지지 않는'ORM (Object Relational Mapping)' 기술을 사용한다 ORM은 객체와 테이블을 매핑해주는 역할을 함.

 

- 왜 JPA를 사용해야 하는지?

1) 생산성 : JPA를 자바 컬렉션에 객체를 저장하듯 JPA에게 저장할 객체를 전달.

INSERT SQL을 작성하고 JDBC API 사용하는 지루하고 반복적인 일을 JPA가 대신 처리해준다.

CREATE TABLE같은 DDL문 자동 생성

데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전

 

2) 유지보수 :

엔티티에 필드 추가시 등록, 수정, 조회 관련 코드 모두 변경
JPA를 사용하면 이런 과정을 JPA가 대신 처리
개발자가 작성해야 할 SQL과 JDBC API 코드를 JPA가 대신 처리해줌으로 유지보수해야 하는 코드 수가 줄어든다.

 

3) 패러다임의 불일치 : 상속, 연관관계, 객체 그래프 탐색, 비교하기 같은 패러다임 불일치 해결

 

4) 성능 : 다양한 성능 최적화 기회 제공, 어플리케이션과 데이터베이스 사이에 존재함으로 여러 최적화 시도 가능

 

5) 데이터 접근 추상화와 벤더 독립성 :

데이터베이스 기술에 종속되지 않도록 한다.

데이타베이스를 변경하면 JPA에게 다른 데이터베이스를 사용한다고 알려주면 됨.

 

📚영속성이란?

영속성(persistence)은 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다

영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어버리게 된다. 결국 영속성은 특정 데이터 구조를 이전 상태로 복원할 수 있게 해주어 프로그램의 종료와 재개를 자유롭게 해준다

 

영속성이 필요한 객체를 'persistent object'라한다. 

 

📚영속성 컨텍스트란?

영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 

엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

  • 엔티티 매니저를 생성할 때 하나 만들어진다.
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있다.

📚영속성 컨텍스트에서의 엔티티 생명 주기 

  • 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 상태
  • 영속(managed): 영속성 컨텍스트에 저장된 상태
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed): 삭제된 상태

📚 영속성 컨텍스트의 특징

 

- 영속성 컨텍스트의 식별자 값

영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다.

 

- 영속성 컨텍스트와 데이터베이스 저장

JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터 베이스에 반영하는데 이를 flush라 한다.

영속성 컨텍스트가 엔티티를 관리하면 다음과 같은 장점이 있다.

 

  • 1차 캐시 
  • 동일성 보장
  •  트랙잭션을 지원하는 쓰기 지연
  • 변경 감지

 

- 1차 캐시 : 영속성 컨텍스트 내부에는 캐시가 있는데 이를 1차 캐시라고 한다. 영속 상태의 엔티티를 이곳에 저장한다.

1차 캐시의 키는 식별자 값(데이터베이스의 기본 키)이고 값은 엔티티 인스턴스이다

 

- 동일성 보장 : 영속성 컨텍스트는 엔티티의 동일성을 보장한다.

 

- 트랜잭션을 지원하는 쓰기 지연 : em.find(member)를 사용해 member를 저장해도 바로 INSERT SQL이 DB에 보내지는 것이 아니다. 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아둔다.

그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 DB에 보낸다. 이것을 트랜잭션을 지원하는 쓰기 지연이라 한다.

 

- 변경 감지 : JPA로 엔티티를 수정할 때는 단순히 엔티티를 조회해서 데이터를 변경하면 된다.

 

 

 


저번주부터 오늘까지 게시판(글 생성, 조회, 수정, 삭제) postman을 사용하지않고

html, css를 완성시켜 하나의 페이지를 천천히 구현하고자 하는 욕심이 있었다. 

그러나 Tymeleaf를 사용하여 parameter값을 어떻게 넘겨야하는지

controller에서는 어떤 방식으로 parameter값을 받아와야하는지 고민하는데 시간을 오래 잡아먹었다. 

이번주 금요일까지 해당 게시판 과제에 기능을 덧붙여 제출을 해야하는데 조급한 마음이 들었다. 

내가 괜한 욕심을 부려서 과제 기한을 넘겨버리는 건 아닌지 속상한 마음이 들었지만 

오늘 양봉현 튜터님께서 "어떻게 하면 좋은 개발자가 될 수있을지"에 대한 강의를 해주시면서 

나를 힘나게 하는 말이 있었다.

 

"지금 나에게 1%의 가능성만 있다면 계속해서 노력해라"

 

이 말을 듣고 조급했던 마음이 사라졌다.

오늘부터 다시 천천히 배워가면서 지치지 않아야겠다는 마음을 다잡았다.

 

 

@출처 : 

https://ultrakain.gitbooks.io/jpa/content/chapter1/chapter1.3.html

 

1.3 JPA란 무엇인가? · jpa

 

ultrakain.gitbooks.io

@ 출처:

https://velog.io/@neptunes032/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%9E%80

 

JPA 영속성 컨텍스트란?

영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.em.persist

velog.io