Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

게시판에서 카테고리 Column을 정규화 #276

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,11 @@ private String initSort(final String sort) {
if (sort == null || sort.isBlank()) {
return "writtenAt";
}

if (sort.equals("category")) {
return "category.text";
}

return validateSort(sort);
}

Expand Down Expand Up @@ -275,12 +280,21 @@ private String validateOrder(final String order) {
.orElseThrow(() -> new IllegalArgumentException("정렬 순서는 asc, desc 중 하나여야 합니다."));
}

/**
* 정렬 기준을 Sort.Order로 변환
*
* @return Sort.Order
*/
public Sort.Order getOrder() {
return Sort.Order.by(sort).with(convertOrderToSortDirection());
}

/**
* 정렬 순서를 Sort.Direction으로 변환
*
* @return Sort.Direction
*/
public Sort.Direction convertOrderToSortDirection() {
private Sort.Direction convertOrderToSortDirection() {
if (order.equals("desc"))
return Sort.Direction.DESC;
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import org.hyunggi.mygardenbe.boards.common.category.entity.BoardCategoryEntity;
import org.hyunggi.mygardenbe.boards.common.category.repository.BoardCategoryRepository;
import org.hyunggi.mygardenbe.boards.common.category.service.response.BoardCategoryResponse;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -47,12 +48,13 @@ private void validateBoardType(final String boardType) {
*
* @param category 분류
* @param boardType 게시판 타입
* @return 분류와 게시판 타입에 해당하는 분류 Entity
*/
public void validateCategoryWithBoardType(final String category, final String boardType) {
public BoardCategoryEntity getCategoryWithBoardType(final String category, final String boardType) {
validateCategory(category);
validateBoardType(boardType);

boardCategoryRepository.findByCodeAndBoardType(category, boardType)
return boardCategoryRepository.findByCodeAndBoardType(category, boardType)
.orElseThrow(() -> new EntityNotFoundException("해당 분류가 존재하지 않습니다."));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ private PageRequest buildPageable(final GetRequest.SearchPaging searchPaging) {
return PageRequest.of(
searchPaging.currentPage(),
searchPaging.pageSize(),
Sort.by(searchPaging.convertOrderToSortDirection(), searchPaging.sort(), "id")
Sort.by(searchPaging.getOrder(), Sort.Order.asc("id"))
);
}

Expand All @@ -79,6 +79,7 @@ private PageRequest buildPageable(final GetRequest.SearchPaging searchPaging) {
*/
@GetMapping("/{boardId}")
public ApiResponse<LearnBoardResponse> getLearnBoard(@PathVariable final Long boardId) {
//TODO: 게시판 조회시에 연관관계에 따라, Board Category를 TIL 게시판 조회 후에 또 다시 조회하는 문제가 있음 -> 당장 급한 문제는 아니니, 추후에 수정
return ApiResponse.ok(learnBoardService.getLearnBoard(boardId));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hyunggi.mygardenbe.boards.common.category.entity.BoardCategoryEntity;
import org.hyunggi.mygardenbe.common.entity.BaseEntity;

import java.time.LocalDateTime;
Expand Down Expand Up @@ -37,8 +38,9 @@ public class LearnBoardEntity extends BaseEntity {
/**
* 분류
*/
@Column(nullable = false, length = 20)
private String category;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(nullable = false, name = "category_id")
private BoardCategoryEntity category;

/**
* 조회수
Expand All @@ -65,7 +67,7 @@ public class LearnBoardEntity extends BaseEntity {
private Long memberId;

@Builder(access = lombok.AccessLevel.PRIVATE)
private LearnBoardEntity(final String title, final String content, final String category, final String writer, final LocalDateTime writtenAt, final Long memberId) {
private LearnBoardEntity(final String title, final String content, final BoardCategoryEntity category, final String writer, final LocalDateTime writtenAt, final Long memberId) {
this.title = title;
this.content = content;
this.category = category;
Expand All @@ -86,7 +88,7 @@ private LearnBoardEntity(final String title, final String content, final String
* @param memberId 작성자 ID
* @return TIL 게시글 Entity
*/
public static LearnBoardEntity of(final String title, final String content, final String category, final String writer, final Long memberId) {
public static LearnBoardEntity of(final String title, final String content, final BoardCategoryEntity category, final String writer, final Long memberId) {
return of(title, content, category, writer, LocalDateTime.now(), memberId);
}

Expand All @@ -101,7 +103,7 @@ public static LearnBoardEntity of(final String title, final String content, fina
* @param memberId 작성자 ID
* @return TIL 게시글 Entity
*/
public static LearnBoardEntity of(final String title, final String content, final String category, final String writer, final LocalDateTime writtenAt, final Long memberId) {
public static LearnBoardEntity of(final String title, final String content, final BoardCategoryEntity category, final String writer, final LocalDateTime writtenAt, final Long memberId) {
validateConstructor(title, content, category, writer, writtenAt, memberId);

return LearnBoardEntity.builder()
Expand All @@ -124,7 +126,7 @@ public static LearnBoardEntity of(final String title, final String content, fina
* @param writtenAt 작성일
* @param memberId 작성자 ID
*/
private static void validateConstructor(final String title, final String content, final String category, final String writer, final LocalDateTime writtenAt, final Long memberId) {
private static void validateConstructor(final String title, final String content, final BoardCategoryEntity category, final String writer, final LocalDateTime writtenAt, final Long memberId) {
validateTitle(title);
validateContent(content);
validateCategory(category);
Expand Down Expand Up @@ -156,13 +158,13 @@ private static void validateContent(final String content) {
}

/**
* 분류 유효성 검사
* 분류 검증
*
* @param category 분류
*/
private static void validateCategory(final String category) {
if (category == null || category.isBlank()) {
throw new IllegalArgumentException("분류는 null이 될 수 없고 빈 문자열이 될 수 없습니다.");
private static void validateCategory(final BoardCategoryEntity category) {
if (category == null) {
throw new IllegalArgumentException("분류는 null이 될 수 없습니다.");
}
}

Expand Down Expand Up @@ -213,7 +215,7 @@ public void increaseViewCount() {
* @param content 내용
* @param category 분류
*/
public void update(final String title, final String content, final String category) {
public void update(final String title, final String content, final BoardCategoryEntity category) {
validateUpdate(title, content, category);

this.title = title;
Expand All @@ -228,7 +230,7 @@ public void update(final String title, final String content, final String catego
* @param content 내용
* @param category 분류
*/
private void validateUpdate(final String title, final String content, final String category) {
private void validateUpdate(final String title, final String content, final BoardCategoryEntity category) {
validateTitle(title);
validateContent(content);
validateCategory(category);
Expand All @@ -243,4 +245,13 @@ private void validateUpdate(final String title, final String content, final Stri
public boolean isWriter(final Long memberId) {
return this.memberId.equals(memberId);
}

/**
* 분류 코드 반환
*
* @return 분류 코드
*/
public String getCategoryCode() {
return category.getCode();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public Page<LearnBoardEntity> searchLearnBoards(final LocalDateTime startDateTim
private Function<JPAQueryFactory, JPAQuery> getContentQuery(final LocalDateTime startDateTime, final LocalDateTime endDateTime, final String category, final String searchText) {
return queryFactory -> queryFactory
.selectFrom(learnBoardEntity)
.join(learnBoardEntity.category).fetchJoin()
.where(
writtenAtBetween(startDateTime, endDateTime),
categoryEquals(category),
Expand Down Expand Up @@ -102,7 +103,7 @@ private BooleanExpression categoryEquals(final String category) {
return null;
}

return learnBoardEntity.category.eq(category);
return learnBoardEntity.category.code.eq(category);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import org.hyunggi.mygardenbe.boards.common.category.entity.BoardCategoryEntity;
import org.hyunggi.mygardenbe.boards.common.category.service.BoardCategoryService;
import org.hyunggi.mygardenbe.boards.common.response.CustomPage;
import org.hyunggi.mygardenbe.boards.learn.entity.LearnBoardEntity;
Expand Down Expand Up @@ -134,12 +135,13 @@ private LearnBoardEntity getLearnBoardEntity(final Long boardId) {
* @return 작성한 게시글 ID
*/
public Long postLearnBoard(final String category, final String title, final String content, final MemberEntity member) {
validatePostRequest(category, title, content);
validatePostRequest(title, content);
final BoardCategoryEntity categoryEntity = boardCategoryService.getCategoryWithBoardType(category, "learn");

final LearnBoardEntity learnBoardEntity = LearnBoardEntity.of(
title,
content,
category,
categoryEntity,
getMemberEmailId(member),
LocalDateTime.now(),
member.getId()
Expand All @@ -151,24 +153,20 @@ public Long postLearnBoard(final String category, final String title, final Stri
/**
* 게시글 작성의 인자 검증
*
* @param category 분류
* @param title 제목
* @param content 내용
* @param title 제목
* @param content 내용
*/
private void validatePostRequest(final String category, final String title, final String content) {
validateContent(category, title, content);
private void validatePostRequest(final String title, final String content) {
validateContent(title, content);
}

/**
* 게시글 내용 유효성 검사
*
* @param category 분류
* @param title 제목
* @param content 내용
* @param title 제목
* @param content 내용
*/
private void validateContent(final String category, final String title, final String content) {
boardCategoryService.validateCategoryWithBoardType(category, "learn");

private void validateContent(final String title, final String content) {
Assert.isTrue(StringUtils.hasText(title), "제목은 비어있을 수 없습니다.");
Assert.isTrue(title.length() <= 100, "제목은 100자를 넘을 수 없습니다.");
Assert.isTrue(StringUtils.hasText(content), "게시글 내용은 비어있을 수 없습니다.");
Expand Down Expand Up @@ -197,7 +195,8 @@ private String getMemberEmailId(final MemberEntity member) {
*/
@Transactional
public Long putLearnBoard(final Long boardId, final String category, final String title, final String content, final MemberEntity member) {
validatePutRequest(boardId, category, title, content);
validatePutRequest(boardId, title, content);
final BoardCategoryEntity categoryEntity = boardCategoryService.getCategoryWithBoardType(category, "learn");

final LearnBoardEntity learnBoardEntity = getLearnBoardEntity(boardId);

Expand All @@ -206,7 +205,7 @@ public Long putLearnBoard(final Long boardId, final String category, final Strin
learnBoardEntity.update(
title,
content,
category
categoryEntity
);

return boardId;
Expand All @@ -227,15 +226,14 @@ private void validateBoardWriter(final MemberEntity member, final LearnBoardEnti
/**
* 게시글 수정의 인자 검증
*
* @param boardId 게시글 ID
* @param category 분류
* @param title 제목
* @param content 내용
* @param boardId 게시글 ID
* @param title 제목
* @param content 내용
*/
private void validatePutRequest(final Long boardId, final String category, final String title, final String content) {
private void validatePutRequest(final Long boardId, final String title, final String content) {
validateBoardId(boardId);

validateContent(category, title, content);
validateContent(title, content);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public static LearnBoardResponse of(final LearnBoardEntity learnBoardEntity) {
.id(learnBoardEntity.getId())
.title(learnBoardEntity.getTitle())
.content(learnBoardEntity.getContent())
.category(learnBoardEntity.getCategory())
.category(learnBoardEntity.getCategoryCode())
.views(learnBoardEntity.getViews())
.writer(learnBoardEntity.getWriter())
.writtenAt(learnBoardEntity.getWrittenAt().format(ofPattern("yyyy-MM-dd HH:mm:ss")))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ private PageRequest buildPageable(final GetRequest.SearchPaging searchPaging) {
return PageRequest.of(
searchPaging.currentPage(),
searchPaging.pageSize(),
Sort.by(searchPaging.convertOrderToSortDirection(), searchPaging.sort(), "id")
Sort.by(searchPaging.getOrder(), Sort.Order.asc("id"))
);
}

Expand All @@ -91,6 +91,7 @@ private PageRequest buildPageable(final GetRequest.SearchPaging searchPaging) {
*/
@GetMapping("/{boardId}")
public ApiResponse<NoticeBoardResponse> getNoticeBoard(@PathVariable final Long boardId) {
//TODO: 게시판 조회시에 연관관계에 따라, Board Category를 Notice 게시판 조회 후에 또 다시 조회하는 문제가 있음 -> 당장 급한 문제는 아니니, 추후에 수정
return ApiResponse.ok(noticeBoardService.getNoticeBoard(boardId));
}

Expand Down
Loading
Loading