본문 바로가기

개발일지/TIL

[230627] 네트워크와 Java Spring 기본 개념 이해하기 (5)

JPA

❓ JPA는 뭔가요?
💬 JPA(Java Persistence API)는 Java에서 사용하는 ORM 기술에 대한 표준 명세이다.
❓ ORM은 뭐죠? 장점은?
💬 ORM(Object-Relational Mapping)은 객체와 DB의 관계를 연결시켜 주는 친구다. 기존에 SQL을 수행하거나 가져온 DB의 데이터를 객체에 연결시켜 주기 위해서는 많은 작업들이 필요했다. 이러한 것들을 중간에서 처리해 줌으로 개발을 더 간편하게 할 수 있도록 했다.
❓ JPA의 가장 큰 장점?
💬 내가 생각하기에는 JPA의 가장 큰 장점은 DB에 대한 작업을 객체 단위로 다룰 수 있다는 것이다. 자바는 객체지향 언어이기 때문에 JPA 도입으로 DB작업에도 일관성이 부여된 것 같다.
❓ JPA사용할 때 쓰는Hibernate는 뭔가요?
💬 Hibernate는 ORM 프레임워크이다. JPA 표준 명세에 따른 구현체라고 보시면 됩니다. 자바 스프링은 기본으로 Hibernate를 사용한다고 합니다. "다른 구현체가 있는지? 적용하는 방식?"은 시간이 될 때 알아보면 좋겠다.
❓JPA 동작 과정은?
💬 Entity Manager Factory에서 Entity Manager를 생성한다. 생성된 Entity Manager는 Persistence Context에 접근할 수 있으며 Context 내부에 있는 Entity 저장 및 관리한다. 필요에 따라 Entity를 DB에 저장하거나 DB에 있는 데이터를 Entity로 가져와 Persistence Context에 Entity를 저장하는 등의 작업을 수행한다. 
❓Entity Manager Factory는 뭐가요?
💬 Entity Manager를 만들기 위한 공장으로, DB에 대한 정보들을 받아 요청에 따라 Entity Manager를 만들어준다. 일반적으로 DB 하나에 하나만 생성되고 애플리케이션이 동작하는 동안만 사용된다고 한다.
❓Entity Manager는 뭐가요?
💬 persistence Context에 접근하여 Entity를 저장하고 관리한다. 또한 Persistence Context와 DB를 연결해 주는 다리 역할을 한다. Entity를 DB에 저장을 하거나 DB에 있는 데이터를 persistence Context에 저장을 한다던가.
❓Entity는 뭔가요?
💬 DB의 테이블과 매핑되며 JPA에서 관리되는 클래스, 객체를 의미한다. 
❓Persistence Context는 뭐가요?
💬 Entity를 효율적으로 관리하기 위해 만들어진 공간이라고 한다. 1차 캐시와 쓰기 지연 장소로 이루어져 있다. 1차 캐시는 Entity를 저장하는 장소이며 상황에 따라 DB 커넥션을 줄여주기도 한다. LoadedState에 DB에서 가져온 데이터를 가지고 있어 Dirty Checking 기능을 사용할 수 있게 해 준다. 쓰기 지연 장소의 경우 JPA의 Transaction의 기능을 담당해 준다고 생각하면 좋은 것 같다. 모든 작업이 성공적으로 끝나고 Commit 명령이 떨어지기 전까지 SQL문을 모아두는 곳이다. 이렇게 모아둔 SQL문은 작업 도중 실패하면 에러가 뜨면서 DB로 날아가지 않는 것이다. 
❓Dirty Checking은 뭐가요?
💬 Persistence Context에 있는 1차 캐시에서 LoadedState와 현재 Entity를 비교하여 변경이 되어있을 경우 자동 update 문을 날려주는 기능입니다.
❓Transaction의 장점은?
💬 데이터의 무결성을 지켜줄 수 있다. 모든 작업이 성공한 이후 데이터가 들어가야 하는데, 중간에 실패하고 일부분만 DB에 적용이 된다면 데이터에 대한 신뢰성이 깨진다. 그래서 모든 작업이 성공하거나 실패하거나 둘 중 하나로 귀결되며, 이것은 "SQL 문을 모두 실행하거나 실행하지 않거나"의 결과를 가져온다. 
❓Transaction, Persistence Context의 생명주기는?
💬  생명주기는 Service, Repository 두 영역에 걸쳐있다. 자바 스프링에서 Transaction은 전파가 되기 때문에 일반적으로 Service와 Repository 두 부분 모두 Transaction을 사용한다. Service에까지 Transaction을 쓰는 이유는 Dirty Checking을 사용하기 위해서가 아닌가 싶다. 그리고 자바 스프링에서 Transaction의 생명주기와 Persistence Context의 생명주기는 일치합니다.
❓Entity의 상태는?
💬 Transient, Managed, Detached, Removed,  4가지 상태를 가지고 있습니다. Transient는 애플리케이션에서 생성된 Entity 객체를 말하며 아직 Persistence Context에 의해 관리받지 않는 상태입니다. Managed는 Persistence Context에 의해 관리를 받고 있는 상태입니다. Detached는 Persistence Context에 의해 관리를 받다가 관리받지 않게 된 상태입니다. Removed는 DB에서 조회해 온 Entity를 삭제시키는 상태입니다.
 

Apache OpenJPA 2.1 User's Guide

Last updated on July 20, 2011 at 9:11 AM.

openjpa.apache.org

생각

각각의 개념의 문제가 아니라 전체적인 흐름을 잡는 것이 힘들었다. JPA가 Entity를 어떻게 관리를 하고 DB에 요청을 보내고 응답을 받는지 말이다. 그래도 글로 적다 보니 감이 와서 다행이라고 생각한다. 이제는 실제로 JPA를 코드 작성하고 실행하며 마주치는 문제를 통해 더 깊게 들어가 봐야겠다.