JPA [Spring] JPA, 영속성 컨텍스트, 1차 캐시, 쓰기 지연 📙 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 논리적 개념 EntityManager를 통해서 영속성 컨텍스트에 접근 EntityManager가 생성되면 논리적 개념인 영속성 컨텍스트(PersistenceContext)가 1:1 생성 1. 1차 캐시 / 엔티티 동일성 보장 영속성 컨텍스트는 내부에 캐시를 갖고 있고, (id, instance)의 맵 형태로 엔티티들이 저장된다. 트랜잭션 단... SpirngJPAJPA PostgreSQL을 Spring Data JPA 로 다루기 일반적으로 많이 사용하는 Mysql과 다르게 PostgreSQL은 다양한 데이터 타입을 지원한다. 예를들면 배열 타입, JSON 타입, JSON Binary 타입 등을 지원한다. 하지만 JPA의 구현체인 Hibernate에서 해당 데이터 타입에 대한 컬럼 타입을 기본으로 지원하지 않기 때문에 사용하기 위해서는 컬럼 타입을 정의하여 사용할 컬럼 타입과 매핑해주어야 한다. 컬럼 타입을 정의하려면... DatabaseJPADatabase JPA와 영속성 컨텍스트 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 애플리케이션이 DB에서 꺼내온 객체를 보관하는 역할을 함. 영속성 컨텍스트는 EntityManager를 통해 엔티티를 조회하거나 저장할 때 엔티티를 보관하고 관리한다. 엔티티 생명주기 비영속 : 영속성 컨텍스트와 관계가 없는 새로운 상태 영속 : 엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태 -> pe... SpringJPAJPA JPA를 이용한 회원 주문서비스 설계2 JPQL 참고 : @NoArgsConstructor(access = AccessLevel.PROTECTED) : 매개변수가 없는 기본 생성자를 보호하여 비즈니스 로직에서 생성자를 생성한 뒤 Setter를 사용해 데이터를 입력하는 것을 막음 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) :... SpringJPAJPA JPA에서 Views테이블 Mapping 하기 viewssqlJPAJPA JPA중복컬럼 에러 해당 entity의 ID로 참조한 컬럼으로 또 다른 entity를 조인해야 하는 상황이 발생했다. 에러는 @JoinColumn Annotation에 insertable=false, updatable=false값을 추가해 주는것으로 마무리 되었다. 밑의 코드를 참고해 보자... SpringJPAJPA [Spring] JPA, 연관관계 편의 메서드 🤔 연관관계 편의 메서드: 양방향 연관관계를 한 번에 설정하는 편리한 메서드 엔티티 A와 B가 서로 양방향 연관관계인데, 어디에 연관관계 편의 메서드를 두는 게 좋은가? 3가지 선택지가 있습니다. 엔티티 A에 둔다. 엔티티 B에 둔다. 엔티티 A,B에 둘 다 둔다. 둘 다 두는 것은 혼란을 가중하기 때문에 제외하고, A, B 중 하나를 선택해서 사용하는 것이 좋다. 그러면 여기서 A, B 중에 ... SpringJPAJPA API Basics(Part 1: Request Response를 엔티티로 직접 사용) Postman을 이용해서 API를 테스트해볼 예정입니다. 앞서 Controller에서 request를 받아서 처리하는 작업을 했는데, API로 한번 더 하는 이유는? Controller에서는 HTML으로 Form 데이터를 받아서 회원가입 등을 하고 랜더링 할 페이지의 경로를 반환 했지만, API에서는 iOS, 안드로이드, Vue, React 등 별도의 프론트 클라이언트가 있으며, 클라이언트와... SpringbootJPAJPA API Basics(Part 2: Request Response를 DTO로 받음) V2: Request & Response로 DTO를 사용: Member 엔티티 대신에 CreateMemberRequest 등 DTO를 RequestBody, ResponseBody와 매핑한다. 장점: 1. 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다. 2. 엔티티와 API 스펙을 명확하게 분리할 수 있다. 3. 엔티티가 변해도 API 스펙이 변하지 않는다. 4. 파라미터로 받는 ... SpringbootJPAJPA JPA의 연관관계 맵핑 (feat. Repeated column in mapping for entity 에러) 우리가 보통 JPA를 이용해 연관관계를 맵핑할 때는 @ManyToOne(다대일 관계인 경우)과 @JoinColumn 어노테이션을 사용한다. 예를 들어, User 테이블과 Product 테이블이 있다고 가정하자. 그리고 다른 테이블에서 두 테이블을 모두와 다대일 관계를 맺는 경우 다음과 같이 작성할 수 있다. @ManyToOne을 통해 해당 테이블과 다대일 관계임을, @JoinColumn을 통... JPA스프링부트JPA 양방향 연관관계와 연관관계의 주인 member entity는 단방향과 동일, team entity는 컬렉션 추가 사실 객체에서 양방향 연관관계는 없다. 그 이유는 member는 FK로 PK를 조인하면 되고 객체 연관관계 = 2개 회원 -> 팀 연관관계 1개(단방향) 팀 -> 회원 연관관계 1개(단방향) 테이블 연관관계 = 1개 회원 <-> 팀의 연관관계 1개(양방향) 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른... JPAJPA [JPA] soft delete 자동으로 처리하기 데이터를 삭제하는 방법에는 hard delete, soft delete 2가지 종류가 있습니다. soft delete는 실제로 데이터베이스에서 데이터를 삭제하는 것이 아니라, 테이블에 deleted와 같은 필드를 추가해주고, update 쿼리를 날려서 deleted 값을 변경해주는 방법입니다. soft delete를 한 경우 조회 쿼리 결과로 삭제 처리된 값이 반환되면 안되기 때문에 wher... HibernateJPAHibernate 필드와 컬럼 매핑 컬럼 매핑 날짜 타입 매핑 (DATE, TIME, TIMESTAMP 이 중에 1개를 value값으로 지정해야한다.) enum 타입 매핑 문자 타입형으로 선언한 경우 DB에 CLOB, 그 외엔 BLOB 특정 필드를 컬럼에 매핑하지 않음(매핑 무시) 속성 필드와 매핑할 테이블의 컬럼 이름 객체의 필드 이름 nullable(DDL) false로 설정하면 DDL 생성 시에 not null 제약조건이... JPAJPA 2022/03/21 영속성 컨텍스트 알아보기 Persistence(영속화) 사라지지 않고 지속적으로 접근할 수 있다는 의미이다 보통 메모리에 존재하는 데이터는 서비스가 종료되면 사라진다. -> 이를 해결하기 위해서는 파일로저장 OR DB에 저장하는 것이다. 실제로 영속성 컨텍스트의 가장 주체적인 클래스는 EntityManager라는 빈이다. 현재 프로젝트에 H2 DB-> MySQL연동하기 이렇게 나는 MySQLWorkbench를 이용해... JavaJPASpringJPA [ElectionPJT/JPA] JPA의 외래 키 무결성 / Candidate Entity에서 양방향 매핑을 포기한 이유 Candidate를 삭제할 경우, Cascade(영속성 전이)를 통해 쉽게 관련 sns, youtube까지 삭제하고 싶었습니다. 처음 생각: 삭제하기 위한 Candidate를 id로 조회할 때, 관련 엔티티(sns, youtube)들을 함께 fetch 조인해야 cascade가 잘 적용되겠지? 둘 이상의 컬렉션은 페치 조인하면 안된다 @ToMany 페치 조인에서는 페이징을 사용할 수 없다 둘 ... ElectionPJTJPAElectionPJT [자바 ORM 표준 JPA 프로그래밍] JPA 소개 JPA를 사용하지 않고,SQL과 JDBC를 사용해서 회원 객체를 생성하고, 회원을 찾는 코드는 다음과 같다. JDBC API를 사용해서 SQL을 실행한다. 데이터베이스는 객체 구조와는 다른 데이터 중심의 구조를 가지므로 객체를 데이터베이스에 직접 저장하거나 조회할 수 없다. MemberDAO 클래스를 열어서 Member를 조회하는 find() 메소드를 보니 위에 작성한 회원만 조회하는 "SE... JPAJPA [JPA] 영속성 관리 - 영속성 컨텍스트 영속성 컨텍스트는 엔티티를 테이블의 식별자 값으로 구분한다. Entity Manager는 트랜잭션을 commit하기 전까지는 영속성 컨텍스트에 SQL을 저장하고, 트랜잭션을 commit하는 순간 데이터베이스에 저장한다. 영속성 컨텍스트가 엔티티를 관리하면 다음과 같은 장점을 갖는다. 트랜잭션을 지원하는 쓰기 지연 가능 jpa.persist(member) 를 할 때, 1차 캐시에 식별자와 엔티... JPAJPA [JPA] 9장 값 타입 임베디드 타입 값 타입과 불변 객체 값 타입 컬렉션 JPA의 데이터 타입을 크게 분류하면 엔티티 타입과 값 타입으로 나눌 수 있다. 값 타입 임베디드 타입 컬렉션 값 타입 새로운 값 타입을 직접 정의해서 사용한다. 임베디드 타입 어노테이션 임베디드 타입은 값 타입을 포함하거나 엔티티를 참조할 수 있다. 임베디드 타입과 같은 값 타입을 여러 엔티티에서 공유하면 안 된다. 기본 타입 - 값을 복... JPAJPA [JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1) Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자. 눈 여겨 볼 곳은 'fetch = FetchType.EAGER' 부분이다. Team 객체와 Member 객체를 각각 만들고 Member 객체의 Setter 메소드를 통해 Team 객체를 셋팅해준 뒤 em.find() 메소드를 통해 Membe... EagerJPAHibernateFetch Typelazy지연로딩즉시로딩Eager SpringBoot with JPA 프로젝트(M:N) 5.영화등록,등록된글 리스트처리 영화(Movie)의 등록과 수정에는 파일 업로드 기능을 활용해 영화 포스터 등을 등록할 수 있도록 구성 회원(Member)은 특정한 영화 조회 페이지에서 평점과 자신의 감상을 리뷰(Review)로 기록할 수 있다 조회 화면에서 회원(Member)은 자신이 기록한 리뷰(Review)의 내용을 수정/삭제할 수 있다 MovieDTO 는 Movie 클래스를 기준으로작성한다, MovieDTO는 화면에... JavaSpringbootJPAmysqlJPA 영속성 전이(cascade)를 사용할 때 주의해야 할 점 영속성 전이를 프로젝트에 적용하면서 꽤나 많은 우여곡절을 겪었는데, 여기에서 다시 한 번 배운 내용을 정리해보려 합니다. 본 게시글에 사용될 엔티티들의 코드는 다음과 같습니다. Candidate Entity Sns Entity Facebook Entity EntityManager = em 입니다. candidate 엔티티의 @OneToMany(mappedBy = "candidate", cas... JPASpringJPA [JPA] JPA 프로젝트 설정 프로젝트에서 JPA를 사용하기 위해 추가해야할 설정을 간단히 알아보자. pom.xml 파일에 아래 dependency를 추가. /META_INF 디렉토리 아래에 생성. hibernate.dialect 설정은 매우 유용한 JPA 기능이다. 세상의 거의 모든 데이터베이스 SQL문을 JPA 표준으로 매핑해놓아서, 사용할 데이터베이스의 방언을 설정해주면 쿼리문이 해당 SQL의 문법으로 마법처럼 작성... JPAJPA [JPA] 영속성 관리 - Entity 생명주기 JPA에서 가장 중요한 두가지 ✌🏻 객체와 관계형 데이터베이스 매핑하기 영속성 컨텍스트 (Persistence Context) 영속성 컨텍스트에 대해 알아보기 전, 영속성 컨텍스트 내부에서 어떤 일이 일어나는지 알아보기 위해 JPA에서의 Entity 생명주기에 대해 먼저 알아보자. - 비영속 (new/transient) : 영속성 컨텍스트와 전혀 상관없는 새로운 상태 - 영속 managed ... JPAJPA 스프링 JPA 양방향 연관관계의 이해 - 영속성 전이 cascade commentList, postImageList, postLikeList 와 같은 일대다 리스트를 보면 cascade 옵션이 달려있는 것을 확인할 수 있다. comment(댓글) 의 경우 post(게시글) 가 삭제될 경우 post와 연관된 comment 가 연쇄적으로 삭제하기 위해 cascade = CascadeType.REMOVE 을 설정하였다. postImage(게시글 이미지)의 경우 생... JPASpring기록기억하고싶은Spring bootdata jpaJPA SpringBoot Paging 처리 방법 SpringBoot에서는 JPA를 통해 페이징 처리를 쉽게 활용할 수 있습니다. 예제 소스는 TodoList-backend 소스를 사용하였습니다. Page 정보를 가지고 있는 Pageable 객체 controller단에서 파라미터로 받는 정보들 : @RequestParam : pageNo(0부터 시작), pageSize, sortBy 처리 로직 정리(entity -> Dto) ✅ Respon... 페이징SpringbootPagingJPAJPA 컬렉션 조회 최적화 하지만, 역시나 이전과 같이 쿼리가 엄청 많이 출력되는 것을 확인할 수 있다. 이 방법은 문제점이 있다. 그렇기 때문에 쿼리에서 모든 Orders 쿼리가 2개씩 생성된다. 그래서 결과가 위처럼 2개씩 생성되는 것을 확인할 수 있다. 그런데 이건 단점이 있다. 그런데, 페치 조인을 하고난 뒤에 페이징을 하게 되면, 모든 데이터를 전부 가져온 뒤에 100개만 가져오는 방식으로 처리된다. 하이버네... JPASpringJPA SpringBoot with JPA 프로젝트(M:N) 6.영화조회,리뷰등록,삭제 1-1.Service 수정 1-2.ServiceImpl 수정 MovieDTO 를 만들어 내기 위해 MovieRepository에서 가져오는 Movie, MovieImage 리스트, 평점 평균, 리뷰 개수의 리스트를 가공한다 1-3.Controller 수정 GET 방식으로 '/movie/read?mno=xxx'와 같은 URL을 처리한다(수정 작업에도 동일한 코드가 사용된다) 2-1.Review... JavaSpringbootJPAmysqlJPA [JPA] @OneToMany 연관관계 매핑 시작 @OneToMany 매핑, 즉 일대다 관계를 스프링 부트에서 어떤 식으로 적용시키면 좋을지에 대해 알아본다. 일대다(1:N) 관계 일대다 관계란, 한 쪽의 엔티티가 다른 쪽의 엔티티의 객체 여러개를 가질 수 있을 때를 의미하는 관계이다. 예를 들어, 하나의 팀은 여러명의 선수를 가질 수 있다. 이런 경우를 팀이 선수와 일대다 관계를 맺고 있다고 말할 수 있다. 이를 그림으로 나타내면 다... JPA스프링부트JPA [JPA] 영속성 전이 (CASCADE)와 고아 객체 특정 Entity를 영속 상태로 만들 때, 연관된 Entity들에 대해 영속성을 전파 시키는 옵션. 연관된 객체만큼 persist를 호출하므로 보기에도 비효율적인 코드다. persist 메서드로 person을 저장하면 그와 연관된 엔티티 객체들도 같이 영속성 저장이 된다. PERSIST: persist 메서드 호출 시 연관된 엔티티 저장 REMOVE: remove 메서드 호출 시 연관된 엔티... JPAJPA 이전 기사 보기
[Spring] JPA, 영속성 컨텍스트, 1차 캐시, 쓰기 지연 📙 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 논리적 개념 EntityManager를 통해서 영속성 컨텍스트에 접근 EntityManager가 생성되면 논리적 개념인 영속성 컨텍스트(PersistenceContext)가 1:1 생성 1. 1차 캐시 / 엔티티 동일성 보장 영속성 컨텍스트는 내부에 캐시를 갖고 있고, (id, instance)의 맵 형태로 엔티티들이 저장된다. 트랜잭션 단... SpirngJPAJPA PostgreSQL을 Spring Data JPA 로 다루기 일반적으로 많이 사용하는 Mysql과 다르게 PostgreSQL은 다양한 데이터 타입을 지원한다. 예를들면 배열 타입, JSON 타입, JSON Binary 타입 등을 지원한다. 하지만 JPA의 구현체인 Hibernate에서 해당 데이터 타입에 대한 컬럼 타입을 기본으로 지원하지 않기 때문에 사용하기 위해서는 컬럼 타입을 정의하여 사용할 컬럼 타입과 매핑해주어야 한다. 컬럼 타입을 정의하려면... DatabaseJPADatabase JPA와 영속성 컨텍스트 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 애플리케이션이 DB에서 꺼내온 객체를 보관하는 역할을 함. 영속성 컨텍스트는 EntityManager를 통해 엔티티를 조회하거나 저장할 때 엔티티를 보관하고 관리한다. 엔티티 생명주기 비영속 : 영속성 컨텍스트와 관계가 없는 새로운 상태 영속 : 엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태 -> pe... SpringJPAJPA JPA를 이용한 회원 주문서비스 설계2 JPQL 참고 : @NoArgsConstructor(access = AccessLevel.PROTECTED) : 매개변수가 없는 기본 생성자를 보호하여 비즈니스 로직에서 생성자를 생성한 뒤 Setter를 사용해 데이터를 입력하는 것을 막음 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) :... SpringJPAJPA JPA에서 Views테이블 Mapping 하기 viewssqlJPAJPA JPA중복컬럼 에러 해당 entity의 ID로 참조한 컬럼으로 또 다른 entity를 조인해야 하는 상황이 발생했다. 에러는 @JoinColumn Annotation에 insertable=false, updatable=false값을 추가해 주는것으로 마무리 되었다. 밑의 코드를 참고해 보자... SpringJPAJPA [Spring] JPA, 연관관계 편의 메서드 🤔 연관관계 편의 메서드: 양방향 연관관계를 한 번에 설정하는 편리한 메서드 엔티티 A와 B가 서로 양방향 연관관계인데, 어디에 연관관계 편의 메서드를 두는 게 좋은가? 3가지 선택지가 있습니다. 엔티티 A에 둔다. 엔티티 B에 둔다. 엔티티 A,B에 둘 다 둔다. 둘 다 두는 것은 혼란을 가중하기 때문에 제외하고, A, B 중 하나를 선택해서 사용하는 것이 좋다. 그러면 여기서 A, B 중에 ... SpringJPAJPA API Basics(Part 1: Request Response를 엔티티로 직접 사용) Postman을 이용해서 API를 테스트해볼 예정입니다. 앞서 Controller에서 request를 받아서 처리하는 작업을 했는데, API로 한번 더 하는 이유는? Controller에서는 HTML으로 Form 데이터를 받아서 회원가입 등을 하고 랜더링 할 페이지의 경로를 반환 했지만, API에서는 iOS, 안드로이드, Vue, React 등 별도의 프론트 클라이언트가 있으며, 클라이언트와... SpringbootJPAJPA API Basics(Part 2: Request Response를 DTO로 받음) V2: Request & Response로 DTO를 사용: Member 엔티티 대신에 CreateMemberRequest 등 DTO를 RequestBody, ResponseBody와 매핑한다. 장점: 1. 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다. 2. 엔티티와 API 스펙을 명확하게 분리할 수 있다. 3. 엔티티가 변해도 API 스펙이 변하지 않는다. 4. 파라미터로 받는 ... SpringbootJPAJPA JPA의 연관관계 맵핑 (feat. Repeated column in mapping for entity 에러) 우리가 보통 JPA를 이용해 연관관계를 맵핑할 때는 @ManyToOne(다대일 관계인 경우)과 @JoinColumn 어노테이션을 사용한다. 예를 들어, User 테이블과 Product 테이블이 있다고 가정하자. 그리고 다른 테이블에서 두 테이블을 모두와 다대일 관계를 맺는 경우 다음과 같이 작성할 수 있다. @ManyToOne을 통해 해당 테이블과 다대일 관계임을, @JoinColumn을 통... JPA스프링부트JPA 양방향 연관관계와 연관관계의 주인 member entity는 단방향과 동일, team entity는 컬렉션 추가 사실 객체에서 양방향 연관관계는 없다. 그 이유는 member는 FK로 PK를 조인하면 되고 객체 연관관계 = 2개 회원 -> 팀 연관관계 1개(단방향) 팀 -> 회원 연관관계 1개(단방향) 테이블 연관관계 = 1개 회원 <-> 팀의 연관관계 1개(양방향) 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른... JPAJPA [JPA] soft delete 자동으로 처리하기 데이터를 삭제하는 방법에는 hard delete, soft delete 2가지 종류가 있습니다. soft delete는 실제로 데이터베이스에서 데이터를 삭제하는 것이 아니라, 테이블에 deleted와 같은 필드를 추가해주고, update 쿼리를 날려서 deleted 값을 변경해주는 방법입니다. soft delete를 한 경우 조회 쿼리 결과로 삭제 처리된 값이 반환되면 안되기 때문에 wher... HibernateJPAHibernate 필드와 컬럼 매핑 컬럼 매핑 날짜 타입 매핑 (DATE, TIME, TIMESTAMP 이 중에 1개를 value값으로 지정해야한다.) enum 타입 매핑 문자 타입형으로 선언한 경우 DB에 CLOB, 그 외엔 BLOB 특정 필드를 컬럼에 매핑하지 않음(매핑 무시) 속성 필드와 매핑할 테이블의 컬럼 이름 객체의 필드 이름 nullable(DDL) false로 설정하면 DDL 생성 시에 not null 제약조건이... JPAJPA 2022/03/21 영속성 컨텍스트 알아보기 Persistence(영속화) 사라지지 않고 지속적으로 접근할 수 있다는 의미이다 보통 메모리에 존재하는 데이터는 서비스가 종료되면 사라진다. -> 이를 해결하기 위해서는 파일로저장 OR DB에 저장하는 것이다. 실제로 영속성 컨텍스트의 가장 주체적인 클래스는 EntityManager라는 빈이다. 현재 프로젝트에 H2 DB-> MySQL연동하기 이렇게 나는 MySQLWorkbench를 이용해... JavaJPASpringJPA [ElectionPJT/JPA] JPA의 외래 키 무결성 / Candidate Entity에서 양방향 매핑을 포기한 이유 Candidate를 삭제할 경우, Cascade(영속성 전이)를 통해 쉽게 관련 sns, youtube까지 삭제하고 싶었습니다. 처음 생각: 삭제하기 위한 Candidate를 id로 조회할 때, 관련 엔티티(sns, youtube)들을 함께 fetch 조인해야 cascade가 잘 적용되겠지? 둘 이상의 컬렉션은 페치 조인하면 안된다 @ToMany 페치 조인에서는 페이징을 사용할 수 없다 둘 ... ElectionPJTJPAElectionPJT [자바 ORM 표준 JPA 프로그래밍] JPA 소개 JPA를 사용하지 않고,SQL과 JDBC를 사용해서 회원 객체를 생성하고, 회원을 찾는 코드는 다음과 같다. JDBC API를 사용해서 SQL을 실행한다. 데이터베이스는 객체 구조와는 다른 데이터 중심의 구조를 가지므로 객체를 데이터베이스에 직접 저장하거나 조회할 수 없다. MemberDAO 클래스를 열어서 Member를 조회하는 find() 메소드를 보니 위에 작성한 회원만 조회하는 "SE... JPAJPA [JPA] 영속성 관리 - 영속성 컨텍스트 영속성 컨텍스트는 엔티티를 테이블의 식별자 값으로 구분한다. Entity Manager는 트랜잭션을 commit하기 전까지는 영속성 컨텍스트에 SQL을 저장하고, 트랜잭션을 commit하는 순간 데이터베이스에 저장한다. 영속성 컨텍스트가 엔티티를 관리하면 다음과 같은 장점을 갖는다. 트랜잭션을 지원하는 쓰기 지연 가능 jpa.persist(member) 를 할 때, 1차 캐시에 식별자와 엔티... JPAJPA [JPA] 9장 값 타입 임베디드 타입 값 타입과 불변 객체 값 타입 컬렉션 JPA의 데이터 타입을 크게 분류하면 엔티티 타입과 값 타입으로 나눌 수 있다. 값 타입 임베디드 타입 컬렉션 값 타입 새로운 값 타입을 직접 정의해서 사용한다. 임베디드 타입 어노테이션 임베디드 타입은 값 타입을 포함하거나 엔티티를 참조할 수 있다. 임베디드 타입과 같은 값 타입을 여러 엔티티에서 공유하면 안 된다. 기본 타입 - 값을 복... JPAJPA [JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1) Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자. 눈 여겨 볼 곳은 'fetch = FetchType.EAGER' 부분이다. Team 객체와 Member 객체를 각각 만들고 Member 객체의 Setter 메소드를 통해 Team 객체를 셋팅해준 뒤 em.find() 메소드를 통해 Membe... EagerJPAHibernateFetch Typelazy지연로딩즉시로딩Eager SpringBoot with JPA 프로젝트(M:N) 5.영화등록,등록된글 리스트처리 영화(Movie)의 등록과 수정에는 파일 업로드 기능을 활용해 영화 포스터 등을 등록할 수 있도록 구성 회원(Member)은 특정한 영화 조회 페이지에서 평점과 자신의 감상을 리뷰(Review)로 기록할 수 있다 조회 화면에서 회원(Member)은 자신이 기록한 리뷰(Review)의 내용을 수정/삭제할 수 있다 MovieDTO 는 Movie 클래스를 기준으로작성한다, MovieDTO는 화면에... JavaSpringbootJPAmysqlJPA 영속성 전이(cascade)를 사용할 때 주의해야 할 점 영속성 전이를 프로젝트에 적용하면서 꽤나 많은 우여곡절을 겪었는데, 여기에서 다시 한 번 배운 내용을 정리해보려 합니다. 본 게시글에 사용될 엔티티들의 코드는 다음과 같습니다. Candidate Entity Sns Entity Facebook Entity EntityManager = em 입니다. candidate 엔티티의 @OneToMany(mappedBy = "candidate", cas... JPASpringJPA [JPA] JPA 프로젝트 설정 프로젝트에서 JPA를 사용하기 위해 추가해야할 설정을 간단히 알아보자. pom.xml 파일에 아래 dependency를 추가. /META_INF 디렉토리 아래에 생성. hibernate.dialect 설정은 매우 유용한 JPA 기능이다. 세상의 거의 모든 데이터베이스 SQL문을 JPA 표준으로 매핑해놓아서, 사용할 데이터베이스의 방언을 설정해주면 쿼리문이 해당 SQL의 문법으로 마법처럼 작성... JPAJPA [JPA] 영속성 관리 - Entity 생명주기 JPA에서 가장 중요한 두가지 ✌🏻 객체와 관계형 데이터베이스 매핑하기 영속성 컨텍스트 (Persistence Context) 영속성 컨텍스트에 대해 알아보기 전, 영속성 컨텍스트 내부에서 어떤 일이 일어나는지 알아보기 위해 JPA에서의 Entity 생명주기에 대해 먼저 알아보자. - 비영속 (new/transient) : 영속성 컨텍스트와 전혀 상관없는 새로운 상태 - 영속 managed ... JPAJPA 스프링 JPA 양방향 연관관계의 이해 - 영속성 전이 cascade commentList, postImageList, postLikeList 와 같은 일대다 리스트를 보면 cascade 옵션이 달려있는 것을 확인할 수 있다. comment(댓글) 의 경우 post(게시글) 가 삭제될 경우 post와 연관된 comment 가 연쇄적으로 삭제하기 위해 cascade = CascadeType.REMOVE 을 설정하였다. postImage(게시글 이미지)의 경우 생... JPASpring기록기억하고싶은Spring bootdata jpaJPA SpringBoot Paging 처리 방법 SpringBoot에서는 JPA를 통해 페이징 처리를 쉽게 활용할 수 있습니다. 예제 소스는 TodoList-backend 소스를 사용하였습니다. Page 정보를 가지고 있는 Pageable 객체 controller단에서 파라미터로 받는 정보들 : @RequestParam : pageNo(0부터 시작), pageSize, sortBy 처리 로직 정리(entity -> Dto) ✅ Respon... 페이징SpringbootPagingJPAJPA 컬렉션 조회 최적화 하지만, 역시나 이전과 같이 쿼리가 엄청 많이 출력되는 것을 확인할 수 있다. 이 방법은 문제점이 있다. 그렇기 때문에 쿼리에서 모든 Orders 쿼리가 2개씩 생성된다. 그래서 결과가 위처럼 2개씩 생성되는 것을 확인할 수 있다. 그런데 이건 단점이 있다. 그런데, 페치 조인을 하고난 뒤에 페이징을 하게 되면, 모든 데이터를 전부 가져온 뒤에 100개만 가져오는 방식으로 처리된다. 하이버네... JPASpringJPA SpringBoot with JPA 프로젝트(M:N) 6.영화조회,리뷰등록,삭제 1-1.Service 수정 1-2.ServiceImpl 수정 MovieDTO 를 만들어 내기 위해 MovieRepository에서 가져오는 Movie, MovieImage 리스트, 평점 평균, 리뷰 개수의 리스트를 가공한다 1-3.Controller 수정 GET 방식으로 '/movie/read?mno=xxx'와 같은 URL을 처리한다(수정 작업에도 동일한 코드가 사용된다) 2-1.Review... JavaSpringbootJPAmysqlJPA [JPA] @OneToMany 연관관계 매핑 시작 @OneToMany 매핑, 즉 일대다 관계를 스프링 부트에서 어떤 식으로 적용시키면 좋을지에 대해 알아본다. 일대다(1:N) 관계 일대다 관계란, 한 쪽의 엔티티가 다른 쪽의 엔티티의 객체 여러개를 가질 수 있을 때를 의미하는 관계이다. 예를 들어, 하나의 팀은 여러명의 선수를 가질 수 있다. 이런 경우를 팀이 선수와 일대다 관계를 맺고 있다고 말할 수 있다. 이를 그림으로 나타내면 다... JPA스프링부트JPA [JPA] 영속성 전이 (CASCADE)와 고아 객체 특정 Entity를 영속 상태로 만들 때, 연관된 Entity들에 대해 영속성을 전파 시키는 옵션. 연관된 객체만큼 persist를 호출하므로 보기에도 비효율적인 코드다. persist 메서드로 person을 저장하면 그와 연관된 엔티티 객체들도 같이 영속성 저장이 된다. PERSIST: persist 메서드 호출 시 연관된 엔티티 저장 REMOVE: remove 메서드 호출 시 연관된 엔티... JPAJPA 이전 기사 보기