Spring132 영속성 컨텍스트 - 변경 감지 영속성 컨텍스트에서의 변경감지에서 가장 핵심은 update 를 할 때, em.persist 로 다시 영속화 할 필요가 없다는 것이다. 변경감지란 무엇일까? 변경감지는 스냅샷 이라는 1차캐시에서 비롯된다. 1차 캐시에서는 그때그때마다 스냅샷을 찍어 캐시의 상태를 사진으로 찍어놓는다. 이 후, 데이터가 변경되면 스냅샷과 비교하여 변경된 것을 감지하고 update 쿼리를 DB에 날리게 된다. ( 틀린그림 찾기라고 생각하면 쉽다 ) 예제 ID 가 1(PK) 이고, NAME 이 memberA 인 데이터를 memberA에서변경으로 변경하려고 한다. tx.begin(); // 트랜잭션 시작 Member findMember = em.find(Member.class, 1L); findMember.setName("memb.. 2022. 9. 20. 영속성 컨텍스트 - 쓰기 지연 영속성 컨텍스트에서는 쓰기 지연 이라는 트랜잭션을 지원한다. em.persist 를 통해 영속성 컨텍스트로 들어가면 바로 DB 에 SQL 문을 날리는 것이 아닌, 쓰기 지연 SQL 저장소로 들어가게 된다. 이후, commit 을 하거나 flush 를 실행하면 DB 에 Insert 쿼리문이 넘어가게 되어 DB 에 저장되게 된다. tx.begin(); // 트랜잭션 시작 Member memberA = new Member(111L, "memberA"); Member memberB = new Member(112L, "memberB"); em.persist(memberA); em.persist(memberB); // 여기까지 DB 에 Insert SQL 을 보내지 않는다. tx.commit(); // 커밋해야 S.. 2022. 9. 20. 영속성 컨텍스트 - 동일성보장 같은 트랜잭션안에서의 엔티티는 조회 시 동일성을 보장한다. Member member1 = em.find(Member.class, 50L); Member member2 = em.find(Member.class, 50L); System.out.println(member1 == member2); // True + 동일성 보장으로 인해 발생하는 데이터 동기화 문제가 있으며, 어떻게 해결해야 하는지에 대해서는 추후 추가 https://devhyogeon.tistory.com/6 JPA의 동일성 보장으로 인해 발생하는 데이터 동기화 문제 이 글의 내용과 예제에는 Spring Data JPA에서 사용하는 벌크 연산과 @Modifying의 clearAutomatically attribute에 대한 이해가 필요하므로 아.. 2022. 9. 20. 영속성 컨텍스트 - 1차 캐시 영속성 컨텍스트의 이점 - 1차 캐시 영속성 컨텍스트 안에는 1차캐시가 들어있다. 1차 캐시는 EntityManager가 관리하는 영속성 컨텍스트 내부에 있는 첫번째 캐시이다. 1차 캐시의 동작과정 1. 조회 시 1차 캐시에 데이터가 있는지 확인 후 있으면 데이터를 가져온다. 2. 1차 캐시에 없다면 DB 에서 확인하기 위해 데이터를 요청한다. 3. DB 에 값이 있다면 1차 캐시에 저장 후, 이후 조회 시 1차 캐시에서 조회한다. 1차 캐시에 값이 저장 Member member = new Member(1L, "Jo"); em.persist(member); 조회 하는 방법 - em.find( 엔티티클래스, 찾는PK값 ) em.find(Member.class, 1L); 2022. 9. 20. 영속성 컨텍스트 - 엔티티 생명주기 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 의미를 가진다. 먼저, 엔티티의 생명주기에 대해 확인해야 한다. 비영속과 준영속의 차이점에 대해 잘 확인하자. 1. 비영속 : 영속성 컨텍스트와 관계가 없는 상태 // 비영속상태 -> 생성만 한 상태 Member member = new Member(); member.setId(100L); member.setName("HelloJPA"); 2. 영속 : 영속성 컨텍스트에 관리되는 상태 // 영속상태 -> em.persist를 사용한다 em.persist(member); 3. 준영속 : 영속성 컨텍스트에 관계되어 있다가 분리된 상태 // 준영속상태 em.detach(member); 4. 삭제 : 삭제된 상태 //삭제 em.remove(member); 2022. 9. 20. JPA 동작원리 JPA ( Java Persistence API ) - 자바 객체와 관계형 DB 사이를 매핑하는 ORM 기술 표준 - 스프링에서 제공하는 것이 아닌, JAVA 에서 제공하는 API - 라이브러리가 아닌, 인터페이스 구동방식 - 설정 정보를 조회 및 기준으로 하여 EntityManagerFactory를 생성한다. EntityManager는 하나만 생성하여 공유한다. - EntityManagerFactory 를 통해 EntityManager 가 생성된다 EntityManager는 쓰레드간 절대 공유하지 않는다. 사용하고 폐기한다. - JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다. 조회를 제외한 등록, 수정, 삭제 모두 META-INF/persistence.xml 예제 -persistence-unit.. 2022. 9. 20. 테스트 코드의 개념에 대해 알아보자 (JUnit, TDD) TDD(Test Driven Development) 에 대한 간단 정리 - 테스트 주도 개발이라는 의미 - 테스트를 먼저 설계 및 구축 후 테스트를 톤과할 수 있는 코드를 짜는 것 - 애자일 개발 방식 중 하나. ** 코드 설계시 원하는 단계적 목표에 대해 설정하여 진행하고자 하는 것에 대한 결정 방향의 갭을 줄이고자 함. ** 최초 목표에 맞춘 테스트를 구축하여 그에 맞게 코드를 설계 -> 적은 의견 충돌을 기대할 수 있다. 목적 - 코드의 안정성을 높일 수 있다 - 기능을 추가하거나 변경하는 과정에서 발생할 수 있는 사이드이펙트를 줄일 수 있다. - 해당 코드가 작성된 목적을 명확하게 표현할 수 있다 JUnit 이란? - 단위 테스트(Unit Test)를 위한 도구를 제공 단위테스트 : 코드의 특정 .. 2022. 9. 15. ORM 이란 무엇일까? ORM ( Object Relational Mapping ) - 어플리케이션의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 의미 ORM 의 장점 1. ORM을 사용하면서 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다. - 쿼리문을 작성하는 양이 줄어들어 개발 비용이 줄어든다 - 객체지향적으로 데이터베이스에 접근할 수 있어 코드의 가독성을 높인다. 2. 재사용 및 유지보수가 편리하다 - ORM 을 통해 매핑된 객체는 모두 독립적으로 작성되어 재사용이 용이하다 - 각 클래스로 나뉘어져 있어 유지보수에 편리하다. 3. 데이터베이스에 대한 종속성이 줄어든다 ORM 의 단점 1. ORM 만으로는 온전한 서비스를 구현하기에 한계가 있다. - 복잡한 서비스는 직접 쿼리를 구성해야 한다. - 설계.. 2022. 9. 15. Lombok 알고 사용하자! Lombok - 반복되는 메서드를 어노테이션을 사용하여 자동으로 작성해주는 라이브러리 - 일반적으로 VO, DTO, Model, Entity 등의 데이터 클래스에서 자주 사용한다 대표적으로 사용하는 어노테이션은 아래와 같다. 종류 의도 @Getter get 메서드를 자동으로 생성 @Setter set 메서드를 자동으로 생성 @NoArgConstructor 파라미터가 없는 생성자를 생성 @AllArgConstructor 모든 필드값을 파라미터로 갖는 생성자를 생성 @RequiredArgsConstructor 필드값 중 final 인 값을 갖는 생성자를 생성 @ToString toString 메서드를 자동으로 생성 @EqualsAndHashCode equals , hashCode 메서드를 자동으로 생성 - .. 2022. 9. 15. 이전 1 ··· 9 10 11 12 13 14 15 다음