본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


반응형

JPA

(55)
JPA 공부 4 - 일대다 단방향,양방향(1:N) (비추) 연관관계 매핑시 고려사항 3가지 1. 다중성 - @ManyToOne , @OneToMany , @OneToOne , @ManyToMany 2. 단방향, 양방향 - 테이블과 객체의 특성 파악 테이블 외래키 하나로 양쪽 조인 가능하기 떄문에 방향이라는 개념이 없다 객체 참조용 필드가 있는 쪽으로 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향이라 한다. 3. 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다 . 객체 양방향 관계는 A->B B->A 참조가 2군데서 필요하다. 둘중 테이블의 외래 키를 관리할 곳을 지정해야한다. 연관관계의 주인: 외래키 관리하는 참조 주인의 반대편 : 외래 키에 영향을 주지 않으며 , 조회만 가능 일대다 단방향(1:N) 일대다 단방향은 1이 ..
JPA 공부 3 - 연관관계 매핑2 양방향 연관관계와 연관관계 주인 위 그림은 양방향 연관관계의 구조를 그려 놓은 것이다 . 객체의 양방향관계는 team 클래스가 List members 필드를 갖고 , member는 Team team 객체를 갖음으로써 서로 양방향에서 참조가 가능하다 . 하지만 테이블 연관관계는 foreign key 하나로 양쪽에서 join이 가능하기 떄문에 단방향일 때와 달라지는 것이 없다 . 테이블의 연관관계는 사실 방향이라는 개념이 없는 것이다. 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개로 이어져 있는것이다. 하지만 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리 하기 떄문에 양쪽으로 조인이 가능하다 . select * from member m join team t on t.team.id = m.team_id ..
JPA 공부 2 - 연관관계 매핑 1 단방향 연관관계 '객체지향 설계의 목표는 자육적인 객체들의 협력 공동체를 만드는 것이다 ' -조영호(객체지향의 사실과 오해)- JPA도 결국엔 코드를 객체지향답게 짜기 위해 사용한다. 위의 ERD 처럼 Member와 Team이 있다고 생각해보자 위의 두개는 객체의 관계이고 아래 두개는 DB의 연관관계이다 . 현재 member 객체는 teamId를 직접 가지고 있다 데이터베이스 관점에서 객체가 설계된 것이다 . Member 객체를 생성해 team 을 참조 한다고 했을떄 membe에 team Id 를 가지고 다시 조회를 해야할 것이다. 다른 말로는 객체 그래프로 탐색이 불가능하다 . 객체 지향적으로 설계한다면 아래 그림과 같을 것이다 이번 경우에는 member는 team 객체를 가지고 있다 . 맴버를 통해 member.ge..
JPA 공부 1 - 영속성 컨텍스트 JPA 에서 가장 중요한 2가지를 꼽으면 - 영속성 컨텍스트 - 객체와 관계형 데이터 베이스 간의 연관관계 맵핑 두가지 일 것 이다 . 영속성 컨텍스트에 대해서 먼저알아보자 영속성 컨택스트 클라이언트의 요청이 들어올 때 EntityManagerFactory가 각 쓰레드마다 EntityManager를 생성하고 EntityManager는 DB의 connectionpool에 접근하여 데이터를 처리한다. EntityManager가 생성되면서 영속성 컨텍스트가 1:1로 생성되는데 EntityManager는 DB에 바로 접근하는 것이아니라 영속성 컨텍스트에 접근하여 해당 데이터를 관리한다. EntityManager에서 persist() 메서드를 호출한다는 것은 DB에 데이터를 저장하는 것이 아니라 영속성컨텍스트에 ..
SPRING DATA JPA 공부 7 - AuditingEntityListener 사용 지금까지 직접 EntityListener를 작성했지만 사실 자주 사용 되는 기능들을 이미 스프링에서 구현해놓은 EntityListner가 있다 . 바로 AuditingEntityListener 이다 . AuditingEntityListener을 사용하기 위해선 어플리케이션 구동 클래스에 @EnableJpaAuditing을 달아줘야 한다 . @SpringBootApplication @EnableJpaAuditing public class JpaTestApplication { public static void main(String[] args) { SpringApplication.run(JpaTestApplication.class, args); } } 엔티티에서 @EntityListener( value = ..
SPRING DATA JPA 공부 5 - EntityListener 활용 EntityListener는 해당 엔티티 라이프 사이클 중 특점 시점에 원하는 로직을 처리하도록 한다 . 총 7가지가 있으며 각각 엔티티의 라이프 사이클에 맞게 동작한다 @NoArgsConstructor @AllArgsConstructor @RequiredArgsConstructor @Data @Builder @Entity public class User { @Id @GeneratedValue private Long id; @NonNull private String name; @NonNull private String email; private String nickName; @Transient private String testData; @Enumerated(value = EnumType.STRING) ..
SPRING DATA JPA 공부 4 - Query Method 활용 2 ( 정렬과 페이징) 이전 시간에 쿼리메소드에 대한 기본적인 활용에 대해 알아봤다 . 쿼리메소드를 통해 정렬과 페이징을 할 수 있는 방법을 알아보려한다 . repository에 3가지 메소드를 만들었다 1.정렬 List findTop3ByNameOrderByIdDesc(String name); List findFirstByNameOrderByIdDescEmailAsc(String name); List findFirstByName(String name , Sort sort); fintTop3는 이름순으로 내림차순으로 정렬하여 그 중 가장위의 3개 레코드를 얻어오느 메서드이다 메서드이름에 OrderByIdDesc가 그것을 의미한다 . findFirstByNameOrderByIdDescEmailAsc 이름이 엄청길다 이 메서드 처..
SPRING DATA JPA 공부 3 - QueryMethod 활용 JPA에서 기본적으로 제공하는 메서드들이 있지만, where 절에 특정 값을 넣는 경우에는 기본제공 메서드들로 생성하기 한계가 있다 QueryMethod는 Repository에 메소드 이름으로 간편하게 where 절을 구성할 수 있게 해주는 기능이다 . IDE에서 추천을 해주기 때문에 작성하는데에 더욱 편리하다 필드명까지 참조해서 추천해준다 하지만 아래의 추천이 모두 알맞은 쿼리를 작성해 주는 것은 아니기 때문에 아래의 규칙을 한번 보면 좋을 것 같다 . 리턴타입과 메서드명에 관한 규칙들이다 package com.ugo.jpatest.repository; import com.ugo.jpatest.domain.User; import org.springframework.data.jpa.repository.J..

반응형