본문 바로가기

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


반응형

전체 글

(160)
JPA 공부 7 - 상속관계 매핑 객체에는 상속관계가 있지만 관계형 데이터베이스는 상속 관계가 없다 . 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사한 편이다. 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다 . DB의 super type sub type 논리 모델을 물리모델로 구현하는 방법은 3가지이다. 1. JOIN 전략 아이템 테이블과 ALBUM , MOVIE , BOOK 테이블을 각각 조인 하여 가져오는 전략이다 . 전략들 중 가장 정규화 되어 있고 JPA와 가장 유사한 모델이다. ALBUM 을 생성한다고 하면 공통 정보는 ITEM에 저장하고 ALBUM 정보는 ALBUM에 저장한다 . album , item 이 따로 2번의 insert 가 일어나고 조회시에는 ALBUM과 ITEM..
JPA 공부 6 - 다대다 연관관계(N:N) 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현 할 수 없다. 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어야 한다. 반면에 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계를 만들 수 있다. 객체를 @ManyToMany 로 맵핑하면 JPA는 이를 연결 테이블로 만들어 준다 이떄 주인이 되는 쪽에서 @JoinColumn이 아닌 @JoinTable(name="MEMBER_PRODUCT")를 사용해줘야 한다. name 옵션에는 중간 테이블 이름을 적어주면 그 이름으로 양쪽의 프라이머리키를 외래키로 갖는 연결테이블이 만들어진다. 하지만 이 방법에는 중간 테이블에 다른 정보를 넣을 수 없다는 한계가 있어 왠만하면 쓰지 않는다고 한다. 위의 문제를 해결하기 위해 중간테이블을 엔티티로 만들어서..
JPA 공부 5 - 일대일 연관관계(1:1) 일대일 연관관계 단방향(1:1) 일대일 관계는 그 반대에서도 일대일이다 . 주 테이블이나 대상 테이블 중에 외래 키 선택이 가능하고 외래 키에 데이터베이스 유니크 제약 조건을 추가하면 된다. 둘다 동등한 관계이기 떄문에 연관관계의 주인이 없다 어느 쪽에서 외래 키를 관리해도 상관이 없다 . @Data @NoArgsConstructor @AllArgsConstructor @Entity public class Locker { @Id @GeneratedValue private Long id; private String name; //양방향일 경우 추가 //@OneToOne(mappedBy = "locker") //private Member member; } @NoArgsConstructor @AllArgsCo..
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 = ..

반응형