유지, 보수와 효율성 증대
JPA를 사용하지 않고, SQL문으로 테이블을 생성한다면 일일히 CRUD를 작성해주어야 한다.
하지만, JPA를 사용한다면 일일히 CRUD문을 작성하지 않고 JPA에게 저장할 객체로 전달해주면 된다.
테이블 간에 연관관계를 정의하기 위해 사용
ex) entity가 2개일 때,
작성자 entity ↔ 게시글 entity간의 연관관계를 정의하기 위해서는
1 : 1(OnetoOne,일대일), 1 : n(OnetoMany,일대다), n: 1(ManytoOne,다대일)이 있다.
작성자 한 명은 여러 개의 게시글을 사용할 수 있으므로, 작성자 입장에서는 1 : n(일대다,OnetoMany) 관계지만,
게시글 입장에서는 다대일(ManytoOne)관계이다(여러 개의 게시글들을 한 명이 쓸 수 있기 때문이다).
ManytoOne을 사용하는 것이 해당 객체를 명확히 판별할 수 있기 때문에 주로 ManytoOne 사용.(팀플에서도 manytoOne 사용)
ex)entity가 3개 이상일 때,
entity 3개 중 변동성이 가장 큰 것에 연관관계를 명시해줘야 한다.
ex) 아파트 entity↔ 부동산 entity ↔ 고객 entity가 있으면 부동산의 변동성에 따라 아파트의 집값의 변동이나, 고객의 심리변화가 가장 크기에 부동산에 연관관계(ManytoOne)를 매핑시켜줘야 한다.
사용방법
우선 변동성이 가장 큰 entity에 연관관계를 명시해줘야 한다.
위에 사진에 있는 코드를 예시로 들면,
User(소비자) <-> Cart(카트) <-> Item(상품)과 같이 연관관계를 맺을 수 있게 된다.
즉 카트가 없으면 소비가 상품을 구매하지 못하기 때문에 변동성이 3개 중 가장 크다.
즉 카트에 연관관계를 매핑시켜주었다.
@ManyToOne(fetch = FetchType.LAZY) // default값은 EAGER인데 이것을 쓰면 성능이 저하되기 때문에 괄호안에 있는 값을 써줘야 한다.
@Column(name = "") // 각 entity 매칭되는 외래키의 이름
@OnDelete(action = OnDeleteAction.CASCADE) // 다대일 관계에서 일에 해당하는 값이 지워지면 해당 테이블과 관련된 값 모두 삭제(ex) 고객1이 삭제되면 고객에 대한 카트 정보와 아이템 정보 모두 삭제)
JpaRepository 사용
기존 게시판 레포지토리에서는 JpaRepository를 상속만 받고 구현부를 작성하지 않았는데 연관관계를 맺어주면 구현부를 반드시 작성해줘야 한다.
User findeUserByUsername(String username); // 스프링에서 함수 이름은 기능을 의미
// 유저 이름으로부터 유저를 찾아라
코드 참조
'Java > Spring' 카테고리의 다른 글
스프링 프로젝트 리팩토링 전 코드(review) (0) | 2022.08.22 |
---|---|
Junit5을 이용한 테스트코드 작성(단위 테스트 코드) (0) | 2022.08.15 |
DTO, DAO, Repository, Entity 개념 (0) | 2022.08.04 |
예외처리(Exception)기능 + Response 기능(데이터 반환) 을 추가한 게시판 만들기 코드 (2) | 2022.07.27 |
스프링 스터디(RestAPI의 다양한 기능 추가(Exception, Response..) (0) | 2022.07.25 |