TIL - [DAY 2] JPA란?

jihan kong·2022년 5월 13일
0

Spring Boot 개념정리

목록 보기
2/6
post-thumbnail

스프링에 대해 학습하였으니 이제 JPA를 들여다볼 차례이다.
JPA에 대해 여러 특징들이 있지만 강의에서 나온대로 하나씩 학습할 예정이다.

먼저, 용어정리부터 짚고 넘어가자!
JPA는 JAVA Persistence API의 줄임말이다.
JAVA는 알겠는데, Persistence는 무엇이고 API는 무엇일까?


먼저 `Persistence` 에 대해 알아보자.

영속성(persistence)이란?

: 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성

즉, 데이터를 영구적으로 저장하는 것을 의미한다. 나중에 배울 영속성 컨텍스트에서 다시 언급될 것이므로 이 정도 개념만 알고 넘어가자.

그렇다면 API는?
우리가 잘 알고 있는 Application Programming Interface이다.

Interface vs Protocol

Interface와 Protocol은 일종의 약속 혹은 규약이라는 점에서 비슷하다. 하지만 몇가지 차이점이 존재한다. 강사님께서 알기 쉽게 설명해주셨는데 다음의 그림을 보자.

A, B, C 세 친구가 평화롭게 지내고 있었다.
그런데 돌연, B가 왕관을 쓰고 다음과 같이 선포했다.

이 때, 어떤 반응을 보일지 Interface와 Protocol의 상황을 보자.

1. Interface

2. Protocol

위의 상황처럼 인터페이스는 엄격하게 상하관계가 존재하는 약속이다. 즉, B가 만든 프로그램을 사용하기 위해서는 A 혹은 C는 프로그램의 규약과 규칙을 모두 지켜야만 사용 혹은 재사용이 가능하다. 추가적으로 하위 계층이 상위 계층에 제공하는 인터페이스를 서비스(service)라고 한다.

그러나, 프로토콜은 다르다. 상하관계가 없으며 상호 연동되는 시스템끼리 전송 매체를 통해 데이터를 교환할 때 따르는 어떤 표준화된 규칙일 뿐이다. "WWW" 와 같은 월드 와이드 웹, 혹은 이메일 같은 것을 예로 들 수 있다. 또한, 프로토콜에는 용도와 상황에 맞게 다양한 통신 방식이 존재한다. HTTP, FTP, SFTP, Telnet, SMTP 등이다. 따라서 B가 선언한 방식대로 꼭 따를 필요는 없는 것이다.
(그 것이 데이터를 전송할 유일한 방법이라면 따라야겠지만..)

즉, 정리하면 "JPA ( Java Persistence API )" 란 JAVA 프로그래밍을 할 때 영구적으로 데이터를 저장하기 위해 필요한 인터페이스라고 할 수 있다.
다시 말하면 자바 ORM 기술에 대한 API 표준 명세서인 셈이다.

JPA 사용 시 장점😄

JPA를 사용하면 다음과 같은 장점이 있다.

1. 특정 데이터베이스에 종속되지 않는다.

애플리케이션 개발을 위해 데이터베이스로 오라클(Oracle)을 사용하여 개발했다고 가정하자. 만약 오라클을 오픈소스인 MariaDB로 변경한다면 데이터베이스마다 쿼리문이 다르기 때문에 전체를 수정해야 한다. 즉, 처음 선택한 데이터베이스를 변경하기가 어렵다.
하지만 JPA는 추상화되어있기 때문에 설정 파일에 어떤 데이터베이스를 사용하는지만 명시하면 얼마든지 DB를 변경할 수 있다.

2. 객체 지향적 프로그래밍

JPA를 사용하면 데이터베이스 설계 중심의 패러다임에서 객체지향적으로 설계가 가능하다. 이로 인해 좀 더 직관적이고 비즈니스 로직에 집중할 수 있게 해준다.

3. 생산성 향상

데이터베이스 테이블에 새로운 컬럼이 추가되었을 경우, 해당 테이블의 컬럼을 사용하는 DTO 클래스의 필드도 모두 변경해야한다. JPA에서는 테이블과 매핑된 클래스에 필드만 추가한다면 쉽게 관리가 가능하다. 또한 SQL문을 직접 작성하지 않고 객체를 사용하여 동작하기 때문에 유지보수 측면에서 좋고 재사용성도 증가한다.


반면에 JPA를 사용할 때 단점도 존재한다.

JPA 사용 시 단점😥

1. 복잡한 쿼리 처리

통계 처리와 같은 복잡한 쿼리를 사용할 경우는 SQL문을 사용하는게 나을 수도 있다. JPA에서는 Native SQL을 통해 기존의 SQL문을 사용할 수 있지만 그렇게 된다면 특정 데이터베이스에 종속된다는 단점이 생긴다. 이를 보완하기 위해 SQL과 유사한 기술인 JPQL을 지원한다.

2. 성능 저하 위험

객체 간의 매핑 설계를 잘못했을 때 성능 저하가 발생할 수 있으며, 자동으로 생성되는 쿼리가 많기 때문에 개발자가 의도하지 않는 쿼리로 인해 성능이 저하되기도 한다.

3. 학습 시간

JPA를 제대로 사용하려면 알아야할 것이 많아서 학습하는 데 시간이 오래 걸린다.


JPA 동작 방식🔄️

1. Entity

엔티티란 데이터베이스의 테이블에 대응하는 클래스라고 생각하면 된다. @Entity 가 붙은 클래스는 JPA에서 관리하며 엔티티라고 한다. 예를 들어, 데이터베이스에 item 테이블을 만들고, 이에 대응되는 Item.java 클래스를 만들어서 @Entity 어노테이션을 붙이면 이 클래스는 엔티티가 되는 것이다. 클래스 자체나 생성한 인스턴스도 엔티티라고 부른다.

2. Entity Manager Factory

엔티티 매니저 팩토리는 엔티티 매니저 인스턴스를 관리하는 주체이다. 애플리케이션 실행 시 한개만 만들어지며 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성한다.

3. Entity Manager

엔티티 매니저란 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공한다. 내부적으로 데이터베이스 커넥션을 사용하여 데이터베이스에 접근한다. Entity Manager 의 몇 가지 메소드는 다음과 같다.

  1. find() : 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우, 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장한다.
  2. persist() : 엔티티를 영속성 컨텍스트에 저장한다.
  3. remove() : 엔티티 클래스를 영속성 컨텍스트에서 삭제한다.
  4. flush() : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영한다.
profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글