URECA 과정을 진행하면서 해당강의를 중심으로 스터디를 진행하고 있다.
spring에 대해 1도 모르는 상태였기 때문에 개념정리를 목표로 시작했고, 현재 Spring과 JPA(1~7강)까지 정리한 상태이다.
복기를 위해 하나의 단원이 끝날 때마다 스터디 진행중에 논란?이 되었던 주제, 정확히 설명하지 못하는 주제에 대해 다시한번 정리하기로 했다.
JPA : 자바를 통해 DB를 관리하기 위한 기술
JPA = interface
JPA(Java Persistence API) 는 자바 필드로 생성한 데이터를 DB에 영구적으로 저장하기 위한 인터페이스 이다.
JPA로 여러 기능을 수행할 수 있다 라고 생각하다보니 어느순간 JPA = 라이브러리 라고 착각하고 있었는데,
다시 강조한다.
JPA 는 인터페이스 이다.
즉, JPA는 특정 기능(DB에 데이터를 저장하는 함수등)을 하는 라이브러리가 아니라,
자바에서 생성한 데이터를 어떻게 DB에 저장할 수 있는지를 정의하는 방법이다.
JPA 관련 자세한 내용은 스터디로 정리한 github 참고
인터페이스는 구현을 하지 않는다. 따라서 JPA도 구현부가 당연히 없다. 그럼 구현을 어디서하냐?
JPA : Hibernate = Java interface : Java class
Hibernate는 JPA의 구현체이다. (마치 Java에서 인터페이스를 implements 한 class가 인터페이스의 구현체를 만들듯이)
Spring data JPA : 더 쓰기 쉬워진 JPA
Spring이 제공하는, 한번 더 추상화된 JPA
raw한 JPA를 사용하려면, Entity Manager, annotation등등 정말 많은 내용을 설정해줘야 한다.
이 과정을 Spring을 통해 더 쉽게 만들어 주는 모듈이 Spring data JPA 이다.
JPA는 인터페이스라고 설명했는데, 이를 Repository 라는 인터페이스로 한번 더 추상화시켜준다.
이 말뜻이 뭐냐,
Spring data JPA의 Repository에서 JPA를 사용한다.
Repository 종류 & 과정
reository 인터페이스 또한 종류가 다양하다. 그 중에 유우 명한 몇개만 알아보자
1. CrudRepository
- 가장 기본적인 CRUD작업을 위한 메서드를 제공
- 기본적으로 제공되는 메서드: save(), findById(), existsById(), findAll(), count(), delete(), deleteById()
2. PagingAndSortingRepository
- CrudRepository를 확장하며, 페이징과 정렬 기능을 추가로 제공합니다.
- 페이징을 위한 findAll(Pageable pageable)과 정렬을 위한 findAll(Sort sort) 메서드를 제공합니다.
3. JpaRepository
- PagingAndSortingRepository를 확장하며, JPA와 관련된 추가적인 기능을 제공
- 배치 작업을 위한 saveAll(), 데이터 삭제를 위한 deleteAllInBatch() 등의 메서드를 추가로 제공
4. Custom Repository
- 사용자 정의 메서드를 구현하여 특수한 비즈니스 로직을 처리
사용자가 Repository interface에 정해진 규칙대로 메소드 입력 → Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 만드는 구현체 제공 → Bean으로 등록
이 과정을 통해 Repository를 사용할 수 있는데,
JPA의 불편한 점을 개선시켜준 과정은 메소드 이름을 기반으로 쿼리를 자동 생성하는 부분이다.
JPA와 Spring Data JPA 비교
JPA만 사용할 때의 불편한 점
- 반복적인 코드 작성 : entity의 CRUD작업을 수행하려면 EntityManager를 사용하여 직접 쿼리를 작성해야 한다.
이 과정은 반복적이고 귀찮다.. - 직접 쿼리 작성 : 특정 조건에 따른 조회 쿼리를 작성하려면 JPQL 또는 네이티브 쿼리를 직접 작성해야 한다. 이는 실수할 가능성이 높고, 쿼리 작성에 많은 시간이 소요될 수 있다.
- 표준화 부족 : 각 개발자가 직접 쿼리를 작성하다 보면 코드의 일관성이 떨어질 수 있다.
Spring Data JPA의 개선점
- 자동 쿼리 생성 : Spring Data JPA는 Repository 인터페이스에 메소드 이름을 정의하면, 메소드 이름에 따라 적절한 쿼리를 자동으로 생성한다.
ex) findByLastName(String lastName)이라는 메소드를 정의하면, Spring Data JPA가 자동으로 lastName 필드를 기준으로 한 쿼리 생성. - 반복 코드 감소 : 기본적인 CRUD 작업을 위한 코드를 직접 작성할 필요 없이, CrudRepository, JpaRepository 등의 인터페이스를 상속받아 사용하면 기본적인 데이터 접근 메소드들이 자동으로 제공된다.
- 표준화된 코드 : 개발자들이 동일한 패턴으로 Repository 인터페이스를 정의하고 사용하게 되므로, 코드의 일관성이 높아진다.
때문에 실제 개발에서는 Spring Data JPA를 사용하는 것이 일반적이다.
이제 명확히 답을 내릴 수 있을 것 같다.
Q : Spring data JPA에서는 EntityManager을 사용하나요? 안하나요?
사용합니다.
EntityManager은 JPA에서 entity 객체를 CRUD 기능을 제공하는 인터페이스 이다.
추가적으로 EntityManager은 영속성 컨텍스트(Persistence Context)를 관리하고 이로 인해 entity 생명주기를 제어한다.
EntityManager 또한 인터페이스 이므로 Hibernate와 같은 구현체를 통해 구현할 수 있다.
쓰다 보니 헷갈려서 추가 작성한다.
인터페이스 : 메서드의 시그니처(메서드 이름, 반환 타입, 매개 변수 등)만 정의하고, 실제 메서드의 동작 방식은 구현X
구현체 : 실제 동작방식을 구현
(추가) EntityManager 주요 기능
- 생성 및 삽입
- persist(Object entity) : entity를 영속성 컨텍스트에 추가하고, DB에 삽입
- 조회
- find(Class<T> entityClass, Object primaryKey) : entity 클래스와 기본 키를 사용하여 DB에서 entity 조회
- createQuery(String qlString) : JPQL 쿼리를 작성하여 entity를 조회
- createNamedQuery(String name) : 이름이 지정된 쿼리를 사용하여 entity를 조회
- 수정
- merge(Object entity) : 준영속 상태의 entity를 영속 상태로 병합하여 업데이트
- 삭제
- remove(Object entity) : entity를 영속성 컨텍스트에서 제거하고, DB에서 삭제
- 트랜잭션 관리
- getTransaction() : 현재 트랜잭션을 반환하고, 이를 통해 트랜잭션을 시작, 커밋, 롤백
- 플러시
- flush() : 영속성 컨텍스트의 변경 내용을 DB에 반영
- 기타
- clear() : 영속성 컨텍스트를 초기화
- detach(Object entity) : entity를 영속성 컨텍스트에서 분리 (준영속상태)
- close() : EntityManager를 종료하고, 리소스를 해제
글을 읽다보면 말이 이상할 것이다.
- EntityManager은 JPA에서 entity의 CRUD를 위한 인터페이스이다.
- Spring Data JPA의 개선점에서 JPA의 반복적인 CRUD를 줄이기 위해 repository를 사용해서 자동으로 CRUD를 한다.
- Spring data JPA에서는 EntityManager을 사용하나요? 안하나요? → 사용합니다. 네?
확실히 Spring data JPA에서는 사용자가 직접 EntityManager을 사용하는 경우는 줄어든다.
하지만, 이 말이 EntityManager 자체가 아예 사용되지 않는 것은 아니다.
Spring data JPA는 JPA를 쉽게 사용할 수 있도록 도와주는 모듈이다.
이 말을 기억하면서 왜 Spring data JPA에서도 EntityManager을 사용하는지 알아보자.
- 일단, Spring data JPA의 기반은 JPA에서 시작된다. 즉, JPA의 인터페이스 중 하나인 EntityManager은 Repository의 내부적으로 사용되어 DB의 상호작용에 필요하다.
이 뜻은, 사용자가 보기엔 repository가 자동으로 쿼리를 생성해주는 것처럼 보이지만, 내부적으로는 EntityManager을 사용한다가 된다. - 또한, 복잡한 쿼리나 독특한 동작이 필요한 경우, 사용자가 직접 EntityManager을 사용해서 쿼리를 작성할 수 있다. Spring data JPA또한 사용자 정의 repository를 만들 수 있는 기능을 제공한다.
2가지 이유때문에 Spring data JPA의 repository에서도 EntityManager을 사용한다.
+추가 자료
결론 : 튜닝의 끝은 순정이다.
'하고싶은거 > Springboot' 카테고리의 다른 글
API_정의, 명세 (0) | 2024.08.04 |
---|---|
SpringBoot 동작 원리 (0) | 2024.07.22 |
Entity 생명주기 (0) | 2024.06.28 |
JPA 상속 (0) | 2024.06.28 |
#개발 #게임 #일상
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!