반응형 개발/JPA17 낙관적 락, 비관적 락, 네임드 락 JPA는 데이터베이스 트랜잭션 격리 수준을 READ COMMITTED 정도로 가정한다. 만약 일부 로직에 더 높은 격리 수준이 필요하면 낙관적 락과 비관적 락 중 하나를 사용하면 된다. 추가적으로 네임드 락에 대해서도 다시 정리해보겠다. 낙관적 락 (OptimisticLock) 낙관적 락은 이름 그대로 트랜잭션 대부분은 충돌이 발생하지 않는다고 낙관적으로 가정하는 말이다. DB가 제공하는 락 기능을 사용하는 것이 아니라 JPA가 제공하는 버전 관리 기능을 사용한다. 즉 애플리케이션이 제공하는 락이다. 낙관적 락은 트랜잭션을 커밋하기 전까지는 트랜잭션의 충돌을 알 수 없다는 특징이 있다. 충돌이 빈번하지 않을 때 사용하는 것이 좋다. 충돌이 빈번하다면 비관적 락을 사용하는 것이 성능상 이점이 있다. 실패했.. 개발/JPA 2023. 6. 16. Spring Bean으로 등록된 EntityManager 자바 동적 프록시 기술을 알고 읽으시는 게 좋습니다!!! JPA를 처음에 배우면 엔티티 매니저는 여러 스레드가 동시에 접근하므로 스레드 간 공유하면 절대 안된다고 학습한다. 그러나 스프링 부트 애플리케이션을 돌려보면 처음에 엔티티 매니저가 스프링 빈으로 등록되는 것을 확인할 수 있다. '스프링 부트 자동 구성을 통해 엔티티 매니저가 스프링 빈으로 등록, 즉 싱글톤으로 사용이 되는 거 같아' 위와 같은 의문점이 들었고, 이에 관련해서 구글에 찾아보기 시작했다. 결론을 말하면 스프링 빈으로 등록되는 것은 엔티티 매니저 가짜 객체고 실제 애플리케이션에서 로직이 수행될 때 진짜 엔티티 매니저가 사용된다는 것이다. 이러면 쓰레드 세이프하다고 말할 수 있다. 단순히 그렇구나 하고 넘어간 것을 오늘은 눈으로 확인해보.. 개발/JPA 2023. 5. 12. Spring Data JPA 정리 강의를 수강한지 1년이 되가는 Spring Data JPA에 대해 정리해보도록 하겠습니다. Spring Data JPA 스프링 데이터 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트다. CRUD 처리를 위한 공통 인터페이스를 제공하며, 리포지토리를 개발할 때 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가 인터페이스를 구현한 객체를 동적으로 생성해서 주입한다. 이 밖에도 많은 JPA의 기능을 편리하게 사용할 수 있도록 지원한다. 본격적으로 살펴보자. 공통 인터페이스 스프링 데이터 JPA에서 제공하는 공통 인터페이스 JpaRepository에 대해 살펴보자. //JpaRepository 공통 기능 인터페이스 public interface JpaRepository.. 개발/JPA 2023. 2. 8. 스프링 부트와 JPA 활용 정리 스프링 부트와 JPA 강의 1편, 2편을 본지 거의 1년이 되어가는 상황이다. 남은 방학을 불태우자는 생각으로 복습을 진행했는데, 이번 기회에 한 번 글로 잘 정리해두려고 한다. 스프링 부트와 JPA 1편과 2편에서 느낀점과 중요한 부분을 남겨보겠다. 스프링 부트와 JPA 활용1 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의 실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게.. 개발/JPA 2023. 2. 7. JPQL 중급 문법 2023. 02.07 18:20 복습 시작 이제 상대적으로(?) 저번 시간보다 좀 더 난이도 있는 JPQL 문법에 대해 알아보겠다. JPQL 경로 표현식 JPQL에서 사용하는 경로 표현식을 알아보고 경로 표현식을 통한 묵시적 조인도 알아보자. 경로 표현식이라는 것은 쉽게 이야기해서 .(점)을 찍어 객체 그래프를 탐색하는 것이다. select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 피드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' 경로 표현식 용어를 정리해보자. 상태 필드(state field) : 단순히 값을 저장하기 위한 필드 (ex: m.username) 연관 필드(association f.. 개발/JPA 2022. 3. 10. JPQL 기본 문법 2023. 02.07 17:40 복습 및 정리 시작 JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. 우리는 이제 그중에서도 제일 중요하고 기본이 되는 JPQL에 대해서 알아보겠다. JPQL JPQL은 객체지향 쿼리 언어다. JPA를 사용하는 사람들은 필수로 JPQL을 학습해야 한다. 우리가 JPA를 개발하다 보면 em.find()메소드로는 복잡한 검색 쿼리를 데이터베이스에 보낼 수 없다. 따라서 애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. 또한 우리는 ORM을 사용해 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 개발하므로 검색도 테이블이 아닌 엔티티 객체를 대상으로 하는 방법이 필요하다. 즉 .. 개발/JPA 2022. 3. 7. 값 타임 2023. 02.07 17:00 복습 및 정리 시작 JPA는 데이터 타입을 크게 두 분류로 나눌 수 있다. 엔티티 타입 @Entity로 정의하는 객체다. 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능하다. 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체다. 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체된다. 값 타입은 또 크게 3가지로 나눌 수 있다. 기본 값 타입 : 자바 기본 타입, 래퍼 클래스, String 임베디드 타입 : 복합 값 타입 컬렉션 값 타입 이제 차근 차근 알아보겠다. 우선 아래 예제 코드를 살펴보자. @Entity public class Member{ @Id.. 개발/JPA 2022. 3. 3. 영속성 전이, 고아 객체 2023. 02.07 16:30 복습 시작 이번 시간에는 영속성 전이와 고아 객체에 대해 학습해보겠다. 영속성 전이 : CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용해야 한다. JPA는 CASCADE 옵션으로 영속성 전이를 제공한다. 쉽게 말해서 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. 예를 들어 일대다 단방향 부모와 자식 연관 관계가 있다고 생각해보자. 코드는 아래와 같다. (부모 : 자식, 1 : N) @Entity public class Parent{ @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "parent") pri.. 개발/JPA 2022. 3. 2. 프록시, 즉시 로딩과 지연 로딩 2023. 02.07 15:40 복습 시작 이번에는 프록시와 즉시 로딩, 지연 로딩에 대해 알아보겠다. 객체는 객체 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 DB에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다. JPA 구현체들은 이 문제를 해결하려고 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 하지만 자주 함께 사용하는 객체들은 조인을 사용해서 함께 조회하는 것이 효과적이다. JPA는 즉시 로딩과 지연 로딩이라는 방법으로 둘을 모두 지원한다. 한 가지 예시를 들어보자. 다대일 단방향 관계인 멤버와 팀이 있다. 즉 멤버는 팀을 참조하는 참조 변수가 있고, 팀은 멤버를.. 개발/JPA 2022. 3. 2. 고급 매핑 2023. 02.07 15:00 복습 시작 고급 매핑 이번에는 상속 관계 매핑과 @MappedSuperclass에 대해 알아보겠다. 상속 관계 매핑 관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다. 대신 슈퍼 타입 서브타입 관계라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. ORM에서 이야기하는 상속 관계 매핑은, 객체의 상속 구조와 데이터베이스의 슈퍼 타입 서브타입 관계를 매핑하는 것이다. 슈퍼 타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 있다. 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단인 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 이제 주요 어노테이션들을 살펴보고 각 전략들을 .. 개발/JPA 2022. 3. 1. 다양한 연관관계 매핑 (일대일, 다대다) 2023. 02.07 14:30 복습 시작 일대일 [ 1: 1 ] 일대일 관계는 아래와 같은 특징이 있다. 일대일 관계는 그 반대도 일대일 관계다. 테이블 관계에서 일대다, 다대일은 항상 다쪽이 외래 키를 가진다. 반면에 일대일 관계는 주 테이블이나 대상 테이블 둘 중 어느 곳이나 외래 키를 가질 수 있다. 주 테이블에 외래 키 주 객체가 대상 객체를 참조하는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 참조한다. 외래 키를 객체 참조와 비슷하게 사용할 수 있어서 객체지향 개발자들이 선호한다. 이 방법의 장점은 주 테이블이 외래 키를 가지고 있으므로 주 테이블만 확인해도 대상 테이블과 연관관계가 있는지 알 수 있다. 대상 테이블에 외래 키 전통적인 데이터베이스 개발자들은 보통 대상 테이블에 외래 키.. 개발/JPA 2022. 2. 28. 다양한 연관관계 매핑 (다대일, 일대다) 2023. 02.07 14:00 복습 시작 다양한 연관관계 매핑 연관 관계 매핑 시에 고려해야 할 3가지가 있다. 다중성 단방향, 양방향 연관 관계의 주인 이 점을 유의하면서 다양한 연관관계들을 살펴보겠다. 다대일 단방향 먼저 다대일 [ N : 1 ]이다. 예시 코드는 아래와 같다. @Entity public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; //getter, setter } @Entity public class Team{ @Id @Generated.. 개발/JPA 2022. 2. 28. 이전 1 2 다음 반응형