on
[Spring] JPA+Spring으로 카테고리 로직 구현 - 1
[Spring] JPA+Spring으로 카테고리 로직 구현 - 1
토이 프로젝트를 진행하면서 카테고리를 만드는데 무한 뎁스로 만드는 과정을 기록하려 한다.
위 사진 처럼 유연하게 설계하여 무한하게 카테고리가 생성이 가능한 로직을 구현할것이다.
1. Entity 구현
하나의 테이블에서 무한 뎁스를 구현해야하기 때문에 Self Join을 사용할 것이다.
@Entity @Getter @NoArgsConstructor @AllArgsConstructor public class Category { @Id@GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "category_id") private Long id; private String categoryName; @ManyToOne(fetch = FetchType.LAZY) private Category parentCategory; @OneToMany(mappedBy = "parentCategory") private ListchildCategory =new ArrayList<>(); @OneToMany(fetch = FetchType.LAZY,mappedBy ="category") private List posts = new ArrayList<>(); @Builder public Category(String categoryName, Category parentCategory, List childCategory, List posts) { this.categoryName = categoryName; this.parentCategory = parentCategory; this.childCategory = childCategory; this.posts = posts; } }
여기서 주의깊게 볼것은 parentCategory 와 childCategory 이다.
와 이다. 서로 물고 무는 무한뎁스 구조를 위해 두 칼럼끼리 연관관계를 맺고 mappedBy속성을 통해서 parentCategory 를 연관 관계 주인으로 설정해준다. (주인을 설정해주지 않으면 조회시 계속 서로를 참조하는 무한루프가 발생한다!)
를 연관 관계 주인으로 설정해준다. JPA에서 연관관계를 설정할때 ManyToOne,OneToOne은 fetchType.EAGER이 default이다. 그래서 지연 참조(detchType.Lazy)를 사용해줘야 N+1 이슈 등 문제가 생기지 않는다.
2.Repository
public interface CategoryRepository extends JpaRepository { OptionalfindByCategoryName(String name); Boolean existsByCategoryName(String name); }
extends JpaRepository는 Spring data jpa를 사용하기 위해 무조건 상속 받아야한다.
Spring data jpa를 사용하기 위해 무조건 상속 받아야한다. Spring data jpa는 메서드 이름명으로 검색 조건을 만들수 있다.(find + By + Entity 필드값)
existsByCateoryName은 카테고리 이름이 중복되는지 검증하기 위해 Boolean 타입으로 리턴 받는다.
다음 포스팅은 서비스와 서비스에 대한 테스트 코드를 포스팅할 예정이다.
from http://jarvics.tistory.com/83 by ccl(A) rewrite - 2021-12-10 04:27:47