Backend/JPA

·Backend/JPA
1. 스프링 컨테이너 기본전략스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트를 사용합니다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료하게 됩니다.=> 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 같다. 스프링을 사용하면 보통 @Transactional 어노테이션을 통해 트랜잭션을 사용하게 되는데 이 때 호출 메소드를 실행하기 직전에 스프링 트랜잭션 AOP가 먼저 발동하게 되고 이 후 메소드가 정상 종료되면 트랜잭션을 커밋하며 종료하는 흐름으로 진행됩니다.트랜잭션을 커밋하면 JPA는 영속성 컨텍스트를 플러시해 변경내용을 DB에 반영한 후 데이터베이스 트랜잭션을 커밋합니다.(예외가 발생하면 트랜잭션을 롤백하고 종료한다. 이 때는 플러시 호출 X) 2. 트랜..
·Backend/JPA
1. 개요객체는 객체 그래프로 연관된 객체를 탐색하게 됩니다. 하지만 객체가 데이터베이스에 저장되어 있으므로 연관된 자유롭게 객체를 탐색하기가 어렵습니다. 이를 해결하기 위해 JPA 구현체는 프록시 기술을 사용합니다. 이 기술을 통해 연관된 객체를 처음부터 데이터베이스에서 조회하는 대신 실제 사용 시점에 조회할 수 있습니다. 또한, 함께 사용하는 객체들은 조인을 통해 함께 조회하는 것이 효과적인데 JPA는 이를 위해 즉시로딩과 지연 로딩이라는 두 가지 로딩 전략을 지원합니다. 그렇다면 지금부터 프록시, 지연로딩, 즉시로딩이 무엇인지 알아보도록 하겠습니다. 2. 프록시란?프록시란 ' 대신하다' 라는 의미를 가지고 있습니다. 그렇다면 JPA의 프록시 기술은 무엇일까요?프록시는 지연 로딩의 경우 사용하게 됩니..
·Backend/JPA
1. 스프링 데이터 JPA란?스프링 데이터 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트로 JPA 기반 데이터 접근 계층을 쉽게 구현할 수 있도록 도와줍니다. CRUD를 처리하기 위한 공통 인터페이스를 제공하고 생산성을 높이기 위한 다양한 기능을 제공합니다.   2. 스프링 데이터 JPA 사용법gradle 의존성 추가implementation 'org.springframework.boot:spring-boot-starter-data-jpa'public interface ProductRepository extends JpaRepository {}스프링 데이터 JPA는 리포지토리를 개발할 때 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가구현체를 동적으로 생성해..
·Backend/JPA
영속성 컨텍스트란? 영속성 컨텍스트는 엔티티를 영구적으로 저장하는 환경으로 엔티티 매니저로 엔티티를 저장하거나 조회시 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리하게 됩니다. 엔티티매니저 팩토리 : 엔티티 매니저를 만드는 곳 생성비용이 커서 한 개만 만들어 애플리케이션 전체에서 공유합니다. 여러 스레드가 접근해도 안전합니다. 엔티티 매니저 : 엔티티를 저장하고, 수정하고, 삭제하고 조회하는 등 엔티티와 관련된 일을 처리합니다. 또한 영속성 컨텍스트를 통해 데이터의 상태 변화를 감지하고 필요한 쿼리를 자동으로 수행해줍니다. 엔티티의 생명주기 비영속 : 엔티티 객체를 생성한 상태 Member member = new Member(); // 아직 저장되지 않음, 영속성 컨텍스트나 데이터베이스와는 아..
·Backend/JPA
JPA(Java Persistence API) JPA는 자바 진영의 ORM 기술에 대한 API 표준 명세이다. ORM(Object- Relational Mapping)은 무엇이고 왜 사용하는가? 객체 모델과 관계형 데이터베이스 사이에는 지향하는 목적이 다르고 기능과 표현 방법도 다릅니다. 이것을 패러다임 불일치 문제라고 하는데 이 문제를 해결하기 위해서는 수많은 시간과 코드들이 소비되게 됩니다. 패러다임 불일치 예시 1. 객체에는 상속이라는 기능이 있지만 테이블은 상속이라는 개념이 없다. 2. 객체는 참조를 통해 다른 객체와 연관관계를 가지고 참조에 접근해 연관된 객체를 조회하지만 테이블은 외래키를 사용해 다른 테이블과 연관관계를 가지고 조인을 사용해 연관된 테이블을 조회한다.(이 때 객체를 테이블에 맞..
·Backend/JPA
1. 문제점 Repository 계층을 @DataJpaTest를 이용해 테스트하다 아래와 같은 에러가 발생했다. 메시지를 보면 db에 반영될 때 자동으로 값을 주입해주는 auditing기능이 제대로 작동하지 않는 것을 알 수 있습니다. 이전에는 아래와 같이 @SpringBootApplication 위에 어노테이션이 위치해 있었다가 @EnableJpaAuditing @SpringBootApplication public class PracticeApplication { public static void main(String[] args) { SpringApplication.run(DosTicketApplication.class, args); } } config를 따로 분리 시켜줬는데 config가 적용되지 ..
·Backend/JPA
1. JPA Auditing프로젝트를 진행하다보면  Entity에 데이터를 언제 생성하고 수정했는지 보여주는 필드를 사용하는 경우가 많습니다.사용자가 데이터를 업데이트 하거나 생성할 때 시간 값을 직접 넣어주고 변경하는 것은 귀찮고 실수로 인해 놓치는 경우가 발생할 수 있습니다.이럴 때 JPA의 Auditing 기능을 이용하면 쉽게 이런 문제점을 해결할 수 있습니다.JPA는 Entity를 지켜보다 이벤트에 반응해 생성, 수정일자 값을 자동으로 넣어준다 (Auditing : 감사) 2. Auditing 기능 활성화하기@EnableJpaAuditing@SpringBootApplicationpublic class JpaApplication { public static void main(String[] args..
여포개발자
'Backend/JPA' 카테고리의 글 목록