JPA(Java Persistence API)란?
JPA란 Java Persistence API의 약자로 Java를 이용해서 데이터를 유지 또는 관리하는 기법을 하나의 스펙으로 정리한 표준
기존의 JDBC 등을 이용해서 직접 구현헀던 데이터베이스 관련 작업을 대신 처리해 주는 추상화된 계층의 구현 스펙으로 JPA를 이용하면 데이터베이스에 대한 처리를 JPA계층에서 처리하기 때문에 좀 더 추상화된 형태의 코드를 제작하는 것만으로 개발이 가능해진다.
하지만, JPA는 그 자체로는 스펙에 불과하기 때문에 이를 실제로 구현한 제품이나 프레임워크들의 존재가 필수적이다.
JPA의 장점
1. DB 관련 코드에 대해 유연함을 얻을 수 있다.
- 기존에는 DB(DataBase)에 변경이 일어나게되면 SQL문을 비롯한 DAO(Data Access Object)나 Service, 화면까지 영향을 비치게 되지만 JPA를 이용하면 테이블 생성 등과 같은 작업부터 변경되는 DB설계와 JAVA설계를 한 번에 처리할 수 있어 빠른 생산성을 얻을 수 있다.
2. DB와 독립적 관계로 특정 벤더의 데이터베이스에 종속적이지 않다.
- 개발자들은 DB 제품이 변경되거나 버전이 변경되는 문제에서 자유로워질 수 있다. 물론 데이터베이스 제품에 따라서 지원하는 기능에 차이가 있다.
JPA의 단점
1. 러닝커브(Learning Curve)가 크다.
- 새로 배워야하는 기능들이 많기 때문에 학습곡선 (Learning Curve, 러닝커브)가 크다.
2. 근본적인 객체지향 설계 사상이 반영되어야 한다.
- JPA는 객체들과의 관계를 어떻게 적합하게 작성할 것인가? 에 따라 프로젝트의 성패가 좌우된다. 충분한 검토와 설계를 걸쳐야 하지만 현실적으로 일정이 바쁘거나 개발의 숙련도에 따라 극복해야 할 문제들이 존재한다.
3. 특정 DB의 강력함을 활용할 수 없다.
- JPA를 이용하면 SQL튜닝 등의 작업에 제약이 생길 수 있다. native SQL이라는 기능을 지원해서 기존의 SQL을 재사용할 수 있는 방법도 있지만, 이 경우 DB에 독립적인 개발이 불가능하기 때문에 JPA의 장점을 잃는 한계를 갖게 된다.
JPA의 구조
JPA를 이용하면 Java로 작성된 클래스, 객체들과 DB상에 테이블, 레코드들을 자동으로 관리하게 된다.
개발자는 별도의 SQL을 작성할 필요 없이, 원하는 객체지향의 구조를 설계하는 것만으로 모든 개발을 끝낼 수도 있다.
Entity와 Entity Manager
Entity는 데이터베이스상에서 데이터로 관리하는 대상을 의미한다.
예를 들어 '상품', '회원', '리뷰' 등과 같이 명사이면서 개발하고자 하는 것과 관련된 데이터들을 엔티티로 규정한다.
이때 Lombok을 통해서 @Entity 라는 어노테이션을 사용하여 테이블을 생성하게 하고 각각의 추가된 데이터들은 인스턴스 또는 레코드라고 한다.
Entity Manager는 여러 엔티티 객체들을 관리하는 역할을 하는데 일종의 'Life Cycle'이라고 할 수 있다.
엔티티 매니저는 영속 컨텍스트(Persistence Context)라는 곳에서 객체들의 'Life Cycle'을 관리하게 된다.
- New(비영속) : Java 영역에 객체만 존재하고, 데이터베이스와 연동된 적이 없는 상태로 엔티티 매니저의 관리하에 있는 것이 아니기 때문에 순수한 Java 객체
- Managed(영속) : 데이터베이스에 저장되고, 메모리상에서도 같은 상태로 존재하는 상태. 객체는 영속 컨텍스트(Persistence Context) 내에 들어가게 되고, id(PK)값을 통해서 필요한 엔티티 객체를 꺼내 사용할 수 있게 된다.
- Removed(삭제) : 데이터베이스상에서 삭제된 상태. 객체는 더 이상 영속 컨텍스트에 존재하지 않는다.
- Detached(준영속): 영속 컨텍스트에서 엔티티 객체를 꺼내서 사용하는 상태로 준영속 상태의 객체는 고유한 id(PK)를 가지고 있지만, 아직 데이터베이스와 동기화가 이루어지지 않은 상태.
참고 : 초급 개발자들을 위한 가볍고 넓은 스타트 스프링 부트 - 구멍가게 코딩단
'백엔드' 카테고리의 다른 글
Nginx란 무엇인가? Nginx 개념 설명 (0) | 2022.09.04 |
---|---|
JPA Annotations JPA 어노테이션 (0) | 2022.01.17 |