*이해를 위해 메모장처럼 활용한 포스트로, 신뢰하지 말고 참고용으로 활용
관계형 데이터베이스는 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/
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/
- JpaRepository 생성
DB Layer 접근자 (Dao)
JPA 에선 Repository 라고 부르며 인터페이스로 생성하고
public interface PostsRepository extends JpaRepository<Posts, Long> {}
위처럼 상속만 해주면 기본적인 CRUD 메소드가 자동으로 생성된다.
Entity 클래스 - 기본 Entity Repository 는 밀접한 관계, 함께 위치해야 함
참고자료 (전체적으로 정리가 잘 되어있다)
스프링 웹 계층 구조
자세한 이해가 필요해 보인다. 차후 정리
참고자료 : kyu9341.github.io/java/2020/07/08/java_springBoot_Layer/
스프링에서 Bean을 주입받는 방식
- @Autowired
- setter
- 생성자
이 중에서 1번은 권장하지 않고, 3번을 가장 권장한다.
이를 위해서 롬복의 @requiredArgsConstructor 를 이용하면
final 이 선언된 모든 필드를 인자 값으로 하는 생성자를 생성해준다.
더티체킹(Dirty Checking)
상태 변경 검사 정도로 요약
JPA에서는 트랜잭션이 끝나는 시점에 해당 테이블에 변경분을 반영(Update 쿼리)
이를 위해선 영속성 컨텍스트가 유지된 상태여야 하는데
Spring Data Jpa 에선 JPA의 엔티티 매니저가 디폴트라서 영속성 컨텍스트가 유지됨 (영속성 컨텍스트의 정확한 의미를 생각해봐야 할 듯)
- 트랜잭션 안에서 데이터베이스의 데이터를 가져오고 -> 영속성 컨텍스트 유지, 스냅샷을 만듦
- 트랜잭션이 끝나는 시점에는 이전 스냅샷과 다른 점을 비교하여 Update 쿼리를 데이터 베이스로 전달
참고자료 : jojoldu.tistory.com/415
JPA Entity Manager 및 영속성 컨텍스트에 대해서
참고자료 : gmlwjd9405.github.io/2019/08/06/persistence-context.html
'Back-End > SpringBoot' 카테고리의 다른 글
스프링부트와 AWS로 혼자 구현하는 웹 서비스 (chap.2) - 테스트코드, 롬복 (0) | 2021.01.18 |
---|---|
스프링부트와 AWS로 혼자 구현하는 웹 서비스 (chap.1) - 프로젝트 생성 (0) | 2021.01.12 |