Back-End/SpringBoot

스프링부트와 AWS로 혼자 구현하는 웹 서비스 (chap.3) - JPA

Young-Cow 2021. 1. 20. 00:19

*이해를 위해 메모장처럼 활용한 포스트로, 신뢰하지 말고 참고용으로 활용

 

관계형 데이터베이스는 SQL 을 통해야만 한다.

객체 지향과는 출발점부터 다르다.

그러나 JPA를 사용하면 SQL 에 종속적이지 않고 객체지향적으로 프로그래밍이 가능하다. ( 유지보수가 편하고, 생산성 향상)

 

Spring Data JPA

JPA 는 인터페이스이다. 라이브러리가 아니다. 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 명세한 것뿐이다.

그래서 JPA 를 사용하기 위해서는 Hibernate, Eclipse Link 등의 구현체가 필요하다.

그리고 Spring Data JPA 는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA 를 좀 더 쉽게 사용하도록 도와준다.

 

  • JPA
  • Hibernate
  • Spring Data JPA

전부 다르다. 세 가지를 잘 구분해야 이해하기 쉬울 것 같다.

 

참고 자료

suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

 

JPA, Hibernate, 그리고 Spring Data JPA의 차이점

개요 Spring 프레임워크는 어플리케이션을 개발할 때 필요한 수많은 강력하고 편리한 기능을 제공해준다. 하지만 많은 기술이 존재하는 만큼 Spring 프레임워크를 처음 사용하는 사람이 Spring 프레

suhwan.dev

 

 

 

1. Spring Data JPA 적용

- Spring Data JPA 의존성 추가

build.gradle

compile('org.springframework.boot:spring-boot-starter-data-jpa')

compile('org.springframework.boot:spring-boot-starter-data-jpa')

 

[참고]
Entity 클래스
DB 테이블 내 존재하는 컬럼만을 속성(필드)로 가지는 클래스
실제 DB 테이블과 1:1 매핑되는 클래스

 

- Entity 클래스 생성

Entity 클래스에는 Setter 를 만들면 안 된다.

[생성자를 통해 값을 채운 뒤 DB 에 Insert 후 이벤트에 맞는 public 메소드를 호출하여 변경]

@Builder 를 이용하면 생성자를 이용할 때보다 더 명확하게 사용할 수 있다.

참고 자료 : cheese10yun.github.io/spring-builder-pattern/

 

Builder 기반으로 객체를 안전하게 생성하는 방법 - Yun Blog | 기술 블로그

Builder 기반으로 객체를 안전하게 생성하는 방법 - Yun Blog | 기술 블로그

cheese10yun.github.io

 

 

- JpaRepository 생성

DB Layer 접근자 (Dao)

JPA 에선 Repository 라고 부르며 인터페이스로 생성하고

public interface PostsRepository extends JpaRepository<Posts, Long> {}

위처럼 상속만 해주면 기본적인 CRUD 메소드가 자동으로 생성된다.

Entity 클래스 - 기본 Entity Repository 는 밀접한 관계, 함께 위치해야 함

 

 

참고자료 (전체적으로 정리가 잘 되어있다)

jobc.tistory.com/120

 

JPA 사용법 (JpaRepository)

JPA에 대한 개념은 이해가 갔지만 처음 코드를 접했을 땐 이해 안가는 부분이 많았다. 그래서 잘 정리된 블로그를 참고해 다시 한번 사용법을 알기 쉽게 정리해보고자 한다. Entity 먼저 데이터베

jobc.tistory.com

 

 

 

스프링 웹 계층 구조

자세한 이해가 필요해 보인다. 차후 정리

참고자료 : kyu9341.github.io/java/2020/07/08/java_springBoot_Layer/

 

스프링 - 계층 구조 - kwon | kwon's Blog

스프링 계층 구조 진행중인 프로젝트에서 계층 구조를 고려하여 각 계층의 역할을 제대로 분담하도록 하기 위해 스프링의 계층 구조에 대해 조사해 정리한다. 스프링 부트와 AWS로 혼자 구현하

kyu9341.github.io

 

 

 

스프링에서 Bean을 주입받는 방식

  1. @Autowired
  2. setter
  3. 생성자

이 중에서 1번은 권장하지 않고, 3번을 가장 권장한다.

이를 위해서 롬복의 @requiredArgsConstructor 를 이용하면

final 이 선언된 모든 필드를 인자 값으로 하는 생성자를 생성해준다.

 

 

더티체킹(Dirty Checking)

상태 변경 검사 정도로 요약

JPA에서는 트랜잭션이 끝나는 시점에 해당 테이블에 변경분을 반영(Update 쿼리)

이를 위해선 영속성 컨텍스트가 유지된 상태여야 하는데

Spring Data Jpa 에선 JPA의 엔티티 매니저가 디폴트라서 영속성 컨텍스트가 유지됨 (영속성 컨텍스트의 정확한 의미를 생각해봐야 할 듯)

  • 트랜잭션 안에서 데이터베이스의 데이터를 가져오고 -> 영속성 컨텍스트 유지, 스냅샷을 만듦
  • 트랜잭션이 끝나는 시점에는 이전 스냅샷과 다른 점을 비교하여 Update 쿼리를 데이터 베이스로 전달

 

참고자료 : jojoldu.tistory.com/415

 

더티 체킹 (Dirty Checking)이란?

Spring Data Jpa와 같은 ORM 구현체를 사용하다보면 더티 체킹이란 단어를 종종 듣게 됩니다. 더티 체킹이란 단어를 처음 듣는분들을 몇번 만나게 되어 이번 시간엔 더티 체킹이 무엇인지 알아보겠습

jojoldu.tistory.com

 

 

 

JPA Entity Manager 및 영속성 컨텍스트에 대해서

참고자료 : gmlwjd9405.github.io/2019/08/06/persistence-context.html

 

[JPA] 영속성 컨텍스트(Persistence Context)란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

 

 

728x90
반응형