이번시간에는 게시물에 카테고리 적용을 하겠습니다.
먼저 게시물 카테고리 Entity와 Repository를 만들어줍니다.
- Entitiy
@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PostCategory {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String name;
@Column(unique = true)
private String value;
@OneToMany(mappedBy = "category")
private List<Post> postList = new ArrayList<>();
public void mappingPost(Post post) {
this.postList.add(post);
}
}
- Repository
@Repository
public interface PostCategoryRepository extends JpaRepository<PostCategory, Long> {
PostCategory findByName(String name);
}
그 다음에는 Post 엔티티와 PostCategory끼리 연관 관계를 설정해야 합니다.
@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String contents;
private LocalDateTime createAt;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_category_id")
private PostCategory category;
public void changeTitle(String title) {
this.title = title;
}
public void changeContents(String contents) {
this.contents = contents;
}
public void mappingCategory(PostCategory postCategory){
this.category = postCategory;
postCategory.mappingPost(this);
}
}
Post와 PostCategory끼리의 연관 관계는 N : 1 이기 때문에 PostEntitiy에 @ManyToOne 을 붙여줍니다. fetch가 LAZY인 이유는 @ManyToOne의 경우 기본 패치 전략이 EAGER 이며 EAGER의 경우 테이블에 데이터가 많을경우 쿼리가 매우 많아져 이슈가 생겨 실무에서는 사용하지 않는다고 합니다. LAZY같은 경우에는 조인을 해도 바로 관련된 데이터를 가져오지 않고 데이터를 사용할때 가져오기 때문에 쿼리 문제가 당장에는 발생하지 않습니다.
그리고 N에 해당하는 Post에 연관관계의 주인을 설정하여 게시물 카테고리와 매핑시켜 줍니다.
그럼 이제 Service를 수정하도록 하겠습니다.
- PostDTO
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PostDTO {
private Long id;
@NotBlank(message = "제목을 입력해주세요.")
private String title;
@NotBlank(message = "내용을 입력해주세요.")
private String contents;
private Long viewCount;
private String createdAt;
@NotBlank(message = "카테고리를 선택해주세요.")
private String category;
}
- PostService
public PostDTO createPost(PostDTO postDTO) {
Post post = Post.builder()
.title(postDTO.getTitle())
.contents(postDTO.getContents())
.category(postCategoryRepository.findByName(postDTO.getCategory()))
.createAt(LocalDateTime.now())
.build();
Post savePost = postRepository.save(post);
return PostDTO.builder()
.id(savePost.getId())
.build();
}
전체 코드는 여기에서 볼 수 있습니다.
'스프링 부트' 카테고리의 다른 글
스프링부트 게시판 API 만들기 - 9 (유저와 게시물 연관시키기 및 쿼리 최적화) (0) | 2021.04.29 |
---|---|
스프링부트 게시판 API 만들기 - 8 (API 문서 Swagger 사용하기) (0) | 2021.04.28 |
스프링부트 게시판 API 만들기 - 6 (Spring Security를 사용하여 Json로그인 하기) (0) | 2021.04.25 |
스프링부트 게시판 API 만들기 - 5 (유저 생성 및 테스트코드 작성) (0) | 2021.04.23 |
스프링부트 게시판 API 만들기 - 4 (게시글 수정, 삭제 테스트 코드 작성) (0) | 2021.04.23 |