Spring Data JPA - 스프링 데이터 JPA 구현체 분석

2022. 8. 1. 22:29·공부/JPA
반응형

출처 : 인프런 실전! 스프링 데이터 JPA

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다.

 

스프링 데이터 JPA 구현체 분석

스프링 데이터 JPA가 내부적으로 어떻게 동작하는지 알아보기 위해 구현체를 분석해보자.

구현체는 JpaRepository 인터페이스에 인터페이스 선언부 옆에 화살표 아래 버튼을 누르면 SimpleJpaRepository를 찾을 수 있다.

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {

   //...생략
    	@Override
	public Optional<T> findById(ID id) {

		Assert.notNull(id, ID_MUST_NOT_BE_NULL);

		Class<T> domainType = getDomainClass();

		if (metadata == null) {
			return Optional.ofNullable(em.find(domainType, id));
		}

		LockModeType type = metadata.getLockModeType();

		Map<String, Object> hints = new HashMap<>();
		getQueryHints().withFetchGraphs(em).forEach(hints::put);

		return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
	}
   // ...생략
}

구현체를 쭉쭉 보다보면 익숙하고, 반갑고, 고마운 메서드들이 보이면서 안의 코드도 볼 수 있다. 중요한 건 이게 아니라 맨 위에 있는 애노테이션이다.

@Repository

@Repository를 붙이면 얻을 수 있는 장점 두 가지가 있다.

첫 째로는 스프링 빈의 컴포넌트 스캔 대상이 된다. 그 말은 스프링이 읽어들여 스프링 컨테이너에 올릴 수 있게 된다.

두 번째로는 JPA, JDBC 등 예외가 터지면 영속성 계층에 있는 예외들을 스프링에서 한 번 감싸주어 서비스나 컨트롤러 계층에 예외를 던질 때 스프링에서 한 번 감싸준 예외로 던져진다. 이러면 하부 기술을 JDBC에서 JPA로 변경해도 스프링에서 한 번 감싸준 예외로 코드를 작성하니 기존 코드에 영향이 덜 간다는 장점이 있다.

@Transactional(readOnly=true)

  • JPA의 모든 변경은 트랜잭션 안에서 동작한다.
  • readOnly=true는 전반적인 설정이고, save와 같은 엔티티에 조회 외 다른 기능(등록, 수정, 삭제)을 지원하는 메서드에는 메서드 위에 @Transactional이라고 되어있어 이런 부분만 readOnly=false 처리가 된다.
@Transactional
@Override
public <S extends T> S save(S entity) {
  • 서비스 계층에서 트랜잭션을 시작하지 않으면 리파지토리에서 트랜잭션이 시작된다.
  • 서비스 계층에서 트랜잭션을 시작하면 리파지토리는 해당 트랜잭션을 전파 받아서 사용한다.
  • 그래서 스프링 데이터 JPA를 사용할 때는 트랜잭션을 따로 설정 안해도 데이터 등록, 변경이 가능하다.

 

 

save()

@Transactional
@Override
public <S extends T> S save(S entity) {

   Assert.notNull(entity, "Entity must not be null.");

   if (entityInformation.isNew(entity)) { // 만약 새로운 엔티티면
      em.persist(entity);
      return entity;
   } else { // 새로운 엔티티가 아니면
      return em.merge(entity);
   }
}
  • 새로운 엔티티면 저장(persist)
  • 새로운 엔티티가 아니면 병합(merge)
  • save()의 단점은 새로운 엔티티인지 아닌지를 알기 위해 DB에 select를 할 수 밖에 없다는 것이다.

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • Spring Data JPA - Specifications(명세)
  • Spring Data JPA - 새로운 엔티티를 구별하는 방법
  • Spring Data JPA - Web 확장-페이징과 정렬
  • Spring Data JPA - Web 확장-도메인 클래스 컨버터
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    oracle
    SQL
    react
    자바스크립트
    스프링부트
    IT
    프로그래머스
    개발자
    백준
    JPA
    RESTful
    프론트엔드
    egov
    MSA
    방통대
    QueryDSL
    springboot
    SpringBoot를 이용한 RESTful Web Service 개발
    알고리즘
    에러해결
    토비의스프링부트
    Java
    운영체제
    코딩테스트
    전자정부프레임워크
    인프런
    Spring
    기출문제
    넥사크로
    토이프로젝트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
Spring Data JPA - 스프링 데이터 JPA 구현체 분석
상단으로

티스토리툴바