diff --git a/src/main/java/konkuk/thip/book/application/service/BookMostSearchService.java b/src/main/java/konkuk/thip/book/application/service/BookMostSearchService.java index 8555506f2..96f85cd00 100644 --- a/src/main/java/konkuk/thip/book/application/service/BookMostSearchService.java +++ b/src/main/java/konkuk/thip/book/application/service/BookMostSearchService.java @@ -6,6 +6,7 @@ import konkuk.thip.user.application.port.out.UserCommandPort; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.List; @@ -18,6 +19,7 @@ public class BookMostSearchService implements BookMostSearchUseCase { private final UserCommandPort userCommandPort; @Override + @Transactional(readOnly = true) public BookMostSearchResult getMostSearchedBooks(Long userId) { userCommandPort.findById(userId); diff --git a/src/main/java/konkuk/thip/book/application/service/BookSearchService.java b/src/main/java/konkuk/thip/book/application/service/BookSearchService.java index d1ec358f8..8fd48ad2d 100644 --- a/src/main/java/konkuk/thip/book/application/service/BookSearchService.java +++ b/src/main/java/konkuk/thip/book/application/service/BookSearchService.java @@ -1,6 +1,5 @@ package konkuk.thip.book.application.service; -import jakarta.transaction.Transactional; import konkuk.thip.book.adapter.out.api.dto.NaverBookParseResult; import konkuk.thip.book.adapter.out.api.dto.NaverDetailBookParseResult; import konkuk.thip.book.application.port.in.BookSearchUseCase; @@ -21,6 +20,7 @@ import konkuk.thip.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.HashSet; @@ -44,9 +44,8 @@ public class BookSearchService implements BookSearchUseCase { private final UserCommandPort userCommandPort; private final BookRedisCommandPort bookRedisCommandPort; - @Override - @Transactional + @Transactional(readOnly = true) public NaverBookParseResult searchBooks(String keyword, int page, Long userId) { if (keyword == null || keyword.isBlank()) { @@ -79,6 +78,7 @@ public NaverBookParseResult searchBooks(String keyword, int page, Long userId) { } @Override + @Transactional(readOnly = true) public BookDetailSearchResult searchDetailBooks(String isbn,Long userId) { //유저정보찾기 diff --git a/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java b/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java index 6c86b08a0..8d363aa16 100644 --- a/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java +++ b/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java @@ -30,6 +30,7 @@ public enum ErrorCode implements ResponseCode { * 60000 : alias error */ ALIAS_NOT_FOUND(HttpStatus.NOT_FOUND, 60001, "존재하지 않는 ALIAS 입니다."), + ALIAS_NAME_NOT_MATCH(HttpStatus.BAD_REQUEST, 60002, "일치하는 칭호 이름이 없습니다."), /** @@ -102,7 +103,13 @@ public enum ErrorCode implements ResponseCode { * 150000 : Category error */ CATEGORY_NOT_FOUND(HttpStatus.NOT_FOUND, 150000, "존재하지 않는 CATEGORY 입니다."), - CATEGORY_NOT_MATCH(HttpStatus.BAD_REQUEST, 150001, "일치하는 카테고리 이름이 없습니다.") + CATEGORY_NOT_MATCH(HttpStatus.BAD_REQUEST, 150001, "일치하는 카테고리 이름이 없습니다."), + + /** + * 160000 : Feed error + */ + FEED_NOT_FOUND(HttpStatus.NOT_FOUND, 160000, "존재하지 않는 FEED 입니다."), + TAG_NAME_NOT_MATCH(HttpStatus.BAD_REQUEST, 160001, "일치하는 태그 이름이 없습니다.") ; diff --git a/src/main/java/konkuk/thip/feed/adapter/out/jpa/FeedTagJpaEntity.java b/src/main/java/konkuk/thip/feed/adapter/out/jpa/FeedTagJpaEntity.java new file mode 100644 index 000000000..3f7f27d38 --- /dev/null +++ b/src/main/java/konkuk/thip/feed/adapter/out/jpa/FeedTagJpaEntity.java @@ -0,0 +1,26 @@ +package konkuk.thip.feed.adapter.out.jpa; + +import jakarta.persistence.*; +import konkuk.thip.common.entity.BaseJpaEntity; +import lombok.*; + +@Entity +@Table(name = "feed_tags") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class FeedTagJpaEntity extends BaseJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long feedTagId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id", nullable = false) + private FeedJpaEntity feedJpaEntity; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "tag_id", nullable = false) + private TagJpaEntity tagJpaEntity; +} diff --git a/src/main/java/konkuk/thip/feed/adapter/out/mapper/FeedMapper.java b/src/main/java/konkuk/thip/feed/adapter/out/mapper/FeedMapper.java index 4566dc332..d680f3ff4 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/mapper/FeedMapper.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/mapper/FeedMapper.java @@ -2,10 +2,14 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; +import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; import konkuk.thip.feed.domain.Feed; +import konkuk.thip.feed.domain.Tag; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import org.springframework.stereotype.Component; +import java.util.List; + @Component public class FeedMapper { @@ -19,7 +23,7 @@ public FeedJpaEntity toJpaEntity(Feed feed, UserJpaEntity userJpaEntity, BookJpa .build(); } - public Feed toDomainEntity(FeedJpaEntity feedJpaEntity) { + public Feed toDomainEntity(FeedJpaEntity feedJpaEntity, List tagJpaEntityList) { return Feed.builder() .id(feedJpaEntity.getPostId()) .content(feedJpaEntity.getContent()) @@ -27,6 +31,10 @@ public Feed toDomainEntity(FeedJpaEntity feedJpaEntity) { .isPublic(feedJpaEntity.getIsPublic()) .reportCount(feedJpaEntity.getReportCount()) .targetBookId(feedJpaEntity.getBookJpaEntity().getBookId()) + .tagList(tagJpaEntityList.stream() + .map(TagJpaEntity::getValue) + .map(Tag::from) + .toList()) .createdAt(feedJpaEntity.getCreatedAt()) .modifiedAt(feedJpaEntity.getModifiedAt()) .status(feedJpaEntity.getStatus()) diff --git a/src/main/java/konkuk/thip/feed/adapter/out/mapper/TagMapper.java b/src/main/java/konkuk/thip/feed/adapter/out/mapper/TagMapper.java deleted file mode 100644 index 20e96cb88..000000000 --- a/src/main/java/konkuk/thip/feed/adapter/out/mapper/TagMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package konkuk.thip.feed.adapter.out.mapper; - -import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; -import konkuk.thip.feed.domain.Tag; -import konkuk.thip.post.adapter.out.jpa.PostJpaEntity; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import org.springframework.stereotype.Component; - -@Component -public class TagMapper { - - public TagJpaEntity toJpaEntity(Tag tag, PostJpaEntity postJpaEntity, CategoryJpaEntity categoryJpaEntity) { - return TagJpaEntity.builder() - .value(tag.getValue()) - .postJpaEntity(postJpaEntity) - .categoryJpaEntity(categoryJpaEntity) - .build(); - } - - public Tag toDomainEntity(TagJpaEntity tagJpaEntity) { - return Tag.builder() - .id(tagJpaEntity.getTagId()) - .value(tagJpaEntity.getValue()) - .targetPostId(tagJpaEntity.getPostJpaEntity().getPostId()) - .categoryId(tagJpaEntity.getCategoryJpaEntity().getCategoryId()) - .createdAt(tagJpaEntity.getCreatedAt()) - .modifiedAt(tagJpaEntity.getModifiedAt()) - .status(tagJpaEntity.getStatus()) - .build(); - } -} diff --git a/src/main/java/konkuk/thip/feed/domain/Feed.java b/src/main/java/konkuk/thip/feed/domain/Feed.java index 50ca5414a..8a25b238a 100644 --- a/src/main/java/konkuk/thip/feed/domain/Feed.java +++ b/src/main/java/konkuk/thip/feed/domain/Feed.java @@ -4,6 +4,8 @@ import lombok.Getter; import lombok.experimental.SuperBuilder; +import java.util.List; + @Getter @SuperBuilder public class Feed extends BaseDomainEntity { @@ -20,4 +22,18 @@ public class Feed extends BaseDomainEntity { private Long targetBookId; + private List tagList; + + public static Feed withoutId(String content, Long creatorId, Boolean isPublic, int reportCount, Long targetBookId, List tagList) { + return Feed.builder() + .id(null) + .content(content) + .creatorId(creatorId) + .isPublic(isPublic) + .reportCount(reportCount) + .targetBookId(targetBookId) + .tagList(tagList) + .build(); + } + } diff --git a/src/main/java/konkuk/thip/feed/domain/Tag.java b/src/main/java/konkuk/thip/feed/domain/Tag.java index 81bfe4ce0..f84214409 100644 --- a/src/main/java/konkuk/thip/feed/domain/Tag.java +++ b/src/main/java/konkuk/thip/feed/domain/Tag.java @@ -1,18 +1,39 @@ package konkuk.thip.feed.domain; -import konkuk.thip.common.entity.BaseDomainEntity; +import konkuk.thip.common.exception.InvalidStateException; +import konkuk.thip.room.domain.Category; import lombok.Getter; -import lombok.experimental.SuperBuilder; +import lombok.RequiredArgsConstructor; -@Getter -@SuperBuilder -public class Tag extends BaseDomainEntity { - - private Long id; +import static konkuk.thip.common.exception.code.ErrorCode.TAG_NAME_NOT_MATCH; - private String value; +@Getter +@RequiredArgsConstructor +public enum Tag { + BOOK_RECOMMEND("책추천"), + TODAYS_BOOK("오늘의책"), + READING_LOG("독서기록"), + BOOK_REVIEW("책리뷰"), + QUOTE("책속한줄"), + BOOK_REPORT("독후감"), + LIFE_BOOK("내인생책"), + RE_READ("다시읽고싶은책"), + BOOK_TALK("북토크"), + BOOKSTAGRAM("책스타그램"), + NOVEL("소설추천"), + SELF_IMPROVEMENT("자기계발서"), + PHILOSOPHY("인문학책"), + SCIENCE("과학책"), + ECONOMY("경제책"); - private Long targetPostId; + private final String value; - private Long categoryId; + public static Tag from(String value) { + for (Tag tagName : Tag.values()) { + if (tagName.value.equalsIgnoreCase(value)) { + return tagName; + } + } + throw new InvalidStateException(TAG_NAME_NOT_MATCH); + } } diff --git a/src/main/java/konkuk/thip/record/adapter/in/web/response/RecordDto.java b/src/main/java/konkuk/thip/record/adapter/in/web/response/RecordDto.java index 0fda7c5fc..148fe5c05 100644 --- a/src/main/java/konkuk/thip/record/adapter/in/web/response/RecordDto.java +++ b/src/main/java/konkuk/thip/record/adapter/in/web/response/RecordDto.java @@ -29,7 +29,7 @@ public static RecordDto of(Record record, String postDate, User user, int likeCo .page(record.getPage()) .userId(record.getCreatorId()) .nickName(user.getNickname()) - .profileImageUrl(user.getImageUrl()) + .profileImageUrl(user.getAlias().getImageUrl()) .content(record.getContent()) .likeCount(likeCount) .commentCount(commentCount) diff --git a/src/main/java/konkuk/thip/record/adapter/in/web/response/VoteDto.java b/src/main/java/konkuk/thip/record/adapter/in/web/response/VoteDto.java index f52ebaab9..cec556857 100644 --- a/src/main/java/konkuk/thip/record/adapter/in/web/response/VoteDto.java +++ b/src/main/java/konkuk/thip/record/adapter/in/web/response/VoteDto.java @@ -36,7 +36,7 @@ public static VoteDto of( .page(vote.getPage()) .userId(vote.getCreatorId()) .nickName(user.getNickname()) - .profileImageUrl(user.getImageUrl()) + .profileImageUrl(user.getAlias().getImageUrl()) .content(vote.getContent()) .likeCount(likeCount) .commentCount(commentCount) diff --git a/src/main/java/konkuk/thip/record/application/service/RecordSearchService.java b/src/main/java/konkuk/thip/record/application/service/RecordSearchService.java index 021403843..6403cd773 100644 --- a/src/main/java/konkuk/thip/record/application/service/RecordSearchService.java +++ b/src/main/java/konkuk/thip/record/application/service/RecordSearchService.java @@ -23,6 +23,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Comparator; @@ -46,6 +47,7 @@ public class RecordSearchService implements RecordSearchUseCase { private static final int PAGE_SIZE = 10; @Override + @Transactional(readOnly = true) public RecordSearchResponse search(RecordSearchQuery query) { validateQueryParams(query); diff --git a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java index a3e3d6af9..488dd9df1 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java @@ -12,6 +12,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import static konkuk.thip.common.exception.code.ErrorCode.CATEGORY_NOT_FOUND; import static konkuk.thip.common.exception.code.ErrorCode.INVALID_ROOM_SEARCH_SORT; @@ -25,6 +26,7 @@ public class RoomSearchService implements RoomSearchUseCase { private final RoomQueryPort roomQueryPort; @Override + @Transactional(readOnly = true) public RoomSearchResponse searchRoom(String keyword, String category, String sort, int page) { // 1. validation String sortVal = validateSort(sort); @@ -58,12 +60,8 @@ private String validateCategory(String category) { if (category == null || category.isEmpty()) { return ""; } - try { - Category cat = Category.from(category); - return cat.getValue(); - } catch (IllegalArgumentException ex) { - throw new BusinessException(CATEGORY_NOT_FOUND, ex); - } + + return Category.from(category).getValue(); } /** diff --git a/src/main/java/konkuk/thip/room/application/service/RoomVerifyPasswordService.java b/src/main/java/konkuk/thip/room/application/service/RoomVerifyPasswordService.java index 88ead3713..ab183a6b3 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomVerifyPasswordService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomVerifyPasswordService.java @@ -16,6 +16,7 @@ public class RoomVerifyPasswordService implements RoomVerifyPasswordUseCase { private final RoomCommandPort roomCommandPort; @Override + @Transactional(readOnly = true) public Void verifyRoomPassword(RoomVerifyPasswordQuery query) { //방 검증 diff --git a/src/main/java/konkuk/thip/room/domain/Category.java b/src/main/java/konkuk/thip/room/domain/Category.java index 80c6fbd18..1ff96bba6 100644 --- a/src/main/java/konkuk/thip/room/domain/Category.java +++ b/src/main/java/konkuk/thip/room/domain/Category.java @@ -17,7 +17,7 @@ public enum Category { * TODO : DB에서 value를 통해 카테고리를 조회하는것보다 id로 조회하는게 성능상 좋으니, id 값도 같이 보관 ?? */ SCIENCE_IT("과학/IT"), - Literature("문학"), + LITERATURE("문학"), ART("예술"), SOCIAL_SCIENCE("사회과학"), HUMANITY("인문학"); diff --git a/src/main/java/konkuk/thip/user/adapter/in/web/request/UserSignupRequest.java b/src/main/java/konkuk/thip/user/adapter/in/web/request/UserSignupRequest.java index fe13a0804..fbe40ac17 100644 --- a/src/main/java/konkuk/thip/user/adapter/in/web/request/UserSignupRequest.java +++ b/src/main/java/konkuk/thip/user/adapter/in/web/request/UserSignupRequest.java @@ -1,12 +1,13 @@ package konkuk.thip.user.adapter.in.web.request; -import jakarta.validation.constraints.*; -import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import konkuk.thip.user.application.port.in.dto.UserSignupCommand; public record UserSignupRequest( - @NotNull(message = "aliasId는 필수입니다.") - Long aliasId, + @NotBlank(message = "aliasName은 필수입니다.") + String aliasName, @Pattern(regexp = "[가-힣a-zA-Z0-9]+", message = "닉네임은 한글, 영어, 숫자로만 구성되어야 합니다.(공백불가)") @Size(max = 10, message = "닉네임은 최대 10자 입니다.") @@ -14,7 +15,7 @@ public record UserSignupRequest( ) { public UserSignupCommand toCommand(String oAuth2Id) { return UserSignupCommand.builder() - .aliasId(aliasId) + .aliasName(aliasName) .nickname(nickname) .oauth2Id(oAuth2Id) .build(); diff --git a/src/main/java/konkuk/thip/user/adapter/in/web/response/UserViewAliasChoiceResponse.java b/src/main/java/konkuk/thip/user/adapter/in/web/response/UserViewAliasChoiceResponse.java index 8af48cfef..9d6e96881 100644 --- a/src/main/java/konkuk/thip/user/adapter/in/web/response/UserViewAliasChoiceResponse.java +++ b/src/main/java/konkuk/thip/user/adapter/in/web/response/UserViewAliasChoiceResponse.java @@ -9,7 +9,6 @@ public record UserViewAliasChoiceResponse(List aliasChoices) { public static UserViewAliasChoiceResponse of(UserViewAliasChoiceResult result) { List choices = result.aliasChoices().stream() .map(ac -> new AliasChoice( - ac.aliasId(), ac.aliasName(), ac.categoryName(), ac.imageUrl(), @@ -20,7 +19,6 @@ public static UserViewAliasChoiceResponse of(UserViewAliasChoiceResult result) { } public record AliasChoice( - Long aliasId, String aliasName, String categoryName, String imageUrl, diff --git a/src/main/java/konkuk/thip/user/adapter/out/mapper/AliasMapper.java b/src/main/java/konkuk/thip/user/adapter/out/mapper/AliasMapper.java deleted file mode 100644 index eac3e0f45..000000000 --- a/src/main/java/konkuk/thip/user/adapter/out/mapper/AliasMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package konkuk.thip.user.adapter.out.mapper; - -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; -import konkuk.thip.user.domain.Alias; -import org.springframework.stereotype.Component; - -@Component -public class AliasMapper { - - public AliasJpaEntity toJpaEntity(Alias alias) { - return AliasJpaEntity.builder() - .value(alias.getValue()) - .imageUrl(alias.getImageUrl()) - .color(alias.getColor()) - .build(); - } - - public Alias toDomainEntity(AliasJpaEntity aliasJpaEntity) { - return Alias.builder() - .id(aliasJpaEntity.getAliasId()) - .value(aliasJpaEntity.getValue()) - .imageUrl(aliasJpaEntity.getImageUrl()) - .color(aliasJpaEntity.getColor()) - .createdAt(aliasJpaEntity.getCreatedAt()) - .modifiedAt(aliasJpaEntity.getModifiedAt()) - .status(aliasJpaEntity.getStatus()) - .build(); - } -} diff --git a/src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java b/src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java index 40ce8d0c3..4d7fd43a4 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java +++ b/src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java @@ -3,6 +3,7 @@ import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; +import konkuk.thip.user.domain.Alias; import konkuk.thip.user.domain.User; import org.springframework.stereotype.Component; @@ -12,7 +13,7 @@ public class UserMapper { public UserJpaEntity toJpaEntity(User user, AliasJpaEntity aliasJpaEntity) { return UserJpaEntity.builder() .nickname(user.getNickname()) - .imageUrl(user.getImageUrl()) + .imageUrl(user.getAlias().getImageUrl()) .role(UserRole.from(user.getUserRole())) .oauth2Id(user.getOauth2Id()) .aliasForUserJpaEntity(aliasJpaEntity) @@ -23,10 +24,9 @@ public User toDomainEntity(UserJpaEntity userJpaEntity) { return User.builder() .id(userJpaEntity.getUserId()) .nickname(userJpaEntity.getNickname()) - .imageUrl(userJpaEntity.getImageUrl()) .userRole(userJpaEntity.getRole().getType()) - .aliasId(userJpaEntity.getAliasForUserJpaEntity().getAliasId()) .oauth2Id(userJpaEntity.getOauth2Id()) + .alias(Alias.from(userJpaEntity.getAliasForUserJpaEntity().getValue())) .createdAt(userJpaEntity.getCreatedAt()) .modifiedAt(userJpaEntity.getModifiedAt()) .status(userJpaEntity.getStatus()) diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasCommandPersistenceAdapter.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasCommandPersistenceAdapter.java deleted file mode 100644 index 154feaf72..000000000 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasCommandPersistenceAdapter.java +++ /dev/null @@ -1,27 +0,0 @@ -package konkuk.thip.user.adapter.out.persistence; - -import konkuk.thip.common.exception.EntityNotFoundException; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; -import konkuk.thip.user.adapter.out.mapper.AliasMapper; -import konkuk.thip.user.application.port.out.AliasCommandPort; -import konkuk.thip.user.domain.Alias; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import static konkuk.thip.common.exception.code.ErrorCode.ALIAS_NOT_FOUND; - -@Repository -@RequiredArgsConstructor -public class AliasCommandPersistenceAdapter implements AliasCommandPort { - - private final AliasMapper aliasMapper; - private final AliasJpaRepository aliasJpaRepository; - - @Override - public Alias findById(Long aliasId) { - AliasJpaEntity aliasJpaEntity = aliasJpaRepository.findById(aliasId).orElseThrow( - () -> new EntityNotFoundException(ALIAS_NOT_FOUND)); - - return aliasMapper.toDomainEntity(aliasJpaEntity); - } -} diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasJpaRepository.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasJpaRepository.java index 130df4c2c..2ba8d51ec 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasJpaRepository.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasJpaRepository.java @@ -3,5 +3,9 @@ import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface AliasJpaRepository extends JpaRepository, AliasQueryRepository { + + Optional findByValue(String value); } \ No newline at end of file diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasQueryPersistenceAdapter.java deleted file mode 100644 index 0fe88291d..000000000 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasQueryPersistenceAdapter.java +++ /dev/null @@ -1,18 +0,0 @@ -package konkuk.thip.user.adapter.out.persistence; - -import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; -import konkuk.thip.user.application.port.out.AliasQueryPort; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class AliasQueryPersistenceAdapter implements AliasQueryPort { - - private final AliasJpaRepository aliasJpaRepository; - - @Override - public UserViewAliasChoiceResult getAllAliasesAndCategories() { - return aliasJpaRepository.getAllAliasesAndCategories(); - } -} diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasQueryRepositoryImpl.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasQueryRepositoryImpl.java index a3791cd11..0482b2074 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/AliasQueryRepositoryImpl.java @@ -24,7 +24,6 @@ public UserViewAliasChoiceResult getAllAliasesAndCategories() { List aliasChoices = jpaQueryFactory .select(Projections.constructor( UserViewAliasChoiceResult.AliasChoice.class, - alias.aliasId, alias.value, category.value, alias.imageUrl, diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/UserCommandPersistenceAdapter.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/UserCommandPersistenceAdapter.java index eda795f14..6909bf929 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/UserCommandPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/UserCommandPersistenceAdapter.java @@ -23,7 +23,7 @@ public class UserCommandPersistenceAdapter implements UserCommandPort { @Override public Long save(User user) { - AliasJpaEntity aliasJpaEntity = aliasJpaRepository.findById(user.getAliasId()).orElseThrow( + AliasJpaEntity aliasJpaEntity = aliasJpaRepository.findByValue(user.getAlias().getValue()).orElseThrow( () -> new EntityNotFoundException(ALIAS_NOT_FOUND)); UserJpaEntity userJpaEntity = userMapper.toJpaEntity(user, aliasJpaEntity); diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/UserQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/UserQueryPersistenceAdapter.java index 586fc5942..b28f73e4a 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/UserQueryPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/UserQueryPersistenceAdapter.java @@ -1,6 +1,7 @@ package konkuk.thip.user.adapter.out.persistence; import konkuk.thip.user.adapter.out.mapper.UserMapper; +import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; import konkuk.thip.user.application.port.out.UserQueryPort; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -12,6 +13,7 @@ public class UserQueryPersistenceAdapter implements UserQueryPort { private final UserJpaRepository userJpaRepository; + private final AliasJpaRepository aliasJpaRepository; private final UserMapper userMapper; @Override @@ -23,4 +25,9 @@ public boolean existsByNickname(String nickname) { public Set findUserIdsParticipatedInRoomsByBookId(Long bookId) { return userJpaRepository.findUserIdsByBookId(bookId); } + + @Override + public UserViewAliasChoiceResult getAllAliasesAndCategories() { + return aliasJpaRepository.getAllAliasesAndCategories(); + } } \ No newline at end of file diff --git a/src/main/java/konkuk/thip/user/application/port/in/dto/UserSignupCommand.java b/src/main/java/konkuk/thip/user/application/port/in/dto/UserSignupCommand.java index 0b23769e8..450a5a2e0 100644 --- a/src/main/java/konkuk/thip/user/application/port/in/dto/UserSignupCommand.java +++ b/src/main/java/konkuk/thip/user/application/port/in/dto/UserSignupCommand.java @@ -4,7 +4,7 @@ @Builder public record UserSignupCommand( - Long aliasId, + String aliasName, String nickname, String oauth2Id ) {} diff --git a/src/main/java/konkuk/thip/user/application/port/in/dto/UserViewAliasChoiceResult.java b/src/main/java/konkuk/thip/user/application/port/in/dto/UserViewAliasChoiceResult.java index b60820376..60d70366f 100644 --- a/src/main/java/konkuk/thip/user/application/port/in/dto/UserViewAliasChoiceResult.java +++ b/src/main/java/konkuk/thip/user/application/port/in/dto/UserViewAliasChoiceResult.java @@ -5,7 +5,6 @@ public record UserViewAliasChoiceResult(List aliasChoices) { public record AliasChoice( - Long aliasId, String aliasName, String categoryName, String imageUrl, diff --git a/src/main/java/konkuk/thip/user/application/port/out/AliasCommandPort.java b/src/main/java/konkuk/thip/user/application/port/out/AliasCommandPort.java deleted file mode 100644 index be3bbf093..000000000 --- a/src/main/java/konkuk/thip/user/application/port/out/AliasCommandPort.java +++ /dev/null @@ -1,8 +0,0 @@ -package konkuk.thip.user.application.port.out; - -import konkuk.thip.user.domain.Alias; - -public interface AliasCommandPort { - - Alias findById(Long aliasId); -} diff --git a/src/main/java/konkuk/thip/user/application/port/out/AliasQueryPort.java b/src/main/java/konkuk/thip/user/application/port/out/AliasQueryPort.java deleted file mode 100644 index 064428123..000000000 --- a/src/main/java/konkuk/thip/user/application/port/out/AliasQueryPort.java +++ /dev/null @@ -1,8 +0,0 @@ -package konkuk.thip.user.application.port.out; - -import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; - -public interface AliasQueryPort { - - UserViewAliasChoiceResult getAllAliasesAndCategories(); -} diff --git a/src/main/java/konkuk/thip/user/application/port/out/UserQueryPort.java b/src/main/java/konkuk/thip/user/application/port/out/UserQueryPort.java index 3a6a55d28..5b71774eb 100644 --- a/src/main/java/konkuk/thip/user/application/port/out/UserQueryPort.java +++ b/src/main/java/konkuk/thip/user/application/port/out/UserQueryPort.java @@ -1,8 +1,12 @@ package konkuk.thip.user.application.port.out; +import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; + import java.util.Set; public interface UserQueryPort { boolean existsByNickname(String nickname); Set findUserIdsParticipatedInRoomsByBookId(Long bookId); + + UserViewAliasChoiceResult getAllAliasesAndCategories(); } diff --git a/src/main/java/konkuk/thip/user/application/service/UserSignupService.java b/src/main/java/konkuk/thip/user/application/service/UserSignupService.java index 478ed31e4..105e49eb9 100644 --- a/src/main/java/konkuk/thip/user/application/service/UserSignupService.java +++ b/src/main/java/konkuk/thip/user/application/service/UserSignupService.java @@ -2,7 +2,6 @@ import konkuk.thip.user.application.port.in.UserSignupUseCase; import konkuk.thip.user.application.port.in.dto.UserSignupCommand; -import konkuk.thip.user.application.port.out.AliasCommandPort; import konkuk.thip.user.application.port.out.UserCommandPort; import konkuk.thip.user.domain.Alias; import konkuk.thip.user.domain.User; @@ -18,14 +17,13 @@ public class UserSignupService implements UserSignupUseCase { private final UserCommandPort userCommandPort; - private final AliasCommandPort aliasCommandPort; @Override @Transactional public Long signup(UserSignupCommand command) { - Alias alias = aliasCommandPort.findById(command.aliasId()); + Alias alias = Alias.from(command.aliasName()); User user = User.withoutId( - command.nickname(), alias.getImageUrl(), USER.getType(), alias.getId(), command.oauth2Id() + command.nickname(), USER.getType(), command.oauth2Id(), alias ); return userCommandPort.save(user); diff --git a/src/main/java/konkuk/thip/user/application/service/UserViewAliasChoiceService.java b/src/main/java/konkuk/thip/user/application/service/UserViewAliasChoiceService.java index b04dd2df6..50c64cd2f 100644 --- a/src/main/java/konkuk/thip/user/application/service/UserViewAliasChoiceService.java +++ b/src/main/java/konkuk/thip/user/application/service/UserViewAliasChoiceService.java @@ -2,7 +2,7 @@ import konkuk.thip.user.application.port.in.UserViewAliasChoiceUseCase; import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; -import konkuk.thip.user.application.port.out.AliasQueryPort; +import konkuk.thip.user.application.port.out.UserQueryPort; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -10,10 +10,10 @@ @RequiredArgsConstructor public class UserViewAliasChoiceService implements UserViewAliasChoiceUseCase { - private final AliasQueryPort aliasQueryPort; + private final UserQueryPort userQueryPort; @Override public UserViewAliasChoiceResult getAllAliasesAndCategories() { - return aliasQueryPort.getAllAliasesAndCategories(); + return userQueryPort.getAllAliasesAndCategories(); } } diff --git a/src/main/java/konkuk/thip/user/domain/Alias.java b/src/main/java/konkuk/thip/user/domain/Alias.java index 76e8c599d..992b7994e 100644 --- a/src/main/java/konkuk/thip/user/domain/Alias.java +++ b/src/main/java/konkuk/thip/user/domain/Alias.java @@ -1,18 +1,29 @@ package konkuk.thip.user.domain; -import konkuk.thip.common.entity.BaseDomainEntity; +import konkuk.thip.common.exception.InvalidStateException; +import konkuk.thip.common.exception.code.ErrorCode; import lombok.Getter; -import lombok.experimental.SuperBuilder; +import lombok.RequiredArgsConstructor; @Getter -@SuperBuilder -public class Alias extends BaseDomainEntity { +@RequiredArgsConstructor +public enum Alias { + WRITER("문학가", "문학_color", "문학_image"), + SCIENTIST("과학자", "과학_color", "과학_image"), + SOCIOLOGIST("사회학자", "사회과학_color", "사회과학_image"), + ARTIST("예술가", "예술_color", "예술_image"), + PHILOSOPHER("철학자", "철학_color", "철학_image"); - private Long id; + private final String value; + private final String color; + private final String imageUrl; - private String value; - - private String imageUrl; - - private String color; + public static Alias from(String value) { + for (Alias alias : Alias.values()) { + if (alias.value.equals(value)) { + return alias; + } + } + throw new InvalidStateException(ErrorCode.ALIAS_NAME_NOT_MATCH); + } } diff --git a/src/main/java/konkuk/thip/user/domain/User.java b/src/main/java/konkuk/thip/user/domain/User.java index b19513dd7..3de8ab730 100644 --- a/src/main/java/konkuk/thip/user/domain/User.java +++ b/src/main/java/konkuk/thip/user/domain/User.java @@ -12,22 +12,19 @@ public class User extends BaseDomainEntity { private String nickname; - private String imageUrl; - private String userRole; - private Long aliasId; - private String oauth2Id; - public static User withoutId(String nickname, String imageUrl, String userRole, Long aliasId, String oauth2Id) { + private Alias alias; + + public static User withoutId(String nickname, String userRole, String oauth2Id, Alias alias) { return User.builder() .id(null) .nickname(nickname) - .imageUrl(imageUrl) .userRole(userRole) - .aliasId(aliasId) .oauth2Id(oauth2Id) + .alias(alias) .build(); } diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java index 204ac4cde..942bb370b 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java @@ -6,6 +6,7 @@ import konkuk.thip.book.adapter.out.persistence.BookJpaRepository; import konkuk.thip.common.exception.code.ErrorCode; import konkuk.thip.common.security.util.JwtUtil; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.saved.adapter.out.jpa.SavedBookJpaEntity; import konkuk.thip.saved.adapter.out.persistence.SavedBookJpaRepository; import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; @@ -66,11 +67,7 @@ class BookChangeSavedControllerTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("책벌레") - .color("blue") - .imageUrl("http://image.url") - .build()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java index b86063d35..6709b9e51 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java @@ -4,6 +4,7 @@ import konkuk.thip.book.application.service.BookSearchService; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.common.security.util.JwtUtil; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.persistence.CategoryJpaRepository; import konkuk.thip.user.adapter.out.jpa.*; @@ -62,11 +63,7 @@ class BookDetailSearchControllerTest { @BeforeEach void setup() { - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("책벌레") - .color("blue") - .imageUrl("http://image.url") - .build()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") @@ -87,11 +84,7 @@ void setup() { .description("한강의 소설") .build()); - - CategoryJpaEntity category = categoryJpaRepository.save(CategoryJpaEntity.builder() - .value("소설") - .aliasForCategoryJpaEntity(alias) - .build()); + CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); RoomJpaEntity room = roomJpaRepository.save(RoomJpaEntity.builder() .title("한강 독서모임") diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java index d90a218ad..cbb4e82fe 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import konkuk.thip.book.application.port.in.dto.BookMostSearchResult; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; @@ -62,12 +63,7 @@ class BookMostSearchedBooksControllerTest { @BeforeEach void setUp() { - - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("책벌레") - .color("blue") - .imageUrl("http://image.url") - .build()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") @@ -76,7 +72,6 @@ void setUp() { .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); - } @AfterEach diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java index 6aba36187..7e3eb636b 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java @@ -2,6 +2,7 @@ import konkuk.thip.common.exception.code.ErrorCode; import konkuk.thip.common.security.util.JwtUtil; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchJpaEntity; import konkuk.thip.recentSearch.adapter.out.jpa.SearchType; import konkuk.thip.recentSearch.adapter.out.persistence.RecentSearchJpaRepository; @@ -51,12 +52,7 @@ class BookQueryControllerTest { @BeforeEach void setUp() { - - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("책벌레") - .color("blue") - .imageUrl("http://image.url") - .build()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") diff --git a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java index af1d4f988..2df450014 100644 --- a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java +++ b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java @@ -15,11 +15,37 @@ public class TestEntityFactory { - public static AliasJpaEntity createAlias() { - return AliasJpaEntity.builder() - .value("칭호") - .imageUrl("test-image-url") - .color("red") + /** + * 유효한 Jpa entity를 만들어주는 Factory + */ + + public static AliasJpaEntity createLiteratureAlias() { + return AliasJpaEntity.builder() // 실제 존재하는 값으로 + .value("문학가") + .imageUrl("문학_image") + .color("문학_color") + .build(); + } + + public static CategoryJpaEntity createLiteratureCategory(AliasJpaEntity alias) { + return CategoryJpaEntity.builder() // 실제 존재하는 값으로 + .value("문학") + .aliasForCategoryJpaEntity(alias) + .build(); + } + + public static AliasJpaEntity createScienceAlias() { + return AliasJpaEntity.builder() // 실제 존재하는 값으로 + .value("과학자") + .imageUrl("과학_image") + .color("과학_color") + .build(); + } + + public static CategoryJpaEntity createScienceCategory(AliasJpaEntity alias) { + return CategoryJpaEntity.builder() // 실제 존재하는 값으로 + .value("과학/IT") + .aliasForCategoryJpaEntity(alias) .build(); } @@ -46,13 +72,6 @@ public static BookJpaEntity createBook() { .build(); } - public static CategoryJpaEntity createCategory(AliasJpaEntity alias) { - return CategoryJpaEntity.builder() - .value("과학/IT") // 실제 존재하는 값 - .aliasForCategoryJpaEntity(alias) - .build(); - } - public static RoomJpaEntity createRoom(BookJpaEntity book, CategoryJpaEntity category) { return RoomJpaEntity.builder() .title("방이름") diff --git a/src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java b/src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java index 03d6484a1..cd4c013df 100644 --- a/src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java @@ -43,7 +43,7 @@ class FeedJpaEntityTest { @DisplayName("FeedJpaEntity 저장 및 조회 테스트") void saveAndFindFeed() { // given - AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createAlias()); + AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userRepository.save(TestEntityFactory.createUser(alias)); BookJpaEntity book = bookRepository.save(TestEntityFactory.createBook()); diff --git a/src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java b/src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java index 04279b9ce..7538ea3fb 100644 --- a/src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java +++ b/src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java @@ -81,13 +81,13 @@ void tearDown() { } private void saveUserAndRoom() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createAlias()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(alias)); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createCategory(alias)); + CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); diff --git a/src/test/java/konkuk/thip/record/adapter/in/web/RecordQueryControllerTest.java b/src/test/java/konkuk/thip/record/adapter/in/web/RecordQueryControllerTest.java index bc5e03386..5b065844b 100644 --- a/src/test/java/konkuk/thip/record/adapter/in/web/RecordQueryControllerTest.java +++ b/src/test/java/konkuk/thip/record/adapter/in/web/RecordQueryControllerTest.java @@ -5,6 +5,7 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.BookJpaRepository; import konkuk.thip.common.util.DateUtil; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.record.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.record.adapter.out.persistence.RecordJpaRepository; import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; @@ -72,11 +73,7 @@ void tearDown() { @DisplayName("기록장 조회 시 record와 vote 모두 조회") void record_with_vote_response_success() throws Exception { // given - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("별명") - .color("blue") - .imageUrl("http://alias.img") - .build()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_123") @@ -97,10 +94,7 @@ void record_with_vote_response_success() throws Exception { .bestSeller(false) .build()); - CategoryJpaEntity category = categoryJpaRepository.save(CategoryJpaEntity.builder() - .value("소설") - .aliasForCategoryJpaEntity(alias) - .build()); + CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); RoomJpaEntity room = roomJpaRepository.save(RoomJpaEntity.builder() .title("방 제목") diff --git a/src/test/java/konkuk/thip/record/adapter/out/persistence/RecordQueryRepositoryImplTest.java b/src/test/java/konkuk/thip/record/adapter/out/persistence/RecordQueryRepositoryImplTest.java index da584fd0b..898a19fb5 100644 --- a/src/test/java/konkuk/thip/record/adapter/out/persistence/RecordQueryRepositoryImplTest.java +++ b/src/test/java/konkuk/thip/record/adapter/out/persistence/RecordQueryRepositoryImplTest.java @@ -38,7 +38,7 @@ class RecordQueryRepositoryImplTest { @DisplayName("mine 타입일 경우 유저 ID에 해당하는 기록만 조회된다") void testFindRecordsByRoom_mine() { // given - AliasJpaEntity alias = TestEntityFactory.createAlias(); + AliasJpaEntity alias = TestEntityFactory.createLiteratureAlias(); em.persist(alias); UserJpaEntity user1 = TestEntityFactory.createUser(alias); @@ -49,7 +49,7 @@ void testFindRecordsByRoom_mine() { BookJpaEntity book = TestEntityFactory.createBook(); em.persist(book); - CategoryJpaEntity category = TestEntityFactory.createCategory(alias); + CategoryJpaEntity category = TestEntityFactory.createLiteratureCategory(alias); em.persist(category); RoomJpaEntity room = TestEntityFactory.createRoom(book, category); @@ -95,7 +95,7 @@ void testFindRecordsByRoom_mine() { @DisplayName("pageStart, pageEnd가 null이면 isOverview가 true인 레코드만 조회된다") void testFindRecordsByRoom_overview() { // given - AliasJpaEntity alias = TestEntityFactory.createAlias(); + AliasJpaEntity alias = TestEntityFactory.createLiteratureAlias(); em.persist(alias); UserJpaEntity user = TestEntityFactory.createUser(alias); @@ -104,7 +104,7 @@ void testFindRecordsByRoom_overview() { BookJpaEntity book = TestEntityFactory.createBook(); em.persist(book); - CategoryJpaEntity category = TestEntityFactory.createCategory(alias); + CategoryJpaEntity category = TestEntityFactory.createLiteratureCategory(alias); em.persist(category); RoomJpaEntity room = TestEntityFactory.createRoom(book, category); diff --git a/src/test/java/konkuk/thip/record/application/service/RecordSearchServiceTest.java b/src/test/java/konkuk/thip/record/application/service/RecordSearchServiceTest.java index 18a81b3fa..a679ed1a7 100644 --- a/src/test/java/konkuk/thip/record/application/service/RecordSearchServiceTest.java +++ b/src/test/java/konkuk/thip/record/application/service/RecordSearchServiceTest.java @@ -10,6 +10,7 @@ import konkuk.thip.record.application.port.out.RecordQueryPort; import konkuk.thip.record.domain.Record; import konkuk.thip.user.application.port.out.UserCommandPort; +import konkuk.thip.user.domain.Alias; import konkuk.thip.user.domain.User; import konkuk.thip.vote.application.port.out.VoteCommandPort; import konkuk.thip.vote.application.port.out.VoteQueryPort; @@ -40,6 +41,7 @@ class RecordSearchServiceTest { private RecordSearchService recordSearchService; private final Long userId = 1L; + private User stubUser; @BeforeEach void setUp() { @@ -51,6 +53,11 @@ void setUp() { voteQueryPort = mock(VoteQueryPort.class); dateUtil = mock(DateUtil.class); + // stubUser 세팅: 항상 같은 Alias와 userId 반환 + stubUser = mock(User.class); + when(stubUser.getAlias()).thenReturn(Alias.WRITER); + when(stubUser.getId()).thenReturn(userId); + recordSearchService = new RecordSearchService( recordQueryPort, userCommandPort, @@ -84,7 +91,7 @@ void testSortByLatest() { when(recordQueryPort.findRecordsByRoom(any(), any(), any(), any(), any(), any())) .thenReturn(RecordSearchResult.of(List.of(record), List.of(vote))); - when(userCommandPort.findById(any())).thenReturn(mock(User.class)); + when(userCommandPort.findById(any())).thenReturn(stubUser); when(postLikeQueryPort.countByPostId(anyLong())).thenReturn(0); when(commentQueryPort.countByPostId(anyLong())).thenReturn(0); when(postLikeQueryPort.existsByPostIdAndUserId(anyLong(), anyLong())).thenReturn(false); @@ -125,7 +132,7 @@ void testSortByLike() { when(recordQueryPort.findRecordsByRoom(any(), any(), any(), any(), any(), any())) .thenReturn(RecordSearchResult.of(List.of(record), List.of(vote))); - when(userCommandPort.findById(any())).thenReturn(mock(User.class)); + when(userCommandPort.findById(any())).thenReturn(stubUser); when(postLikeQueryPort.countByPostId(record.getId())).thenReturn(5); when(postLikeQueryPort.countByPostId(vote.getId())).thenReturn(10); when(commentQueryPort.countByPostId(anyLong())).thenReturn(0); @@ -164,7 +171,7 @@ void testPagingLogic() { when(recordQueryPort.findRecordsByRoom(any(), any(), any(), any(), any(), any())) .thenReturn(RecordSearchResult.of(records, votes)); - when(userCommandPort.findById(any())).thenReturn(mock(User.class)); + when(userCommandPort.findById(any())).thenReturn(stubUser); when(postLikeQueryPort.countByPostId(anyLong())).thenReturn(0); when(commentQueryPort.countByPostId(anyLong())).thenReturn(0); when(postLikeQueryPort.existsByPostIdAndUserId(anyLong(), anyLong())).thenReturn(false); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java index 67471027b..452fef6c5 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.BookJpaRepository; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.persistence.CategoryJpaRepository; @@ -72,11 +73,7 @@ void tearDown() { } private void saveUserAndCategory() { - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("책벌레") - .color("blue") - .imageUrl("http://image.url") - .build()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") @@ -86,10 +83,7 @@ private void saveUserAndCategory() { .aliasForUserJpaEntity(alias) .build()); - categoryJpaRepository.save(CategoryJpaEntity.builder() - .value("과학/IT") // 실제 카테고리 값 - .aliasForCategoryJpaEntity(alias) - .build()); + CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); } private void saveBookWithPageCount() { @@ -121,11 +115,11 @@ private void saveBookWithoutPageCount() { private Map buildRoomCreateRequest() { Map request = new HashMap<>(); request.put("isbn", "9788954682152"); - request.put("category", "과학/IT"); // 실제 카테고리 값 + request.put("category", "문학"); // 실제 카테고리 값 request.put("roomName", "방이름"); request.put("description", "방설명"); request.put("progressStartDate", LocalDate.now().plusDays(1).format(DateTimeFormatter.ofPattern("yyyy.MM.dd"))); - request.put("progressEndDate", LocalDate.now().plusDays(30).format(DateTimeFormatter.ofPattern("yyyy.MM.dd"))); + request.put("progressEndDate", LocalDate.now().plusDays(10).format(DateTimeFormatter.ofPattern("yyyy.MM.dd"))); request.put("recruitCount", 3); request.put("password", null); request.put("isPublic", true); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java index bba425dba..da46a3141 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java @@ -1,8 +1,8 @@ package konkuk.thip.room.adapter.in.web; -import com.fasterxml.jackson.databind.ObjectMapper; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.BookJpaRepository; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.persistence.CategoryJpaRepository; @@ -68,12 +68,8 @@ void tearDown() { aliasJpaRepository.deleteAll(); } - private RoomJpaEntity saveRoom(String categoryValue, String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount) { - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("소설-칭호") - .color("blue") - .imageUrl("http://image.url") - .build()); + private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount) { + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() .title(bookTitle) @@ -86,10 +82,36 @@ private RoomJpaEntity saveRoom(String categoryValue, String bookTitle, String is .description("한강의 소설") .build()); - CategoryJpaEntity category = categoryJpaRepository.save(CategoryJpaEntity.builder() - .value(categoryValue) - .aliasForCategoryJpaEntity(alias) + CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + + return roomJpaRepository.save(RoomJpaEntity.builder() + .title(roomName) + .description("한강 작품 읽기 모임") + .isPublic(true) + .roomPercentage(0.0) + .startDate(startDate) + .endDate(LocalDate.now().plusDays(30)) + .recruitCount(recruitCount) + .bookJpaEntity(book) + .categoryJpaEntity(category) .build()); + } + + private RoomJpaEntity saveLiteratureRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount) { + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + + BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() + .title(bookTitle) + .isbn(isbn) + .authorName("한강") + .bestSeller(false) + .publisher("문학동네") + .imageUrl("https://image1.jpg") + .pageCount(300) + .description("한강의 소설") + .build()); + + CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); return roomJpaRepository.save(RoomJpaEntity.builder() .title(roomName) @@ -105,11 +127,7 @@ private RoomJpaEntity saveRoom(String categoryValue, String bookTitle, String is } private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("소설-칭호") - .color("blue") - .imageUrl("http://image.url") - .build()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); // User 리스트 생성 및 저장 List users = IntStream.rangeClosed(1, count) @@ -140,22 +158,22 @@ private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { @DisplayName("keyword = [과학], 카테고리 선택 X, 정렬 = [마감임박순] 일 경우, 방이름 or 책제목에 '과학'이 포함된 방 검색 결과가 마감임박순으로 반환된다.") void search_keyword_and_sort_deadline() throws Exception { //given - RoomJpaEntity science_room_1 = saveRoom("과학/IT", "과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); saveUsersToRoom(science_room_1, 4); - RoomJpaEntity science_room_2 = saveRoom("과학/IT", "과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10); saveUsersToRoom(science_room_2, 5); - RoomJpaEntity science_room_3 = saveRoom("과학/IT", "과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); saveUsersToRoom(science_room_3, 2); - RoomJpaEntity science_room_4 = saveRoom("과학/IT", "과학-책", "isbn4", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "isbn4", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), 8); saveUsersToRoom(science_room_4, 1); - RoomJpaEntity room_3 = saveRoom("문학", "문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); + RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); saveUsersToRoom(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveRoom("과학/IT", "과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); + RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); saveUsersToRoom(recruit_expired_room_4, 6); //when @@ -189,22 +207,22 @@ void search_keyword_and_sort_deadline() throws Exception { @DisplayName("keyword = [과학], 카테고리 선택 X, 정렬 = [인기순] 일 경우, 방이름 or 책제목에 '과학'이 포함된 방 검색 결과가 인기순(= 현재까지 모집된 인원 많은 순)으로 반환된다.") void search_keyword_and_sort_member_count() throws Exception { //given - RoomJpaEntity science_room_1 = saveRoom("과학/IT", "과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); saveUsersToRoom(science_room_1, 4); - RoomJpaEntity science_room_2 = saveRoom("과학/IT", "과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10); saveUsersToRoom(science_room_2, 5); - RoomJpaEntity science_room_3 = saveRoom("과학/IT", "과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); saveUsersToRoom(science_room_3, 2); - RoomJpaEntity science_room_4 = saveRoom("과학/IT", "과학-책", "isbn4", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "isbn4", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), 8); saveUsersToRoom(science_room_4, 1); - RoomJpaEntity room_3 = saveRoom("문학", "문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); + RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); saveUsersToRoom(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveRoom("과학/IT", "과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); + RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); saveUsersToRoom(recruit_expired_room_4, 6); //when @@ -247,16 +265,16 @@ void search_keyword_and_sort_member_count() throws Exception { @DisplayName("keyword 입력 x, 카테고리 = [과학/IT], 정렬 = [마감임박순] 일 경우, [과학/IT] 카테고리에 속하는 방 검색 결과가 반환된다.") void search_category_and_sort_deadline() throws Exception { //given - RoomJpaEntity science_room_1 = saveRoom("과학/IT", "과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); saveUsersToRoom(science_room_1, 4); - RoomJpaEntity science_room_3 = saveRoom("과학/IT", "과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); saveUsersToRoom(science_room_3, 2); - RoomJpaEntity room_3 = saveRoom("문학", "문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); + RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); saveUsersToRoom(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveRoom("과학/IT", "과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); + RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); saveUsersToRoom(recruit_expired_room_4, 6); //when @@ -287,16 +305,16 @@ void search_category_and_sort_deadline() throws Exception { @DisplayName("keyword 입력 x, 카테고리 입력 x, 정렬 = [마감임박순] 일 경우, DB에 존재하는 전체 방 검색 결과가 반환된다.") void search_sort_deadline() throws Exception { //given - RoomJpaEntity science_room_1 = saveRoom("과학/IT", "과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); saveUsersToRoom(science_room_1, 4); - RoomJpaEntity science_room_3 = saveRoom("과학/IT", "과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); saveUsersToRoom(science_room_3, 2); - RoomJpaEntity room_3 = saveRoom("문학", "문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); + RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); saveUsersToRoom(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveRoom("과학/IT", "과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); + RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); saveUsersToRoom(recruit_expired_room_4, 6); //when @@ -327,16 +345,16 @@ void search_sort_deadline() throws Exception { @DisplayName("keyword=[과학], category=[과학/IT], 정렬=[마감임박순] 일 경우, keyword, category 조건을 모두 만족하는 방만 반환된다.") void search_keyword_and_category() throws Exception { // given - RoomJpaEntity science_room_1 = saveRoom("과학/IT", "과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); saveUsersToRoom(science_room_1, 4); - RoomJpaEntity science_room_3 = saveRoom("과학/IT", "과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); saveUsersToRoom(science_room_3, 2); - RoomJpaEntity room_3 = saveRoom("문학", "문학-책", "isbn5", "문학방입니다", LocalDate.now().plusDays(10), 8); + RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "문학방입니다", LocalDate.now().plusDays(10), 8); saveUsersToRoom(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveRoom("과학/IT", "과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); + RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); saveUsersToRoom(recruit_expired_room_4, 6); // when diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java index 3ba330a9e..31cfe0e7c 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.BookJpaRepository; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.room.adapter.in.web.request.RoomVerifyPasswordRequest; import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.persistence.CategoryJpaRepository; @@ -70,11 +71,7 @@ class RoomVerifyPasswordAPITest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(AliasJpaEntity.builder() - .value("책벌레") - .color("blue") - .imageUrl("http://image.url") - .build()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") @@ -95,16 +92,13 @@ void setUp() { .build()); userId = user.getUserId(); - CategoryJpaEntity categoryJpaEntity = categoryJpaRepository.save(CategoryJpaEntity.builder() - .value("과학/IT") - .aliasForCategoryJpaEntity(alias) - .build()); + CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); // 비공개 방 저장 (비밀번호: 1234) RoomJpaEntity privateRoom = roomJpaRepository.save( RoomJpaEntity.builder() .bookJpaEntity(book) - .categoryJpaEntity(categoryJpaEntity) + .categoryJpaEntity(category) .title("비공개방") .description("비공개방입니다") .isPublic(false) @@ -120,7 +114,7 @@ void setUp() { RoomJpaEntity publicRoom = roomJpaRepository.save( RoomJpaEntity.builder() .bookJpaEntity(book) - .categoryJpaEntity(categoryJpaEntity) + .categoryJpaEntity(category) .title("공개방") .description("공개방입니다") .isPublic(true) diff --git a/src/test/java/konkuk/thip/room/adapter/out/jpa/RecordJpaEntityTest.java b/src/test/java/konkuk/thip/room/adapter/out/jpa/RecordJpaEntityTest.java index 0d60b0088..d75ae8316 100644 --- a/src/test/java/konkuk/thip/room/adapter/out/jpa/RecordJpaEntityTest.java +++ b/src/test/java/konkuk/thip/room/adapter/out/jpa/RecordJpaEntityTest.java @@ -52,10 +52,10 @@ class RecordJpaEntityTest { @DisplayName("RecordJpaEntity 저장 및 조회 테스트") void saveAndFindRecord() { // given - AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createAlias()); + AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userRepository.save(TestEntityFactory.createUser(alias)); BookJpaEntity book = bookRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createCategory(alias)); + CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createLiteratureCategory(alias)); RoomJpaEntity room = roomRepository.save(TestEntityFactory.createRoom(book, category)); RecordJpaEntity record = recordRepository.save(TestEntityFactory.createRecord(user, room)); diff --git a/src/test/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntityTest.java b/src/test/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntityTest.java index 3d18de653..2e10d9e74 100644 --- a/src/test/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntityTest.java +++ b/src/test/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntityTest.java @@ -44,8 +44,8 @@ class RoomJpaEntityTest { void saveAndFindRoom() { // given BookJpaEntity book = bookRepository.save(TestEntityFactory.createBook()); - AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createAlias()); - CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createCategory(alias)); + AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createLiteratureAlias()); + CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createLiteratureCategory(alias)); RoomJpaEntity room = roomRepository.save(TestEntityFactory.createRoom(book, category)); // when diff --git a/src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java b/src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java index 79f3aea6a..e5cf1d357 100644 --- a/src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java +++ b/src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java @@ -52,10 +52,10 @@ class VoteJpaEntityTest { @DisplayName("VoteJpaEntity 저장 및 조회 테스트") void saveAndFindVote() { // given - AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createAlias()); + AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userRepository.save(TestEntityFactory.createUser(alias)); BookJpaEntity book = bookRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createCategory(alias)); + CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createLiteratureCategory(alias)); RoomJpaEntity room = roomRepository.save(TestEntityFactory.createRoom(book, category)); VoteJpaEntity vote = voteRepository.save(VoteJpaEntity.builder() diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserSignupControllerTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserSignupControllerTest.java index 899d914ac..2d788ed70 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserSignupControllerTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserSignupControllerTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import konkuk.thip.common.security.util.JwtUtil; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.user.adapter.in.web.request.UserSignupRequest; import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; @@ -58,15 +59,10 @@ void tearDown() { @DisplayName("[칭호id, 닉네임] 정보를 바탕으로 회원가입을 진행한다.") void signup_success() throws Exception { //given : alias 생성, 회원가입 request 생성 - AliasJpaEntity aliasJpaEntity = AliasJpaEntity.builder() - .value("칭호") - .color("blue") - .imageUrl("http://image.url") - .build(); - aliasJpaRepository.save(aliasJpaEntity); + AliasJpaEntity aliasJpaEntity = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserSignupRequest request = new UserSignupRequest( - aliasJpaEntity.getAliasId(), + aliasJpaEntity.getValue(), "테스트유저" ); @@ -86,8 +82,9 @@ void signup_success() throws Exception { Long userId = jsonNode.path("data").path("userId").asLong(); UserJpaEntity userJpaEntity = userJpaRepository.findById(userId).orElse(null); + AliasJpaEntity userAliasJpaEntity = aliasJpaRepository.findByValue(request.aliasName()).orElse(null); - assertThat(userJpaEntity.getAliasForUserJpaEntity().getAliasId()).isEqualTo(request.aliasId()); + assertThat(userAliasJpaEntity.getValue()).isEqualTo(request.aliasName()); assertThat(userJpaEntity.getNickname()).isEqualTo(request.nickname()); } @@ -108,7 +105,7 @@ void signup_alias_id_null() throws Exception { .content(objectMapper.writeValueAsString(request))) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.code").value(API_INVALID_PARAM.getCode())) - .andExpect(jsonPath("$.message", containsString("aliasId는 필수입니다."))); + .andExpect(jsonPath("$.message", containsString("aliasName은 필수입니다."))); } @Test @@ -116,7 +113,7 @@ void signup_alias_id_null() throws Exception { void signup_nickname_blank() throws Exception { //given: nickname blank UserSignupRequest request = new UserSignupRequest( - 1L, + "문학가", "" ); @@ -136,7 +133,7 @@ void signup_nickname_blank() throws Exception { void signup_nickname_invalid_pattern() throws Exception { //given: nickname with invalid characters UserSignupRequest request = new UserSignupRequest( - 1L, + "문학가", "닉네임!!" ); @@ -156,7 +153,7 @@ void signup_nickname_invalid_pattern() throws Exception { void signup_nickname_too_long() throws Exception { //given: 11글자 nickname UserSignupRequest request = new UserSignupRequest( - 1L, + "문학가", "11글자닉네임입니다아" ); @@ -175,16 +172,11 @@ void signup_nickname_too_long() throws Exception { @DisplayName("임시 토큰을 통해 @Oauth2Id로 oauth2Id를 정확히 추출하여 회원가입에 성공한다.") void signup_whenValidSignupToken_thenExtractOauth2IdCorrectly() throws Exception { //given : alias 데이터 저장 - AliasJpaEntity aliasJpaEntity = AliasJpaEntity.builder() - .value("테스트칭호") - .color("green") - .imageUrl("http://image.url") - .build(); - aliasJpaRepository.save(aliasJpaEntity); + AliasJpaEntity aliasJpaEntity = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); //회원가입 request 생성 UserSignupRequest request = new UserSignupRequest( - aliasJpaEntity.getAliasId(), + aliasJpaEntity.getValue(), "테스트유저" ); @@ -218,7 +210,7 @@ void signup_whenValidSignupToken_thenExtractOauth2IdCorrectly() throws Exception void signup_whenNoToken_thenUnauthorized() throws Exception { //given: aliasId null UserSignupRequest request = new UserSignupRequest( - 1L, + "문학가", "테스트유저" ); diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java index 8afcd9bf8..69b2a9c84 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.user.adapter.in.web.request.UserVerifyNicknameRequest; import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; @@ -76,12 +77,7 @@ void verify_nickname_true() throws Exception { @DisplayName("[닉네임]값이 이미 DB에 존재하는 경우, false를 반환한다.") void verify_nickname_false() throws Exception { //given: DB에 "테스트유저" 생성 - AliasJpaEntity aliasJpaEntity = AliasJpaEntity.builder() - .value("칭호") - .color("blue") - .imageUrl("http://image.url") - .build(); - aliasJpaRepository.save(aliasJpaEntity); + AliasJpaEntity aliasJpaEntity = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity userJpaEntity = UserJpaEntity.builder() .nickname("테스트유저") diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java index 15c999bf6..3f73a4610 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.persistence.CategoryJpaRepository; import konkuk.thip.user.adapter.in.web.response.UserViewAliasChoiceResponse; @@ -73,36 +74,16 @@ void show_alias_choice_view() throws Exception { assertThat(choices) .extracting("aliasName", "categoryName", "imageUrl", "color") .containsExactlyInAnyOrder( - tuple("문학가", "문학", "문학가_image", "red"), - tuple("과학자", "과학/IT", "과학자_image", "blue") + tuple("문학가", "문학", "문학_image", "문학_color"), + tuple("과학자", "과학/IT", "과학_image", "과학_color") ); } private void saveAliasesAndCategories() { - AliasJpaEntity alias1 = AliasJpaEntity.builder() - .value("문학가") - .imageUrl("문학가_image") - .color("red") - .build(); - aliasJpaRepository.save(alias1); - - CategoryJpaEntity category1 = CategoryJpaEntity.builder() - .value("문학") - .aliasForCategoryJpaEntity(alias1) - .build(); - categoryJpaRepository.save(category1); - - AliasJpaEntity alias2 = AliasJpaEntity.builder() - .value("과학자") - .imageUrl("과학자_image") - .color("blue") - .build(); - aliasJpaRepository.save(alias2); - - CategoryJpaEntity category2 = CategoryJpaEntity.builder() - .value("과학/IT") - .aliasForCategoryJpaEntity(alias2) - .build(); - categoryJpaRepository.save(category2); + AliasJpaEntity alias1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + CategoryJpaEntity category1 = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias1)); + + AliasJpaEntity alias2 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + CategoryJpaEntity category2 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias2)); } } diff --git a/src/test/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntityTest.java b/src/test/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntityTest.java index ffd06ca78..c316f8de8 100644 --- a/src/test/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntityTest.java +++ b/src/test/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntityTest.java @@ -33,7 +33,7 @@ class UserJpaEntityTest { @DisplayName("UserJpaEntity 저장 및 조회 테스트") void saveAndFindUser() { // given - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createAlias()); + AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); UserJpaEntity user = userRepository.save(TestEntityFactory.createUser(alias)); // when @@ -44,7 +44,7 @@ void saveAndFindUser() { // then assertThat(foundUser.getNickname()).isEqualTo("테스터"); - assertThat(foundUser.getAliasForUserJpaEntity().getValue()).isEqualTo("칭호"); + assertThat(foundUser.getAliasForUserJpaEntity().getValue()).isEqualTo("문학가"); assertThat(foundUser.getRole()).isEqualTo(UserRole.USER); } } \ No newline at end of file