diff --git a/src/main/java/konkuk/thip/comment/adapter/out/persistence/repository/CommentQueryRepositoryImpl.java b/src/main/java/konkuk/thip/comment/adapter/out/persistence/repository/CommentQueryRepositoryImpl.java index e0029ec58..89ea08f02 100644 --- a/src/main/java/konkuk/thip/comment/adapter/out/persistence/repository/CommentQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/comment/adapter/out/persistence/repository/CommentQueryRepositoryImpl.java @@ -7,7 +7,6 @@ import konkuk.thip.comment.application.port.out.dto.CommentQueryDto; import konkuk.thip.comment.application.port.out.dto.QCommentQueryDto; import konkuk.thip.common.entity.StatusType; -import konkuk.thip.user.adapter.out.jpa.QAliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.QUserJpaEntity; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -24,7 +23,6 @@ public class CommentQueryRepositoryImpl implements CommentQueryRepository { private final QCommentJpaEntity comment = QCommentJpaEntity.commentJpaEntity; private final QUserJpaEntity commentCreator = QUserJpaEntity.userJpaEntity; - private final QAliasJpaEntity aliasOfCommentCreator = QAliasJpaEntity.aliasJpaEntity; private final QCommentJpaEntity parentComment = new QCommentJpaEntity("parentComment"); private final QUserJpaEntity parentCommentCreator = new QUserJpaEntity("parentCommentCreator"); @@ -34,10 +32,8 @@ public List findRootCommentsWithDeletedByCreatedAtDesc(Long pos QCommentQueryDto proj = new QCommentQueryDto( comment.commentId, commentCreator.userId, - aliasOfCommentCreator.imageUrl, + commentCreator.alias, commentCreator.nickname, - aliasOfCommentCreator.value, - aliasOfCommentCreator.color, comment.createdAt, comment.content, comment.likeCount, @@ -58,7 +54,6 @@ public List findRootCommentsWithDeletedByCreatedAtDesc(Long pos .select(proj) .from(comment) .leftJoin(comment.userJpaEntity, commentCreator) - .leftJoin(commentCreator.aliasForUserJpaEntity, aliasOfCommentCreator) .where(whereClause) .orderBy(comment.createdAt.desc()) .limit(size + 1) // size + 1 개 조회 @@ -79,10 +74,8 @@ public List findAllActiveChildCommentsByCreatedAtAsc(Long rootC comment.parent.commentId, parentCommentCreator.nickname, commentCreator.userId, - aliasOfCommentCreator.imageUrl, + commentCreator.alias, commentCreator.nickname, - aliasOfCommentCreator.value, - aliasOfCommentCreator.color, comment.createdAt, comment.content, comment.likeCount, @@ -97,7 +90,6 @@ public List findAllActiveChildCommentsByCreatedAtAsc(Long rootC .leftJoin(comment.parent, parentComment) .leftJoin(parentComment.userJpaEntity, parentCommentCreator) .leftJoin(comment.userJpaEntity, commentCreator) - .leftJoin(commentCreator.aliasForUserJpaEntity, aliasOfCommentCreator) .where( comment.parent.commentId.in(parentIds), // parentIds 하위의 모든 자식 댓글 조회 comment.status.eq(StatusType.ACTIVE) // 자식 댓글은 ACTIVE인 것만 조회 @@ -141,10 +133,8 @@ public Map> findAllActiveChildCommentsByCreatedAtAsc comment.parent.commentId, parentCommentCreator.nickname, commentCreator.userId, - aliasOfCommentCreator.imageUrl, + commentCreator.alias, commentCreator.nickname, - aliasOfCommentCreator.value, - aliasOfCommentCreator.color, comment.createdAt, comment.content, comment.likeCount, @@ -159,7 +149,6 @@ public Map> findAllActiveChildCommentsByCreatedAtAsc .leftJoin(comment.parent, parentComment) .leftJoin(parentComment.userJpaEntity, parentCommentCreator) .leftJoin(comment.userJpaEntity, commentCreator) - .leftJoin(commentCreator.aliasForUserJpaEntity, aliasOfCommentCreator) .where( comment.parent.commentId.in(parentIds), // parentIds 하위의 모든 자식 댓글 조회 comment.status.eq(StatusType.ACTIVE) // 자식 댓글은 ACTIVE인 것만 조회 @@ -193,10 +182,8 @@ public CommentQueryDto findRootCommentId(Long rootCommentId) { QCommentQueryDto proj = new QCommentQueryDto( comment.commentId, commentCreator.userId, - aliasOfCommentCreator.imageUrl, + commentCreator.alias, commentCreator.nickname, - aliasOfCommentCreator.value, - aliasOfCommentCreator.color, comment.createdAt, comment.content, comment.likeCount, @@ -207,7 +194,6 @@ public CommentQueryDto findRootCommentId(Long rootCommentId) { .select(proj) .from(comment) .join(comment.userJpaEntity, commentCreator) - .join(commentCreator.aliasForUserJpaEntity, aliasOfCommentCreator) .where( comment.commentId.eq(rootCommentId), comment.status.eq(StatusType.ACTIVE) @@ -223,10 +209,8 @@ public CommentQueryDto findChildCommentId(Long rootCommentId, Long replyCommentI comment.parent.commentId, parentCommentCreator.nickname, commentCreator.userId, - aliasOfCommentCreator.imageUrl, + commentCreator.alias, commentCreator.nickname, - aliasOfCommentCreator.value, - aliasOfCommentCreator.color, comment.createdAt, comment.content, comment.likeCount, @@ -239,7 +223,6 @@ public CommentQueryDto findChildCommentId(Long rootCommentId, Long replyCommentI .join(comment.parent, parentComment) .join(parentComment.userJpaEntity, parentCommentCreator) .join(comment.userJpaEntity, commentCreator) - .join(commentCreator.aliasForUserJpaEntity, aliasOfCommentCreator) .where( comment.parent.commentId.eq(rootCommentId), parentComment.status.eq(StatusType.ACTIVE), diff --git a/src/main/java/konkuk/thip/comment/application/port/out/dto/CommentQueryDto.java b/src/main/java/konkuk/thip/comment/application/port/out/dto/CommentQueryDto.java index 05475f02a..79194d84d 100644 --- a/src/main/java/konkuk/thip/comment/application/port/out/dto/CommentQueryDto.java +++ b/src/main/java/konkuk/thip/comment/application/port/out/dto/CommentQueryDto.java @@ -2,6 +2,7 @@ import com.querydsl.core.annotations.QueryProjection; import jakarta.annotation.Nullable; +import konkuk.thip.user.domain.value.Alias; import java.time.LocalDateTime; @@ -23,7 +24,22 @@ public record CommentQueryDto( * child comment */ @QueryProjection - public CommentQueryDto {} + public CommentQueryDto ( + Long commentId, + Long parentCommentId, + String parentCommentCreatorNickname, + Long creatorId, + Alias creatorAlias, + String creatorNickname, + LocalDateTime createdAt, // 댓글 작성 시각 + String content, + int likeCount, + Boolean isDeleted + ) { + this(commentId, parentCommentId, parentCommentCreatorNickname, creatorId, creatorAlias.getImageUrl(), + creatorNickname, creatorAlias.getValue(), creatorAlias.getColor(), + createdAt, content, likeCount, isDeleted); + } /** * root comment @@ -32,16 +48,15 @@ public record CommentQueryDto( public CommentQueryDto ( Long commentId, Long creatorId, - String creatorProfileImageUrl, + Alias creatorAlias, String creatorNickname, - String alias, - String aliasColor, LocalDateTime createdAt, // 댓글 작성 시각 String content, int likeCount, boolean isDeleted ) { - this(commentId, null, null, creatorId, creatorProfileImageUrl, creatorNickname, - alias, aliasColor, createdAt, content, likeCount, isDeleted); + this(commentId, null, null, creatorId, creatorAlias.getImageUrl(), + creatorNickname, creatorAlias.getValue(), creatorAlias.getColor(), + createdAt, content, likeCount, isDeleted); } } 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 5d6c48954..262fc5311 100644 --- a/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java +++ b/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java @@ -159,11 +159,15 @@ public enum ErrorCode implements ResponseCode { FEED_ALREADY_SAVED(HttpStatus.BAD_REQUEST, 160006, "사용자가 이미 저장한 피드입니다."), FEED_NOT_SAVED_CANNOT_DELETE(HttpStatus.BAD_REQUEST, 160007, "사용자가 저장하지 않은 피드는 저장삭제 할 수 없습니다."), FEED_CAN_NOT_SHOW_PRIVATE_ONE(HttpStatus.BAD_REQUEST, 160008, "비공개 피드는 피드 작성자 이외에는 조회할 수 없습니다."), + TAG_SHOULD_BE_UNIQUE(HttpStatus.BAD_REQUEST, 160009, "피드에 등록된 태그는 중복될 수 없습니다."), + TAG_LIST_SIZE_OVERFLOW(HttpStatus.BAD_REQUEST, 160010, "등록 가능한 태그 개수를 초과하였습니다."), + /** * 165000: ContentList error */ CONTENT_LIST_SIZE_OVERFLOW(HttpStatus.BAD_REQUEST, 165000, "컨텐츠 리스트의 크기가 초과되었습니다. 최대 3개까지 가능합니다."), + CONTENT_NOT_FOUND(HttpStatus.BAD_REQUEST, 165001, "해당 이미지는 이 피드에 존재하지 않습니다:"), /** * 170000 : Image File error diff --git a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java index 6d4b5aa78..97250b4f7 100644 --- a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java +++ b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java @@ -180,7 +180,9 @@ public enum SwaggerResponseDescription { BOOK_NOT_FOUND, TAG_NOT_FOUND, TAG_NAME_NOT_MATCH, - INVALID_FEED_COMMAND, + CONTENT_LIST_SIZE_OVERFLOW, + TAG_SHOULD_BE_UNIQUE, + TAG_LIST_SIZE_OVERFLOW, BOOK_NAVER_API_PARSING_ERROR, BOOK_NAVER_API_ISBN_NOT_FOUND, EMPTY_FILE_EXCEPTION, @@ -193,7 +195,9 @@ public enum SwaggerResponseDescription { BOOK_NOT_FOUND, TAG_NOT_FOUND, TAG_NAME_NOT_MATCH, - INVALID_FEED_COMMAND, + CONTENT_LIST_SIZE_OVERFLOW, + TAG_SHOULD_BE_UNIQUE, + TAG_LIST_SIZE_OVERFLOW, FEED_ACCESS_FORBIDDEN ))), CHANGE_FEED_SAVED_STATE(new LinkedHashSet<>(Set.of( diff --git a/src/main/java/konkuk/thip/common/util/EnumMappings.java b/src/main/java/konkuk/thip/common/util/EnumMappings.java new file mode 100644 index 000000000..7a78cbac2 --- /dev/null +++ b/src/main/java/konkuk/thip/common/util/EnumMappings.java @@ -0,0 +1,117 @@ +package konkuk.thip.common.util; + +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.room.domain.value.Category; +import konkuk.thip.user.domain.value.Alias; + +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +public final class EnumMappings { + + private EnumMappings() {} + + private static final Map aliasToCategory; + private static final Map> categoryToTags; + + // 역방향 인덱스 + private static final Map categoryToAlias; + private static final Map tagToCategory; + + static { + // Alias -> Category + EnumMap a2c = new EnumMap<>(Alias.class); + a2c.put(Alias.WRITER, Category.LITERATURE); // 문학가 + a2c.put(Alias.SCIENTIST, Category.SCIENCE_IT); // 과학자 + a2c.put(Alias.SOCIOLOGIST, Category.SOCIAL_SCIENCE); // 사회학 + a2c.put(Alias.ARTIST, Category.ART); // 예술가 + a2c.put(Alias.PHILOSOPHER, Category.HUMANITY); // 철학자 + aliasToCategory = Collections.unmodifiableMap(a2c); + + // Category -> Tags + EnumMap> c2t = new EnumMap<>(Category.class); + c2t.put(Category.LITERATURE, List.of( // 문학 + Tag.KOREAN_NOVEL, Tag.FOREIGN_NOVEL, Tag.CLASSIC_LITERATURE, Tag.ESSAY, Tag.POETRY, + Tag.PLAY, Tag.DETECTIVE_NOVEL, Tag.FANTASY_NOVEL, Tag.ROMANCE_NOVEL, Tag.LITERARY_THEORY + )); + c2t.put(Category.SCIENCE_IT, List.of( // 과학·IT + Tag.GENERAL_SCIENCE, Tag.PHYSICS, Tag.CHEMISTRY, Tag.BIOLOGY, Tag.ASTRONOMY, + Tag.EARTH_SCIENCE, Tag.MATHEMATICS, Tag.GENERAL_ENGINEERING, + Tag.COMPUTER_ENGINEERING, Tag.PROGRAMMING, Tag.IT_GENERAL + )); + c2t.put(Category.SOCIAL_SCIENCE, List.of( // 사회과학 + Tag.SOCIOLOGY, Tag.LAW, Tag.GENERAL_POLITICS, Tag.POLITICAL_SCIENCE, + Tag.ECONOMICS, Tag.BUSINESS_ADMIN, Tag.JURISPRUDENCE, Tag.EDUCATION, + Tag.PSYCHOLOGY, Tag.MEDIA, Tag.INTERNATIONAL_RELATIONS, Tag.SOCIAL_ISSUES, + Tag.MARKETING, Tag.INVESTMENT, Tag.STARTUP, Tag.GENERAL_ECONOMY + )); + c2t.put(Category.HUMANITY, List.of( // 인문학 + Tag.PHILOSOPHY, Tag.HISTORY, Tag.RELIGION, Tag.CLASSICS, Tag.LINGUISTICS, + Tag.CULTURAL_ANTHROPOLOGY, Tag.HUMANISTIC_ESSAY, Tag.EASTERN_PHILOSOPHY, + Tag.WESTERN_PHILOSOPHY, Tag.WORLD_HISTORY, Tag.KOREAN_HISTORY, + Tag.HISTORICAL_ESSAY, Tag.ANCIENT_HISTORY, Tag.MODERN_HISTORY + )); + c2t.put(Category.ART, List.of( + Tag.ART, Tag.MUSIC, Tag.MOVIE, Tag.PHOTO, Tag.DANCE, + Tag.THEATER, Tag.DESIGN, Tag.ARCHITECTURE, Tag.GENERAL_ART + )); + categoryToTags = Collections.unmodifiableMap(c2t); + + // ------------역방향 인덱스------------ + // Category -> Alias + EnumMap c2a = new EnumMap<>(Category.class); + aliasToCategory.forEach((alias, category) -> { + Alias prev = c2a.put(category, alias); + if (prev != null && prev != alias) { + throw new IllegalStateException("Category에 두 개 이상의 Alias 매핑: " + category); + } + }); + categoryToAlias = Collections.unmodifiableMap(c2a); + + // Tag -> Category (각 Tag는 정확히 하나의 Category) + EnumMap t2c = new EnumMap<>(Tag.class); + categoryToTags.forEach((category, tags) -> { + for (Tag tag : tags) { + Category prev = t2c.put(tag, category); + if (prev != null && prev != category) { + throw new IllegalStateException( + "Tag가 둘 이상의 Category에 매핑됨: " + tag + " (" + prev + " vs " + category + ")" + ); + } + } + }); + tagToCategory = Collections.unmodifiableMap(t2c); + } + + // ----------- Public API ----------- + + /** Alias -> Category */ + public static Category categoryFrom(Alias alias) { + return aliasToCategory.get(alias); + } + + /** Category -> Tags */ + public static List tagsFrom(Category category) { + return categoryToTags.getOrDefault(category, List.of()); + } + + /** Category -> Alias */ + public static Alias aliasFrom(Category category) { + return categoryToAlias.get(category); + } + + /** Tag -> Category */ + public static Category categoryFrom(Tag tag) { + return tagToCategory.get(tag); + } + + public static Map> getCategoryToTags() { + return Collections.unmodifiableMap(categoryToTags); + } + + public static Map getAliasToCategory() { + return Collections.unmodifiableMap(aliasToCategory); + } +} diff --git a/src/main/java/konkuk/thip/config/AwsS3ImageUrlInitializer.java b/src/main/java/konkuk/thip/config/AwsS3ImageUrlInitializer.java index 8bb3ab9ec..0f0ffd5a5 100644 --- a/src/main/java/konkuk/thip/config/AwsS3ImageUrlInitializer.java +++ b/src/main/java/konkuk/thip/config/AwsS3ImageUrlInitializer.java @@ -3,8 +3,8 @@ import jakarta.annotation.PostConstruct; import konkuk.thip.common.exception.BusinessException; import konkuk.thip.config.properties.AwsS3Properties; -import konkuk.thip.room.domain.Category; -import konkuk.thip.user.domain.Alias; +import konkuk.thip.room.domain.value.Category; +import konkuk.thip.user.domain.value.Alias; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/src/main/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntity.java b/src/main/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntity.java index 07d492724..e52ef1774 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntity.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntity.java @@ -5,7 +5,9 @@ import jakarta.persistence.*; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.feed.adapter.out.jpa.converter.ContentListJsonConverter; +import konkuk.thip.feed.adapter.out.jpa.converter.TagListJsonConverter; import konkuk.thip.feed.domain.Feed; +import konkuk.thip.feed.domain.value.TagList; import konkuk.thip.feed.domain.value.ContentList; import konkuk.thip.post.adapter.out.jpa.PostJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; @@ -36,24 +38,25 @@ public class FeedJpaEntity extends PostJpaEntity { // JSON 문자열로 저장되는 단일 컬럼 @Convert(converter = ContentListJsonConverter.class) - @Column(name = "content_list", columnDefinition = "TEXT", nullable = false) + @Column(name = "content_list", columnDefinition = "TEXT") private ContentList contentList = ContentList.empty(); // 삭제용 피드 저장 양방향 매핑 관계 @OneToMany(mappedBy = "feedJpaEntity", cascade = CascadeType.REMOVE, orphanRemoval = true) private List savedFeeds = new ArrayList<>(); - // 삭제용 피드 태그 양방향 매핑 관계 - @OneToMany(mappedBy = "feedJpaEntity", cascade = CascadeType.REMOVE, orphanRemoval = true) - private List feedTags = new ArrayList<>(); + @Column(name = "tag_list", columnDefinition = "TEXT") + @Convert(converter = TagListJsonConverter.class) + private TagList tagList = TagList.empty(); @Builder - public FeedJpaEntity(String content, Integer likeCount, Integer commentCount, UserJpaEntity userJpaEntity, Boolean isPublic, int reportCount, BookJpaEntity bookJpaEntity, ContentList contentList) { + public FeedJpaEntity(String content, Integer likeCount, Integer commentCount, UserJpaEntity userJpaEntity, Boolean isPublic, int reportCount, BookJpaEntity bookJpaEntity, ContentList contentList, TagList tagList) { super(content, likeCount, commentCount, userJpaEntity); this.isPublic = isPublic; this.reportCount = reportCount; this.bookJpaEntity = bookJpaEntity; - if(contentList != null) this.contentList = contentList; + this.contentList = contentList != null ? contentList : ContentList.empty(); + this.tagList = tagList != null ? tagList : TagList.empty(); } public void updateFrom(Feed feed) { @@ -63,6 +66,7 @@ public void updateFrom(Feed feed) { this.likeCount = feed.getLikeCount(); this.commentCount = feed.getCommentCount(); this.contentList = feed.getContentList(); + this.tagList = feed.getTagList(); } @VisibleForTesting 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 deleted file mode 100644 index 3f7f27d38..000000000 --- a/src/main/java/konkuk/thip/feed/adapter/out/jpa/FeedTagJpaEntity.java +++ /dev/null @@ -1,26 +0,0 @@ -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/jpa/TagJpaEntity.java b/src/main/java/konkuk/thip/feed/adapter/out/jpa/TagJpaEntity.java deleted file mode 100644 index 23c4ed2a5..000000000 --- a/src/main/java/konkuk/thip/feed/adapter/out/jpa/TagJpaEntity.java +++ /dev/null @@ -1,27 +0,0 @@ -package konkuk.thip.feed.adapter.out.jpa; - -import jakarta.persistence.*; -import konkuk.thip.common.entity.BaseJpaEntity; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import lombok.*; - -@Entity -@Table(name = "tags") -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Builder -public class TagJpaEntity extends BaseJpaEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "tag_id") - private Long tagId; - - @Column(name = "tag_value",length = 50, nullable = false) - private String value; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "category_id", nullable = false) - private CategoryJpaEntity categoryJpaEntity; -} \ No newline at end of file diff --git a/src/main/java/konkuk/thip/feed/adapter/out/jpa/converter/TagListJsonConverter.java b/src/main/java/konkuk/thip/feed/adapter/out/jpa/converter/TagListJsonConverter.java new file mode 100644 index 000000000..ea4a4fa56 --- /dev/null +++ b/src/main/java/konkuk/thip/feed/adapter/out/jpa/converter/TagListJsonConverter.java @@ -0,0 +1,45 @@ +package konkuk.thip.feed.adapter.out.jpa.converter; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.feed.domain.value.TagList; + +import java.io.IOException; +import java.util.List; + +@Converter(autoApply = true) +public class TagListJsonConverter implements AttributeConverter { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public String convertToDatabaseColumn(TagList attribute) { + try { + List tagNames = attribute == null ? List.of() : + attribute.toUnmodifiableList().stream() + .map(Tag::name) // Enum 이름 사용 + .toList(); + return objectMapper.writeValueAsString(tagNames); + } catch (JsonProcessingException e) { + throw new IllegalStateException("TagList 직렬화 실패", e); + } + } + + @Override + public TagList convertToEntityAttribute(String dbData) { + if (dbData == null || dbData.isBlank()) return TagList.of(List.of()); + try { + List names = objectMapper.readValue( + dbData, + objectMapper.getTypeFactory().constructCollectionType(List.class, String.class) + ); + List tags = names.stream().map(Tag::valueOf).toList(); + return TagList.of(tags); + } catch (IOException e) { + throw new IllegalStateException("TagList 역직렬화 실패", e); + } + } +} \ No newline at end of file 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 5e15bbc96..b6ec58859 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,16 +2,13 @@ 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.feed.domain.value.ContentList; +import konkuk.thip.feed.domain.value.TagList; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; +import konkuk.thip.feed.domain.value.ContentList; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import java.util.List; - @Component @RequiredArgsConstructor public class FeedMapper { @@ -26,10 +23,11 @@ public FeedJpaEntity toJpaEntity(Feed feed, UserJpaEntity userJpaEntity, BookJpa .commentCount(feed.getCommentCount()) .bookJpaEntity(bookJpaEntity) .contentList(feed.getContentList() != null ? feed.getContentList() : ContentList.empty()) + .tagList(feed.getTagList() != null ? feed.getTagList() : TagList.empty()) .build(); } - public Feed toDomainEntity(FeedJpaEntity feedJpaEntity, List tagJpaEntityList) { + public Feed toDomainEntity(FeedJpaEntity feedJpaEntity) { return Feed.builder() .id(feedJpaEntity.getPostId()) .content(feedJpaEntity.getContent()) @@ -39,10 +37,7 @@ public Feed toDomainEntity(FeedJpaEntity feedJpaEntity, List tagJp .likeCount(feedJpaEntity.getLikeCount()) .commentCount(feedJpaEntity.getCommentCount()) .targetBookId(feedJpaEntity.getBookJpaEntity().getBookId()) - .tagList(tagJpaEntityList.stream() - .map(TagJpaEntity::getValue) - .map(Tag::from) - .toList()) + .tagList(feedJpaEntity.getTagList()) .contentList(feedJpaEntity.getContentList() != null ? feedJpaEntity.getContentList() : ContentList.empty()) .createdAt(feedJpaEntity.getCreatedAt()) .modifiedAt(feedJpaEntity.getModifiedAt()) diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedCommandPersistenceAdapter.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedCommandPersistenceAdapter.java index 15b582bec..5d7a96a66 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedCommandPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedCommandPersistenceAdapter.java @@ -3,24 +3,17 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.exception.EntityNotFoundException; -import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.FeedTagJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.SavedFeedJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; +import konkuk.thip.feed.adapter.out.jpa.*; import konkuk.thip.feed.adapter.out.mapper.FeedMapper; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.FeedTag.FeedTagJpaRepository; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.Tag.TagJpaRepository; import konkuk.thip.feed.application.port.out.FeedCommandPort; import konkuk.thip.feed.domain.Feed; -import konkuk.thip.feed.domain.Tag; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; -import java.util.List; import java.util.Optional; import static konkuk.thip.common.entity.StatusType.ACTIVE; @@ -33,8 +26,6 @@ public class FeedCommandPersistenceAdapter implements FeedCommandPort { private final FeedJpaRepository feedJpaRepository; private final UserJpaRepository userJpaRepository; private final BookJpaRepository bookJpaRepository; - private final TagJpaRepository tagJpaRepository; - private final FeedTagJpaRepository feedTagJpaRepository; private final SavedFeedJpaRepository savedFeedJpaRepository; private final FeedMapper feedMapper; @@ -42,10 +33,7 @@ public class FeedCommandPersistenceAdapter implements FeedCommandPort { @Override public Optional findById(Long id) { return feedJpaRepository.findByPostIdAndStatus(id,ACTIVE) - .map(feedJpaEntity -> { - List tagJpaEntityList = tagJpaRepository.findAllByFeedId(feedJpaEntity.getPostId()); - return feedMapper.toDomainEntity(feedJpaEntity, tagJpaEntityList); - }); + .map(feedMapper::toDomainEntity); } @@ -66,7 +54,7 @@ public Long save(Feed feed) { // // Content가 존재하면 ContentJpaEntity 생성 및 Feed 연관관계 설정 // applyFeedContents(feed, savedFeed); // 태그가 존재하면 태그 피드 매핑 생성 및 저장 - applyFeedTags(feed, savedFeed); +// applyFeedTags(feed, savedFeed); return savedFeed.getPostId(); } @@ -79,28 +67,13 @@ public Long update(Feed feed) { // feedJpaEntity.replaceContentList(feed.getContentList()); // 피드 수정시 기존 영속성 컨텍스트 내 엔티티 연결 제거 // applyFeedContents(feed, feedJpaEntity); - - feedTagJpaRepository.deleteAllByFeedId(feedJpaEntity.getPostId()); // 피드 수정시 기존 피드의 모든 FeedTag 매핑 row 삭제 - applyFeedTags(feed, feedJpaEntity); +// +// feedTagJpaRepository.deleteAllByFeedId(feedJpaEntity.getPostId()); // 피드 수정시 기존 피드의 모든 FeedTag 매핑 row 삭제 +// applyFeedTags(feed, feedJpaEntity); return feedJpaEntity.getPostId(); } - private void applyFeedTags(Feed feed, FeedJpaEntity feedJpaEntity) { - if (feed.getTagList().isEmpty()) return; - for (Tag tag : feed.getTagList()) { - TagJpaEntity tagJpaEntity = tagJpaRepository.findByValue(tag.getValue()) - .orElseThrow(() -> new EntityNotFoundException(TAG_NOT_FOUND)); - - FeedTagJpaEntity feedTagJpaEntity = FeedTagJpaEntity.builder() - .feedJpaEntity(feedJpaEntity) - .tagJpaEntity(tagJpaEntity) - .build(); - - feedTagJpaRepository.save(feedTagJpaEntity); - } - } - @Override public void saveSavedFeed(Long userId, Long feedId) { UserJpaEntity user = userJpaRepository.findById(userId) @@ -124,7 +97,6 @@ public void delete(Feed feed) { FeedJpaEntity feedJpaEntity = feedJpaRepository.findByPostIdAndStatus(feed.getId(),ACTIVE) .orElseThrow(() -> new EntityNotFoundException(FEED_NOT_FOUND)); - feedTagJpaRepository.deleteAllByFeedId(feedJpaEntity.getPostId()); savedFeedJpaRepository.deleteAllByFeedId(feedJpaEntity.getPostId()); feedJpaEntity.softDelete(); diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedQueryPersistenceAdapter.java index 54de7ad26..560170d35 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedQueryPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedQueryPersistenceAdapter.java @@ -5,10 +5,8 @@ import konkuk.thip.common.util.CursorBasedList; import konkuk.thip.feed.adapter.out.mapper.FeedMapper; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.FeedTag.FeedTagJpaRepository; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; import konkuk.thip.feed.application.port.out.FeedQueryPort; -import konkuk.thip.feed.application.port.out.dto.TagCategoryQueryDto; import konkuk.thip.feed.application.port.out.dto.FeedQueryDto; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import lombok.RequiredArgsConstructor; @@ -23,7 +21,6 @@ public class FeedQueryPersistenceAdapter implements FeedQueryPort { private final FeedJpaRepository feedJpaRepository; - private final FeedTagJpaRepository feedTagJpaRepository; private final UserJpaRepository userJpaRepository; private final SavedFeedJpaRepository savedFeedJpaRepository; private final FeedMapper feedMapper; @@ -122,11 +119,6 @@ public CursorBasedList findSavedFeedsByCreatedAt(Long userId, Curs }); } - @Override - public List findAllTags() { - return feedJpaRepository.findAllTags(); - } - @Override public CursorBasedList findFeedsByBookIsbnOrderByLike(String isbn, Long userId, Cursor cursor) { LocalDateTime lastCreatedAt = cursor.isFirstRequest() ? null : cursor.getLocalDateTime(0); diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepository.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepository.java index c2588f32c..e6321fb01 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepository.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepository.java @@ -18,8 +18,6 @@ public interface FeedQueryRepository { List findSpecificUserFeedsByCreatedAt(Long feedOwnerId, LocalDateTime lastCreatedAt, int size); - List findAllTags(); - List findFeedsByBookIsbnOrderByLikeCount(String isbn, Long userId, LocalDateTime lastCreatedAt, Integer lastLikeCount, int size); List findFeedsByBookIsbnOrderByCreatedAt(String isbn, Long userId, LocalDateTime lastCreatedAt, int size); diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java index dc1c3f8c5..d9c70715d 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java @@ -1,8 +1,10 @@ package konkuk.thip.feed.adapter.out.persistence.repository; import com.querydsl.core.Tuple; -import com.querydsl.core.types.dsl.*; -import com.querydsl.jpa.JPAExpressions; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.CaseBuilder; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.annotation.Nullable; import konkuk.thip.book.adapter.out.jpa.QBookJpaEntity; @@ -10,13 +12,8 @@ import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.jpa.QFeedJpaEntity; import konkuk.thip.feed.adapter.out.jpa.QSavedFeedJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.QTagJpaEntity; import konkuk.thip.feed.application.port.out.dto.FeedQueryDto; import konkuk.thip.feed.application.port.out.dto.QFeedQueryDto; -import konkuk.thip.feed.application.port.out.dto.QTagCategoryQueryDto; -import konkuk.thip.feed.application.port.out.dto.TagCategoryQueryDto; -import konkuk.thip.room.adapter.out.jpa.QCategoryJpaEntity; -import konkuk.thip.user.adapter.out.jpa.QAliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.QFollowingJpaEntity; import konkuk.thip.user.adapter.out.jpa.QUserJpaEntity; import lombok.RequiredArgsConstructor; @@ -37,7 +34,6 @@ public class FeedQueryRepositoryImpl implements FeedQueryRepository { private final QFeedJpaEntity feed = QFeedJpaEntity.feedJpaEntity; private final QUserJpaEntity user = QUserJpaEntity.userJpaEntity; - private final QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; private final QBookJpaEntity book = QBookJpaEntity.bookJpaEntity; private final QFollowingJpaEntity following = QFollowingJpaEntity.followingJpaEntity; private final QSavedFeedJpaEntity savedFeed = QSavedFeedJpaEntity.savedFeedJpaEntity; @@ -173,7 +169,6 @@ private List fetchFeedEntitiesByIds(List ids) { .select(feed).distinct() .from(feed) .leftJoin(feed.userJpaEntity, user).fetchJoin() - .leftJoin(user.aliasForUserJpaEntity, alias).fetchJoin() .leftJoin(feed.bookJpaEntity, book).fetchJoin() .where(feed.postId.in(ids)) .fetch(); @@ -217,18 +212,6 @@ public List findSpecificUserFeedsByCreatedAt(Long feedOwnerId, Loc .toList(); } - @Override - public List findAllTags() { - QCategoryJpaEntity c = QCategoryJpaEntity.categoryJpaEntity; - QTagJpaEntity t = QTagJpaEntity.tagJpaEntity; - - return jpaQueryFactory - .select(new QTagCategoryQueryDto(c.value, t.value)) - .from(c) - .join(t).on(t.categoryJpaEntity.eq(c)) - .orderBy(c.categoryId.asc(), t.tagId.asc()) //Id 순 정렬 - .fetch(); - } private List fetchMyFeedIdsByCreatedAt(Long userId, LocalDateTime lastCreatedAt, int size) { return jpaQueryFactory .select(feed.postId) @@ -267,8 +250,8 @@ private FeedQueryDto toDto(FeedJpaEntity f, Integer priority) { .feedId(f.getPostId()) .creatorId(f.getUserJpaEntity().getUserId()) .creatorNickname(f.getUserJpaEntity().getNickname()) - .creatorProfileImageUrl(f.getUserJpaEntity().getAliasForUserJpaEntity().getImageUrl()) // TODO : DB에 String alias 만 저장하면 수정해야함 - .alias(f.getUserJpaEntity().getAliasForUserJpaEntity().getValue()) + .creatorProfileImageUrl(f.getUserJpaEntity().getAlias().getImageUrl()) // TODO : DB에 String alias 만 저장하면 수정해야함 + .alias(f.getUserJpaEntity().getAlias().getValue()) .createdAt(f.getCreatedAt()) .isbn(f.getBookJpaEntity().getIsbn()) .bookTitle(f.getBookJpaEntity().getTitle()) @@ -348,8 +331,7 @@ private QFeedQueryDto toQueryDto() { feed.postId, feed.userJpaEntity.userId, user.nickname, - user.aliasForUserJpaEntity.imageUrl, - user.aliasForUserJpaEntity.value, + user.alias, feed.createdAt, book.isbn, book.title, @@ -364,7 +346,7 @@ private QFeedQueryDto toQueryDto() { ); } - // 필터링 조건: 책 ISBN과 사용자 ID를 제외한 다른 사용자 공개 피드 + // 필터링 조건: 책 ISBN & 공개 피드 private BooleanExpression feedByBooksFilter(String isbn, Long userId) { return feed.status.eq(StatusType.ACTIVE) .and(feed.bookJpaEntity.isbn.eq(isbn)) @@ -422,8 +404,7 @@ private QFeedQueryDto toSavedFeedQueryDto() { feed.postId, feed.userJpaEntity.userId, user.nickname, - user.aliasForUserJpaEntity.imageUrl, - user.aliasForUserJpaEntity.value, + user.alias, feed.createdAt, book.isbn, book.title, diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedTag/FeedTagJpaRepository.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedTag/FeedTagJpaRepository.java deleted file mode 100644 index 84f860857..000000000 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedTag/FeedTagJpaRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package konkuk.thip.feed.adapter.out.persistence.repository.FeedTag; - -import konkuk.thip.feed.adapter.out.jpa.FeedTagJpaEntity; -import konkuk.thip.feed.application.port.out.dto.FeedIdAndTagProjection; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public interface FeedTagJpaRepository extends JpaRepository{ - - @Query(""" - SELECT ft.feedJpaEntity.postId as feedId, ft.tagJpaEntity as tagJpaEntity - FROM FeedTagJpaEntity ft - WHERE ft.feedJpaEntity.postId IN :feedIds - """) - List findFeedIdAndTagsByFeedIds(@Param("feedIds") List feedIds); - - @Modifying(clearAutomatically = true, flushAutomatically = true) - @Query("DELETE FROM FeedTagJpaEntity ft WHERE ft.feedJpaEntity.postId = :feedId") - void deleteAllByFeedId(@Param("feedId") Long feedId); -} diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/Tag/TagJpaRepository.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/Tag/TagJpaRepository.java deleted file mode 100644 index 176244ecd..000000000 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/Tag/TagJpaRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package konkuk.thip.feed.adapter.out.persistence.repository.Tag; - -import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; -import java.util.Optional; - -public interface TagJpaRepository extends JpaRepository{ - Optional findByValue(String value); - - @Query("SELECT ft.tagJpaEntity FROM FeedTagJpaEntity ft WHERE ft.feedJpaEntity.postId = :feedId") - List findAllByFeedId(@Param("feedId") Long feedId); - -} diff --git a/src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java b/src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java index d13b9dbcc..dd9e758c1 100644 --- a/src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java +++ b/src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java @@ -5,11 +5,12 @@ import konkuk.thip.feed.adapter.in.web.response.*; import konkuk.thip.feed.application.port.in.dto.TagsWithCategoryResult; import konkuk.thip.feed.application.port.out.dto.FeedQueryDto; -import konkuk.thip.feed.application.port.out.dto.TagCategoryQueryDto; import konkuk.thip.feed.domain.Feed; -import konkuk.thip.feed.domain.Tag; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.feed.domain.value.TagList; import konkuk.thip.feed.domain.value.ContentList; -import konkuk.thip.user.domain.Alias; +import konkuk.thip.room.domain.value.Category; +import konkuk.thip.user.domain.value.Alias; import konkuk.thip.user.domain.User; import org.mapstruct.*; @@ -111,18 +112,18 @@ default String[] mapContentList(ContentList contentList) { } @Named("mapTagList") - default String[] mapTagList(List tagList) { + default String[] mapTagList(TagList tagList) { if (tagList == null) return new String[0]; return tagList.stream().map(Tag::getValue).toArray(String[]::new); } - default List toTagsWithCategoryResult(List rows) { - Map> grouped = rows.stream() + default List toTagsWithCategoryResult(Map> categoryToTags) { + Map> grouped = categoryToTags.entrySet().stream() .collect(Collectors.groupingBy( - TagCategoryQueryDto::categoryValue, - Collectors.mapping( - TagCategoryQueryDto::tagValue, - Collectors.toCollection(LinkedHashSet::new) + e -> e.getKey().getValue(), + Collectors.flatMapping( + e -> e.getValue().stream().map(Tag::getValue), + Collectors.toSet() ) )); diff --git a/src/main/java/konkuk/thip/feed/application/port/out/FeedQueryPort.java b/src/main/java/konkuk/thip/feed/application/port/out/FeedQueryPort.java index d0e92d3e8..6afdf4699 100644 --- a/src/main/java/konkuk/thip/feed/application/port/out/FeedQueryPort.java +++ b/src/main/java/konkuk/thip/feed/application/port/out/FeedQueryPort.java @@ -48,9 +48,4 @@ public interface FeedQueryPort { CursorBasedList findFeedsByBookIsbnOrderByLatest(String isbn, Long userId, Cursor cursor); List findLatestPublicFeedCreatorsIn(Set userIds, int size); - - /** - * 모든 태그 조회 - */ - List findAllTags(); } diff --git a/src/main/java/konkuk/thip/feed/application/port/out/dto/FeedIdAndTagProjection.java b/src/main/java/konkuk/thip/feed/application/port/out/dto/FeedIdAndTagProjection.java deleted file mode 100644 index b4de5ae3b..000000000 --- a/src/main/java/konkuk/thip/feed/application/port/out/dto/FeedIdAndTagProjection.java +++ /dev/null @@ -1,8 +0,0 @@ -package konkuk.thip.feed.application.port.out.dto; - -import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; - -public interface FeedIdAndTagProjection { - Long getFeedId(); - TagJpaEntity getTagJpaEntity(); -} \ No newline at end of file diff --git a/src/main/java/konkuk/thip/feed/application/port/out/dto/FeedQueryDto.java b/src/main/java/konkuk/thip/feed/application/port/out/dto/FeedQueryDto.java index 1f30d8a67..6f2a53f9c 100644 --- a/src/main/java/konkuk/thip/feed/application/port/out/dto/FeedQueryDto.java +++ b/src/main/java/konkuk/thip/feed/application/port/out/dto/FeedQueryDto.java @@ -3,6 +3,7 @@ import com.querydsl.core.annotations.QueryProjection; import jakarta.annotation.Nullable; import konkuk.thip.feed.domain.value.ContentList; +import konkuk.thip.user.domain.value.Alias; import lombok.Builder; import java.time.LocalDateTime; @@ -31,8 +32,7 @@ public FeedQueryDto( Long feedId, Long creatorId, String creatorNickname, - String creatorProfileImageUrl, - String alias, + Alias alias, LocalDateTime createdAt, String isbn, String bookTitle, @@ -49,8 +49,8 @@ public FeedQueryDto( feedId, creatorId, creatorNickname, - creatorProfileImageUrl, - alias, + alias.getImageUrl(), + alias.getValue(), createdAt, isbn, bookTitle, diff --git a/src/main/java/konkuk/thip/feed/application/service/FeedCreateService.java b/src/main/java/konkuk/thip/feed/application/service/FeedCreateService.java index 9818a5311..aedf6d9b6 100644 --- a/src/main/java/konkuk/thip/feed/application/service/FeedCreateService.java +++ b/src/main/java/konkuk/thip/feed/application/service/FeedCreateService.java @@ -9,6 +9,8 @@ import konkuk.thip.feed.application.port.out.FeedCommandPort; import konkuk.thip.feed.application.port.out.S3CommandPort; import konkuk.thip.feed.domain.Feed; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.feed.domain.value.TagList; import konkuk.thip.feed.domain.value.ContentList; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -32,7 +34,8 @@ public class FeedCreateService implements FeedCreateUseCase { public Long createFeed(FeedCreateCommand command, List images) { // 1. 피드 생성 비지니스 정책 검증 - Feed.validateTags(command.tagList()); + TagList.validateTags(Tag.fromList(command.tagList())); + // todo 나중에 presignedURL로 바꾸면 ContentList.of로 변경 ContentList.validateImageCount(images != null ? images.size() : 0); // 2. Book 검증 및 조회 diff --git a/src/main/java/konkuk/thip/feed/application/service/FeedShowWriteInfoService.java b/src/main/java/konkuk/thip/feed/application/service/FeedShowWriteInfoService.java index a2556932f..4d10364c4 100644 --- a/src/main/java/konkuk/thip/feed/application/service/FeedShowWriteInfoService.java +++ b/src/main/java/konkuk/thip/feed/application/service/FeedShowWriteInfoService.java @@ -1,16 +1,18 @@ package konkuk.thip.feed.application.service; +import konkuk.thip.common.util.EnumMappings; import konkuk.thip.feed.adapter.in.web.response.FeedShowWriteInfoResponse; import konkuk.thip.feed.application.mapper.FeedQueryMapper; import konkuk.thip.feed.application.port.in.FeedShowWriteInfoUseCase; import konkuk.thip.feed.application.port.out.FeedQueryPort; -import konkuk.thip.feed.application.port.out.dto.TagCategoryQueryDto; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.room.domain.value.Category; import lombok.RequiredArgsConstructor; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Map; @Service @RequiredArgsConstructor @@ -20,11 +22,12 @@ public class FeedShowWriteInfoService implements FeedShowWriteInfoUseCase { private final FeedQueryMapper feedQueryMapper; @Override - @Cacheable("allTags") @Transactional(readOnly = true) public FeedShowWriteInfoResponse showFeedWriteInfo() { - List rows = feedQueryPort.findAllTags(); - return FeedShowWriteInfoResponse.of(feedQueryMapper.toTagsWithCategoryResult(rows)); + // 1. 태그와 카테고리 조회 + Map> categoryToTags = EnumMappings.getCategoryToTags(); + + return FeedShowWriteInfoResponse.of(feedQueryMapper.toTagsWithCategoryResult(categoryToTags)); } } diff --git a/src/main/java/konkuk/thip/feed/application/service/FeedUpdateService.java b/src/main/java/konkuk/thip/feed/application/service/FeedUpdateService.java index 0bfd0ce75..7f6655d1e 100644 --- a/src/main/java/konkuk/thip/feed/application/service/FeedUpdateService.java +++ b/src/main/java/konkuk/thip/feed/application/service/FeedUpdateService.java @@ -5,6 +5,8 @@ import konkuk.thip.feed.application.port.out.FeedCommandPort; import konkuk.thip.feed.application.port.out.S3CommandPort; import konkuk.thip.feed.domain.Feed; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.feed.domain.value.TagList; import konkuk.thip.feed.domain.value.ContentList; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -24,7 +26,7 @@ public class FeedUpdateService implements FeedUpdateUseCase { public Long updateFeed(FeedUpdateCommand command) { //1. 유효성 검증 - Feed.validateTags(command.tagList()); + TagList.validateTags(Tag.fromList(command.tagList())); ContentList.validateImageCount(command.remainImageUrls() != null ? command.remainImageUrls().size() : 0); // 2. 피드 조회 diff --git a/src/main/java/konkuk/thip/feed/domain/Content.java b/src/main/java/konkuk/thip/feed/domain/Content.java deleted file mode 100644 index 2b161c8db..000000000 --- a/src/main/java/konkuk/thip/feed/domain/Content.java +++ /dev/null @@ -1,16 +0,0 @@ -package konkuk.thip.feed.domain; - -import konkuk.thip.common.entity.BaseDomainEntity; -import lombok.Getter; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -public class Content extends BaseDomainEntity { - - private Long id; - - private String contentUrl; - - private Long targetPostId; -} diff --git a/src/main/java/konkuk/thip/feed/domain/Feed.java b/src/main/java/konkuk/thip/feed/domain/Feed.java index e2be52e7e..993f32889 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 konkuk.thip.common.exception.BusinessException; import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.feed.domain.value.ContentList; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.feed.domain.value.TagList; import konkuk.thip.post.domain.CountUpdatable; import konkuk.thip.post.domain.service.PostCountService; import lombok.Builder; @@ -12,8 +14,6 @@ import java.util.List; import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; import static konkuk.thip.common.exception.code.ErrorCode.*; @@ -40,7 +40,8 @@ public class Feed extends BaseDomainEntity implements CountUpdatable { private Long targetBookId; - private List tagList; + @Builder.Default + private TagList tagList = TagList.empty(); @Builder.Default private ContentList contentList = ContentList.empty(); @@ -61,7 +62,7 @@ public int hashCode() { public static Feed withoutId(String content, Long creatorId, Boolean isPublic, Long targetBookId, List tagValues, List imageUrls) { - validateTags(tagValues); +// validateTags(tagValues); // validateImageCount(imageUrls != null ? imageUrls.size() : 0); return Feed.builder() @@ -73,32 +74,40 @@ public static Feed withoutId(String content, Long creatorId, Boolean isPublic, L .likeCount(0) .commentCount(0) .targetBookId(targetBookId) - .tagList(Tag.fromList(tagValues)) + .tagList(convertToTagList(tagValues)) .contentList(convertToContentList(imageUrls)) .build(); } + private static TagList convertToTagList(List tagValues) { + if (tagValues == null || tagValues.isEmpty()) { + return TagList.empty(); + } + List tags = Tag.fromList(tagValues); + return TagList.of(tags); + } + private static ContentList convertToContentList(List imageUrls) { if (imageUrls == null) return ContentList.empty(); return ContentList.of(imageUrls); } - public static void validateTags(List tagList) { - boolean tagListEmpty = (tagList == null || tagList.isEmpty()); - - // 태그가 있는 경우, 개수 최대 5개 제한 - if (!tagListEmpty && tagList.size() > 5) { - throw new InvalidStateException(INVALID_FEED_COMMAND, new IllegalArgumentException("태그는 최대 5개까지 입력할 수 있습니다.")); - } - - // 태그 중복 체크 - if (!tagListEmpty) { - long distinctCount = tagList.stream().distinct().count(); - if (distinctCount != tagList.size()) { - throw new InvalidStateException(INVALID_FEED_COMMAND, new IllegalArgumentException("태그는 중복 될 수 없습니다.")); - } - } - } +// public static void validateTags(List tagList) { +// boolean tagListEmpty = (tagList == null || tagList.isEmpty()); +// +// // 태그가 있는 경우, 개수 최대 5개 제한 +// if (!tagListEmpty && tagList.size() > 5) { +// throw new InvalidStateException(INVALID_FEED_COMMAND, new IllegalArgumentException("태그는 최대 5개까지 입력할 수 있습니다.")); +// } +// +// // 태그 중복 체크 +// if (!tagListEmpty) { +// long distinctCount = tagList.stream().distinct().count(); +// if (distinctCount != tagList.size()) { +// throw new InvalidStateException(INVALID_FEED_COMMAND, new IllegalArgumentException("태그는 중복 될 수 없습니다.")); +// } +// } +// } // // public static void validateImageCount(int imageSize) { // if (imageSize > 3) { @@ -146,29 +155,19 @@ public void updateVisibility(Long userId, Boolean isPublic) { public void updateTags(Long userId, List newTagValues) { validateCreator(userId); - validateTags(newTagValues); - this.tagList = Tag.fromList(newTagValues); // Tag.from(...) 등으로 변환 + List tags = Tag.fromList(newTagValues); + this.tagList = TagList.of(tags); } public void updateImages(Long userId, List newImageUrls) { validateCreator(userId); // validateImageCount(newImageUrls.size()); - validateOwnsImages(newImageUrls); +// validateOwnsImages(newImageUrls); + contentList.validateOwnImages(newImageUrls); this.contentList = convertToContentList(newImageUrls); } - public void validateOwnsImages(List candidateImageUrls) { - Set myImageUrls = contentList.stream() - .filter(url -> url != null && !url.isBlank()) - .collect(Collectors.toSet()); - for (String url : candidateImageUrls) { - if (!myImageUrls.contains(url)) { - throw new InvalidStateException(INVALID_FEED_COMMAND, new IllegalArgumentException("해당 이미지는 이 피드에 존재하지 않습니다: " + url)); - } - } - } - @Override public void increaseCommentCount() { commentCount++; diff --git a/src/main/java/konkuk/thip/feed/domain/value/ContentList.java b/src/main/java/konkuk/thip/feed/domain/value/ContentList.java index 3f6a8eb92..9e8bdbd2c 100644 --- a/src/main/java/konkuk/thip/feed/domain/value/ContentList.java +++ b/src/main/java/konkuk/thip/feed/domain/value/ContentList.java @@ -5,8 +5,10 @@ import java.io.Serial; import java.io.Serializable; import java.util.*; +import java.util.stream.Collectors; import static konkuk.thip.common.exception.code.ErrorCode.CONTENT_LIST_SIZE_OVERFLOW; +import static konkuk.thip.common.exception.code.ErrorCode.CONTENT_NOT_FOUND; public final class ContentList extends AbstractList implements Serializable { @@ -48,6 +50,17 @@ private void validate() { //todo 필요 시 URL 형식 검증 추가 가능 } + public void validateOwnImages(List newImageUrls) { + Set myImageUrls = contents.stream() + .filter(url -> url != null && !url.isBlank()) + .collect(Collectors.toSet()); + for (String url : newImageUrls) { + if (!myImageUrls.contains(url)) { + throw new InvalidStateException(CONTENT_NOT_FOUND, new IllegalArgumentException(url)); + } + } + } + // AbstractList 구현 위임 구간 @Override public String get(int index) { diff --git a/src/main/java/konkuk/thip/feed/domain/Tag.java b/src/main/java/konkuk/thip/feed/domain/value/Tag.java similarity index 98% rename from src/main/java/konkuk/thip/feed/domain/Tag.java rename to src/main/java/konkuk/thip/feed/domain/value/Tag.java index 213083dcd..67bb40035 100644 --- a/src/main/java/konkuk/thip/feed/domain/Tag.java +++ b/src/main/java/konkuk/thip/feed/domain/value/Tag.java @@ -1,4 +1,4 @@ -package konkuk.thip.feed.domain; +package konkuk.thip.feed.domain.value; import konkuk.thip.common.exception.InvalidStateException; import lombok.Getter; diff --git a/src/main/java/konkuk/thip/feed/domain/value/TagList.java b/src/main/java/konkuk/thip/feed/domain/value/TagList.java new file mode 100644 index 000000000..081b6e3e8 --- /dev/null +++ b/src/main/java/konkuk/thip/feed/domain/value/TagList.java @@ -0,0 +1,105 @@ +package konkuk.thip.feed.domain.value; + +import konkuk.thip.common.exception.InvalidStateException; + +import java.io.Serial; +import java.io.Serializable; +import java.util.*; + +import static konkuk.thip.common.exception.code.ErrorCode.*; + +public final class TagList extends AbstractList implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private static final int MAX_SIZE = 5; + + private final List tags; + + private TagList(List tags) { + this.tags = new ArrayList<>(tags == null ? List.of() : tags); + validate(); + } + + public static TagList of(List tags) { + return new TagList(tags); + } + + public static TagList empty() { + return new TagList(List.of()); + } + + // todo presignedURL 도입 전 임시 유효성 검증 메서드 + public static void validateTags(List tags) { + if (tags.size() > MAX_SIZE) { + throw new InvalidStateException(TAG_LIST_SIZE_OVERFLOW, + new IllegalArgumentException("태그는 최대 " + MAX_SIZE + "개까지 입력할 수 있습니다.")); + } + long distinctCount = tags.stream().distinct().count(); + if (distinctCount != tags.size()) { + throw new InvalidStateException(TAG_SHOULD_BE_UNIQUE); + } + } + + private void validate() { + validateTags(tags); + } + + public List toUnmodifiableList() { + return List.copyOf(tags); + } + + // AbstractList 구현 + @Override + public Tag get(int index) { + return tags.get(index); + } + + @Override + public int size() { + return tags.size(); + } + + @Override + public boolean add(Tag tag) { + boolean res = tags.add(tag); + validate(); + return res; + } + + @Override + public boolean addAll(Collection c) { + boolean res = tags.addAll(c); + validate(); + return res; + } + + @Override + public Tag set(int index, Tag element) { + Tag prev = tags.set(index, element); + validate(); + return prev; + } + + @Override + public void add(int index, Tag element) { + tags.add(index, element); + validate(); + } + + @Override + public Tag remove(int index) { + return tags.remove(index); + } + + @Override + public void clear() { + tags.clear(); + } + + @Override + public Iterator iterator() { + return tags.iterator(); + } +} diff --git a/src/main/java/konkuk/thip/room/adapter/out/jpa/CategoryJpaEntity.java b/src/main/java/konkuk/thip/room/adapter/out/jpa/CategoryJpaEntity.java deleted file mode 100644 index f072818ce..000000000 --- a/src/main/java/konkuk/thip/room/adapter/out/jpa/CategoryJpaEntity.java +++ /dev/null @@ -1,32 +0,0 @@ -package konkuk.thip.room.adapter.out.jpa; - -import jakarta.persistence.*; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; -import konkuk.thip.common.entity.BaseJpaEntity; -import lombok.*; - - -@Entity -@Table(name = "categories") -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Builder -public class CategoryJpaEntity extends BaseJpaEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "category_id") - private Long categoryId; - - @Column(name = "category_value",length = 50, nullable = false) - private String value; - - @Column(name = "image_url", columnDefinition = "TEXT", nullable = false) - private String imageUrl; - - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "category_alias_id", nullable = false) - private AliasJpaEntity aliasForCategoryJpaEntity; - -} diff --git a/src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java b/src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java index 3901831fe..ce51508d9 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java +++ b/src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java @@ -4,6 +4,7 @@ import jakarta.persistence.*; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.common.entity.BaseJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.room.domain.Room; import lombok.*; @@ -53,9 +54,9 @@ public class RoomJpaEntity extends BaseJpaEntity { @JoinColumn(name = "book_id", nullable = false) private BookJpaEntity bookJpaEntity; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "category_id", nullable = false) - private CategoryJpaEntity categoryJpaEntity; + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private Category category; public RoomJpaEntity updateFrom(Room room) { this.title = room.getTitle(); diff --git a/src/main/java/konkuk/thip/room/adapter/out/mapper/RoomMapper.java b/src/main/java/konkuk/thip/room/adapter/out/mapper/RoomMapper.java index 44bd9478d..125ff96b2 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/mapper/RoomMapper.java +++ b/src/main/java/konkuk/thip/room/adapter/out/mapper/RoomMapper.java @@ -1,16 +1,14 @@ package konkuk.thip.room.adapter.out.mapper; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; -import konkuk.thip.room.domain.Category; import konkuk.thip.room.domain.Room; import org.springframework.stereotype.Component; @Component public class RoomMapper { - public RoomJpaEntity toJpaEntity(Room room, BookJpaEntity bookJpaEntity, CategoryJpaEntity categoryJpaEntity) { + public RoomJpaEntity toJpaEntity(Room room, BookJpaEntity bookJpaEntity) { return RoomJpaEntity.builder() .title(room.getTitle()) .description(room.getDescription()) @@ -22,7 +20,7 @@ public RoomJpaEntity toJpaEntity(Room room, BookJpaEntity bookJpaEntity, Categor .recruitCount(room.getRecruitCount()) .memberCount(room.getMemberCount()) .bookJpaEntity(bookJpaEntity) - .categoryJpaEntity(categoryJpaEntity) + .category(room.getCategory()) .build(); } @@ -39,7 +37,7 @@ public Room toDomainEntity(RoomJpaEntity roomJpaEntity) { .recruitCount(roomJpaEntity.getRecruitCount()) .memberCount(roomJpaEntity.getMemberCount()) .bookId(roomJpaEntity.getBookJpaEntity().getBookId()) - .category(Category.from(roomJpaEntity.getCategoryJpaEntity().getValue())) + .category(roomJpaEntity.getCategory()) .createdAt(roomJpaEntity.getCreatedAt()) .modifiedAt(roomJpaEntity.getModifiedAt()) .status(roomJpaEntity.getStatus()) diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomCommandPersistenceAdapter.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomCommandPersistenceAdapter.java index 704195ffb..a9c946643 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomCommandPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomCommandPersistenceAdapter.java @@ -3,11 +3,9 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.exception.EntityNotFoundException; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.mapper.RoomMapper; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.application.port.out.RoomCommandPort; import konkuk.thip.room.domain.Room; import lombok.RequiredArgsConstructor; @@ -23,7 +21,6 @@ public class RoomCommandPersistenceAdapter implements RoomCommandPort { private final RoomJpaRepository roomJpaRepository; private final BookJpaRepository bookJpaRepository; - private final CategoryJpaRepository categoryJpaRepository; private final RoomMapper roomMapper; @@ -47,11 +44,7 @@ public Long save(Room room) { () -> new EntityNotFoundException(BOOK_NOT_FOUND) ); - CategoryJpaEntity categoryJpaEntity = categoryJpaRepository.findByValue(room.getCategory().getValue()).orElseThrow( - () -> new EntityNotFoundException(CATEGORY_NOT_FOUND) - ); - - RoomJpaEntity roomJpaEntity = roomMapper.toJpaEntity(room, bookJpaEntity, categoryJpaEntity); + RoomJpaEntity roomJpaEntity = roomMapper.toJpaEntity(room, bookJpaEntity); return roomJpaRepository.save(roomJpaEntity).getRoomId(); } diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java index c295b7ed4..ee264437a 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java @@ -1,18 +1,16 @@ package konkuk.thip.room.adapter.out.persistence; -import konkuk.thip.common.exception.EntityNotFoundException; -import konkuk.thip.common.exception.code.ErrorCode; import konkuk.thip.common.util.Cursor; import konkuk.thip.common.util.CursorBasedList; +import konkuk.thip.common.util.EnumMappings; import konkuk.thip.room.adapter.in.web.response.RoomGetHomeJoinedListResponse; import konkuk.thip.room.adapter.in.web.response.RoomRecruitingDetailViewResponse; import konkuk.thip.room.adapter.out.persistence.function.IntegerCursorRoomQueryFunction; import konkuk.thip.room.adapter.out.persistence.function.LocalDateCursorRoomQueryFunction; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.application.port.out.RoomQueryPort; import konkuk.thip.room.application.port.out.dto.RoomQueryDto; -import konkuk.thip.room.domain.Category; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.room.domain.Room; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -27,7 +25,6 @@ public class RoomQueryPersistenceAdapter implements RoomQueryPort { private final RoomJpaRepository roomJpaRepository; - private final CategoryJpaRepository categoryJpaRepository; @Override public int countRecruitingRoomsByBookAndStartDateAfter(String isbn, LocalDate currentDate) { @@ -44,7 +41,7 @@ public CursorBasedList searchRecruitingRoomsByDeadline(String keyw public CursorBasedList searchRecruitingRoomsWithCategoryByDeadline(String keyword, Category category, Cursor cursor) { return findRoomsByDeadlineCursor(cursor, (lastLocalDate, lastId, pageSize) -> roomJpaRepository.findRecruitingRoomsWithCategoryOrderByStartDateAsc( - keyword, category.getValue(), lastLocalDate, lastId, pageSize + keyword, category, lastLocalDate, lastId, pageSize ) ); } @@ -62,7 +59,7 @@ public CursorBasedList searchRecruitingRoomsByMemberCount(String k public CursorBasedList searchRecruitingRoomsWithCategoryByMemberCount(String keyword, Category category, Cursor cursor) { return findRoomsByMemberCountCursor(cursor, (lastMemberCount, lastId, pageSize) -> roomJpaRepository.findRecruitingRoomsWithCategoryOrderByMemberCountDesc( - keyword, category.getValue(), lastMemberCount, lastId, pageSize + keyword, category, lastMemberCount, lastId, pageSize ) ); } @@ -70,7 +67,7 @@ public CursorBasedList searchRecruitingRoomsWithCategoryByMemberCo @Override public List findOtherRecruitingRoomsByCategoryOrderByStartDateAsc(Room currentRoom, int count) { return roomJpaRepository.findOtherRecruitingRoomsByCategoryOrderByStartDateAsc( - currentRoom.getId(), currentRoom.getCategory().getValue(), count); + currentRoom.getId(), currentRoom.getCategory(), count); } @Override @@ -142,19 +139,16 @@ private CursorBasedList findRoomsByMemberCountCursor(Cursor cursor @Override public List findRoomsByCategoryOrderByDeadline(Category category, int limit, Long userId) { - return roomJpaRepository.findRoomsByCategoryOrderByStartDateAsc(category.getValue(), limit, userId); + return roomJpaRepository.findRoomsByCategoryOrderByStartDateAsc(category, limit, userId); } @Override public List findRoomsByCategoryOrderByPopular(Category category, int limit, Long userId) { - return roomJpaRepository.findRoomsByCategoryOrderByMemberCount(category.getValue(), limit, userId); + return roomJpaRepository.findRoomsByCategoryOrderByMemberCount(category, limit, userId); } - // TODO : 리펙토링 대상 @Override public String findAliasColorOfCategory(Category category) { - return categoryJpaRepository.findAliasColorByValue(category.getValue()).orElseThrow( - () -> new EntityNotFoundException(ErrorCode.CATEGORY_NOT_FOUND) - ); + return EnumMappings.aliasFrom(category).getColor(); } } diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepository.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepository.java index ae5a1be97..49b730ba2 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepository.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepository.java @@ -3,6 +3,7 @@ import konkuk.thip.room.adapter.in.web.response.RoomRecruitingDetailViewResponse; import konkuk.thip.room.adapter.in.web.response.RoomGetHomeJoinedListResponse; import konkuk.thip.room.application.port.out.dto.RoomQueryDto; +import konkuk.thip.room.domain.value.Category; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -16,11 +17,11 @@ public interface RoomQueryRepository { * 방 검색 */ List findRecruitingRoomsOrderByStartDateAsc(String keyword, LocalDate lastStartDate, Long roomId, int pageSize); - List findRecruitingRoomsWithCategoryOrderByStartDateAsc(String keyword, String categoryVal, LocalDate lastStartDate, Long roomId, int pageSize); + List findRecruitingRoomsWithCategoryOrderByStartDateAsc(String keyword, Category category, LocalDate lastStartDate, Long roomId, int pageSize); List findRecruitingRoomsOrderByMemberCountDesc(String keyword, Integer lastMemberCount, Long roomId, int pageSize); - List findRecruitingRoomsWithCategoryOrderByMemberCountDesc(String keyword, String categoryVal, Integer lastMemberCount, Long roomId, int pageSize); + List findRecruitingRoomsWithCategoryOrderByMemberCountDesc(String keyword, Category category, Integer lastMemberCount, Long roomId, int pageSize); - List findOtherRecruitingRoomsByCategoryOrderByStartDateAsc(Long roomId, String category, int count); + List findOtherRecruitingRoomsByCategoryOrderByStartDateAsc(Long roomId, Category category, int count); Page searchHomeJoinedRooms(Long userId, LocalDate today, Pageable pageable); @@ -32,9 +33,9 @@ public interface RoomQueryRepository { List findExpiredRoomsUserParticipated(Long userId, LocalDate dateCursor, Long roomIdCursor, int pageSize); - List findRoomsByCategoryOrderByStartDateAsc(String category, int limit, Long userId); + List findRoomsByCategoryOrderByStartDateAsc(Category category, int limit, Long userId); - List findRoomsByCategoryOrderByMemberCount(String category, int limit, Long userId); + List findRoomsByCategoryOrderByMemberCount(Category category, int limit, Long userId); List findRoomsByIsbnOrderByStartDateAsc(String isbn, LocalDate dateCursor, Long roomIdCursor, int pageSize); } diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java index 0e882891e..2699a025f 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java @@ -14,11 +14,11 @@ import konkuk.thip.common.util.DateUtil; import konkuk.thip.room.adapter.in.web.response.RoomGetHomeJoinedListResponse; import konkuk.thip.room.adapter.in.web.response.RoomRecruitingDetailViewResponse; -import konkuk.thip.room.adapter.out.jpa.QCategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.QRoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.QRoomParticipantJpaEntity; import konkuk.thip.room.application.port.out.dto.QRoomQueryDto; import konkuk.thip.room.application.port.out.dto.RoomQueryDto; +import konkuk.thip.room.domain.value.Category; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -37,7 +37,6 @@ public class RoomQueryRepositoryImpl implements RoomQueryRepository { private final QRoomJpaEntity room = QRoomJpaEntity.roomJpaEntity; private final QBookJpaEntity book = QBookJpaEntity.bookJpaEntity; private final QRoomParticipantJpaEntity participant = QRoomParticipantJpaEntity.roomParticipantJpaEntity; - private final QCategoryJpaEntity category = QCategoryJpaEntity.categoryJpaEntity; /** 모집중 + ACTIVE 공통 where */ private BooleanBuilder recruitingActiveWhere(LocalDate today) { @@ -48,9 +47,9 @@ private BooleanBuilder recruitingActiveWhere(LocalDate today) { } /** 카테고리 조건 추가 */ - private void applyCategory(BooleanBuilder where, String categoryVal) { - if (categoryVal != null && !categoryVal.isBlank()) { - where.and(room.categoryJpaEntity.value.eq(categoryVal)); + private void applyCategory(BooleanBuilder where, Category category) { + if (category != null) { + where.and(room.category.eq(category)); } } @@ -115,12 +114,12 @@ public List findRecruitingRoomsOrderByStartDateAsc(String keyword, } @Override - public List findRecruitingRoomsWithCategoryOrderByStartDateAsc(String keyword, String categoryVal, LocalDate lastStartDate, Long roomId, int pageSize) { + public List findRecruitingRoomsWithCategoryOrderByStartDateAsc(String keyword, Category category, LocalDate lastStartDate, Long roomId, int pageSize) { final LocalDate today = LocalDate.now(); DateExpression cursorExpr = room.startDate; BooleanBuilder where = recruitingActiveWhere(today); - applyCategory(where, categoryVal); + applyCategory(where, category); applyKeyword(where, keyword); applyCursorStartDateAsc(where, cursorExpr, lastStartDate, roomId); @@ -128,7 +127,6 @@ public List findRecruitingRoomsWithCategoryOrderByStartDateAsc(Str .select(projectionForRecruitingRoomSearch()) .from(room) .join(room.bookJpaEntity, book) - .join(room.categoryJpaEntity, category) .where(where) .orderBy(cursorExpr.asc(), room.roomId.asc()) .limit(pageSize + 1) @@ -154,11 +152,11 @@ public List findRecruitingRoomsOrderByMemberCountDesc(String keywo } @Override - public List findRecruitingRoomsWithCategoryOrderByMemberCountDesc(String keyword, String categoryVal, Integer lastMemberCount, Long roomId, int pageSize) { + public List findRecruitingRoomsWithCategoryOrderByMemberCountDesc(String keyword, Category category, Integer lastMemberCount, Long roomId, int pageSize) { final LocalDate today = LocalDate.now(); BooleanBuilder where = recruitingActiveWhere(today); - applyCategory(where, categoryVal); + applyCategory(where, category); applyKeyword(where, keyword); applyCursorMemberCountDesc(where, lastMemberCount, roomId); @@ -166,7 +164,6 @@ public List findRecruitingRoomsWithCategoryOrderByMemberCountDesc( .select(projectionForRecruitingRoomSearch()) .from(room) .join(room.bookJpaEntity, book) - .join(room.categoryJpaEntity, category) .where(where) .orderBy(room.memberCount.desc(), room.roomId.asc()) .limit(pageSize + 1) @@ -175,20 +172,17 @@ public List findRecruitingRoomsWithCategoryOrderByMemberCountDesc( // ----------------------------------------------------------------------------------------------------------------------- @Override - public List findOtherRecruitingRoomsByCategoryOrderByStartDateAsc(Long roomId, String category, int count) { - NumberExpression memberCountExpr = participant.roomParticipantId.count(); + public List findOtherRecruitingRoomsByCategoryOrderByStartDateAsc(Long roomId, Category category, int count) { List tuples = queryFactory - .select(room.roomId, room.title, memberCountExpr, room.recruitCount, room.startDate, book.imageUrl) + .select(room.roomId, room.title, room.memberCount, room.recruitCount, room.startDate, book.imageUrl) .from(room) .join(room.bookJpaEntity, book) - .leftJoin(participant).on(participant.roomJpaEntity.eq(room)) .where( - room.categoryJpaEntity.value.eq(category) + room.category.eq(category) .and(room.startDate.after(LocalDate.now())) // 모집 마감 시각 > 현재 시각 .and(room.roomId.ne(roomId))// 현재 방 제외 .and(room.isPublic.isTrue()) // 공개방 만 ) - .groupBy(room.roomId, room.title, room.recruitCount, room.startDate) .orderBy(room.startDate.asc()) .limit(count) .fetch(); @@ -198,7 +192,7 @@ public List findOtherRecruitingR .roomId(t.get(room.roomId)) .bookImageUrl(t.get(book.imageUrl)) .roomName(t.get(room.title)) - .memberCount(t.get(memberCountExpr).intValue()) + .memberCount(t.get(room.memberCount)) .recruitCount(t.get(room.recruitCount)) .recruitEndDate(DateUtil.formatAfterTime(t.get(room.startDate))) .build()) @@ -357,7 +351,7 @@ public List findExpiredRoomsUserParticipated( } @Override - public List findRoomsByCategoryOrderByStartDateAsc(String categoryVal, int limit, Long userId) { + public List findRoomsByCategoryOrderByStartDateAsc(Category category, int limit, Long userId) { return queryFactory .select(new QRoomQueryDto( room.roomId, @@ -369,15 +363,14 @@ public List findRoomsByCategoryOrderByStartDateAsc(String category )) .from(room) .join(room.bookJpaEntity, book) - .join(room.categoryJpaEntity, category) - .where(findDeadlinePopularRoomCondition(categoryVal, userId)) + .where(findDeadlinePopularRoomCondition(category, userId)) .orderBy(room.startDate.asc(), room.memberCount.desc(), room.roomId.asc()) .limit(limit) .fetch(); } @Override - public List findRoomsByCategoryOrderByMemberCount(String categoryVal, int limit, Long userId) { + public List findRoomsByCategoryOrderByMemberCount(Category category, int limit, Long userId) { return queryFactory .select(new QRoomQueryDto( room.roomId, @@ -389,8 +382,7 @@ public List findRoomsByCategoryOrderByMemberCount(String categoryV )) .from(room) .join(room.bookJpaEntity, book) - .join(room.categoryJpaEntity, category) - .where(findDeadlinePopularRoomCondition(categoryVal, userId)) + .where(findDeadlinePopularRoomCondition(category, userId)) .orderBy(room.memberCount.desc(), room.startDate.asc(), room.roomId.asc()) .limit(limit) .fetch(); @@ -426,8 +418,8 @@ public List findRoomsByIsbnOrderByStartDateAsc(String isbn, LocalD .fetch(); } - private BooleanExpression findDeadlinePopularRoomCondition(String categoryVal, Long userId) { - return room.categoryJpaEntity.value.eq(categoryVal) + private BooleanExpression findDeadlinePopularRoomCondition(Category category, Long userId) { + return room.category.eq(category) .and(room.startDate.after(LocalDate.now())) // 모집 마감 시각 > 현재 시각 .and(room.isPublic.isTrue()) // 공개 방만 조회 .and(userJoinedRoom(userId).not()) // 유저가 참여하지 않은 방만 조회 diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/category/CategoryJpaRepository.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/category/CategoryJpaRepository.java deleted file mode 100644 index 5ca91f84e..000000000 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/category/CategoryJpaRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package konkuk.thip.room.adapter.out.persistence.repository.category; - -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.Optional; - -public interface CategoryJpaRepository extends JpaRepository { - - Optional findByValue(String value); - - // TODO : 리펙토링 대상 - @Query("select a.color " + - "from CategoryJpaEntity c join c.aliasForCategoryJpaEntity a " + - "where c.value = :categoryValue") - Optional findAliasColorByValue(@Param("categoryValue") String categoryValue); -} diff --git a/src/main/java/konkuk/thip/room/application/port/out/RoomQueryPort.java b/src/main/java/konkuk/thip/room/application/port/out/RoomQueryPort.java index 50a17b732..c04d6d541 100644 --- a/src/main/java/konkuk/thip/room/application/port/out/RoomQueryPort.java +++ b/src/main/java/konkuk/thip/room/application/port/out/RoomQueryPort.java @@ -5,7 +5,7 @@ import konkuk.thip.room.adapter.in.web.response.RoomGetHomeJoinedListResponse; import konkuk.thip.room.adapter.in.web.response.RoomRecruitingDetailViewResponse; import konkuk.thip.room.application.port.out.dto.RoomQueryDto; -import konkuk.thip.room.domain.Category; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.room.domain.Room; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/src/main/java/konkuk/thip/room/application/service/RoomCreateService.java b/src/main/java/konkuk/thip/room/application/service/RoomCreateService.java index 83bad6feb..f77fd4ff0 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomCreateService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomCreateService.java @@ -3,12 +3,11 @@ import konkuk.thip.book.application.port.out.BookApiQueryPort; import konkuk.thip.book.application.port.out.BookCommandPort; import konkuk.thip.book.domain.Book; -import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.application.port.in.RoomCreateUseCase; import konkuk.thip.room.application.port.in.dto.RoomCreateCommand; import konkuk.thip.room.application.port.out.RoomCommandPort; import konkuk.thip.room.application.port.out.RoomParticipantCommandPort; -import konkuk.thip.room.domain.Category; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.room.domain.Room; import konkuk.thip.room.domain.RoomParticipant; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/konkuk/thip/room/application/service/RoomGetDeadlinePopularService.java b/src/main/java/konkuk/thip/room/application/service/RoomGetDeadlinePopularService.java index cc394e134..ba6bad483 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomGetDeadlinePopularService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomGetDeadlinePopularService.java @@ -4,7 +4,7 @@ import konkuk.thip.room.application.mapper.RoomQueryMapper; import konkuk.thip.room.application.port.in.RoomGetDeadlinePopularUseCase; import konkuk.thip.room.application.port.out.RoomQueryPort; -import konkuk.thip.room.domain.Category; +import konkuk.thip.room.domain.value.Category; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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 3cf90d3f8..e3a0d3091 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java @@ -11,7 +11,7 @@ import konkuk.thip.room.application.port.in.dto.RoomSearchQuery; import konkuk.thip.room.application.port.out.RoomQueryPort; import konkuk.thip.room.application.port.out.dto.RoomQueryDto; -import konkuk.thip.room.domain.Category; +import konkuk.thip.room.domain.value.Category; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/konkuk/thip/room/domain/Room.java b/src/main/java/konkuk/thip/room/domain/Room.java index 578066bed..6e4d73a11 100644 --- a/src/main/java/konkuk/thip/room/domain/Room.java +++ b/src/main/java/konkuk/thip/room/domain/Room.java @@ -4,6 +4,7 @@ import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.common.entity.StatusType; import konkuk.thip.common.exception.code.ErrorCode; +import konkuk.thip.room.domain.value.Category; import lombok.Getter; import lombok.experimental.SuperBuilder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; diff --git a/src/main/java/konkuk/thip/room/domain/Category.java b/src/main/java/konkuk/thip/room/domain/value/Category.java similarity index 97% rename from src/main/java/konkuk/thip/room/domain/Category.java rename to src/main/java/konkuk/thip/room/domain/value/Category.java index 5ca106a5f..7ebbb5bc8 100644 --- a/src/main/java/konkuk/thip/room/domain/Category.java +++ b/src/main/java/konkuk/thip/room/domain/value/Category.java @@ -1,4 +1,4 @@ -package konkuk.thip.room.domain; +package konkuk.thip.room.domain.value; import konkuk.thip.common.exception.InvalidStateException; import lombok.Getter; diff --git a/src/main/java/konkuk/thip/roompost/adapter/out/persistence/repository/attendancecheck/AttendanceCheckQueryRepositoryImpl.java b/src/main/java/konkuk/thip/roompost/adapter/out/persistence/repository/attendancecheck/AttendanceCheckQueryRepositoryImpl.java index 393d3568c..d32a5dbc2 100644 --- a/src/main/java/konkuk/thip/roompost/adapter/out/persistence/repository/attendancecheck/AttendanceCheckQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/roompost/adapter/out/persistence/repository/attendancecheck/AttendanceCheckQueryRepositoryImpl.java @@ -5,7 +5,6 @@ import konkuk.thip.roompost.adapter.out.jpa.QAttendanceCheckJpaEntity; import konkuk.thip.roompost.application.port.out.dto.AttendanceCheckQueryDto; import konkuk.thip.roompost.application.port.out.dto.QAttendanceCheckQueryDto; -import konkuk.thip.user.adapter.out.jpa.QAliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.QUserJpaEntity; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -23,7 +22,6 @@ public class AttendanceCheckQueryRepositoryImpl implements AttendanceCheckQueryR public List findAttendanceChecksByCreatedAtDesc(Long roomId, LocalDateTime lastCreatedAt, int size) { QAttendanceCheckJpaEntity attendanceCheck = QAttendanceCheckJpaEntity.attendanceCheckJpaEntity; QUserJpaEntity user = QUserJpaEntity.userJpaEntity; - QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; BooleanExpression roomPredicate = attendanceCheck.roomJpaEntity.roomId.eq(roomId); BooleanExpression cursorPredicate = (lastCreatedAt == null) ? null : attendanceCheck.createdAt.lt(lastCreatedAt); @@ -33,13 +31,12 @@ public List findAttendanceChecksByCreatedAtDesc(Long ro attendanceCheck.attendanceCheckId, user.userId, user.nickname, - alias.imageUrl, + user.alias, attendanceCheck.todayComment, attendanceCheck.createdAt )) .from(attendanceCheck) .join(attendanceCheck.userJpaEntity, user) - .join(user.aliasForUserJpaEntity, alias) .where(roomPredicate, cursorPredicate) .orderBy( attendanceCheck.createdAt.desc() diff --git a/src/main/java/konkuk/thip/roompost/adapter/out/persistence/repository/record/RecordQueryRepositoryImpl.java b/src/main/java/konkuk/thip/roompost/adapter/out/persistence/repository/record/RecordQueryRepositoryImpl.java index 5e459f116..b7cba1500 100644 --- a/src/main/java/konkuk/thip/roompost/adapter/out/persistence/repository/record/RecordQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/roompost/adapter/out/persistence/repository/record/RecordQueryRepositoryImpl.java @@ -24,7 +24,6 @@ import static konkuk.thip.post.domain.PostType.RECORD; import static konkuk.thip.post.domain.PostType.VOTE; - @Repository @RequiredArgsConstructor public class RecordQueryRepositoryImpl implements RecordQueryRepository { @@ -194,11 +193,11 @@ private QRoomPostQueryDto selectPostQueryDto() { pageExpr(), user.userId, user.nickname, - user.aliasForUserJpaEntity.imageUrl, + user.alias, post.content, post.likeCount, post.commentCount, isOverviewExpr().eq(1) ); } -} \ No newline at end of file +} diff --git a/src/main/java/konkuk/thip/roompost/application/port/out/dto/AttendanceCheckQueryDto.java b/src/main/java/konkuk/thip/roompost/application/port/out/dto/AttendanceCheckQueryDto.java index fe7176d44..9e6396f07 100644 --- a/src/main/java/konkuk/thip/roompost/application/port/out/dto/AttendanceCheckQueryDto.java +++ b/src/main/java/konkuk/thip/roompost/application/port/out/dto/AttendanceCheckQueryDto.java @@ -1,6 +1,7 @@ package konkuk.thip.roompost.application.port.out.dto; import com.querydsl.core.annotations.QueryProjection; +import konkuk.thip.user.domain.value.Alias; import java.time.LocalDateTime; @@ -13,5 +14,21 @@ public record AttendanceCheckQueryDto( LocalDateTime createdAt ) { @QueryProjection - public AttendanceCheckQueryDto {} + public AttendanceCheckQueryDto ( + Long attendanceCheckId, + Long creatorId, + String creatorNickname, + Alias alias, + String todayComment, + LocalDateTime createdAt + ) { + this( + attendanceCheckId, + creatorId, + creatorNickname, + alias.getImageUrl(), + todayComment, + createdAt + ); + } } diff --git a/src/main/java/konkuk/thip/roompost/application/port/out/dto/RoomPostQueryDto.java b/src/main/java/konkuk/thip/roompost/application/port/out/dto/RoomPostQueryDto.java index 4a57911a9..53ac6d112 100644 --- a/src/main/java/konkuk/thip/roompost/application/port/out/dto/RoomPostQueryDto.java +++ b/src/main/java/konkuk/thip/roompost/application/port/out/dto/RoomPostQueryDto.java @@ -1,6 +1,7 @@ package konkuk.thip.roompost.application.port.out.dto; import com.querydsl.core.annotations.QueryProjection; +import konkuk.thip.user.domain.value.Alias; import org.springframework.util.Assert; import java.time.LocalDateTime; @@ -18,7 +19,7 @@ public record RoomPostQueryDto( Integer commentCount, Boolean isOverview ) { - @QueryProjection + // 정식 생성자(컴팩트)에서 모든 필드 검증 public RoomPostQueryDto { Assert.notNull(postId, "postId must not be null"); Assert.notNull(postType, "postType must not be null"); @@ -32,4 +33,33 @@ public record RoomPostQueryDto( Assert.notNull(commentCount, "commentCount must not be null"); Assert.notNull(isOverview, "isOverview must not be null"); } + + @QueryProjection + public RoomPostQueryDto ( + Long postId, + String postType, + LocalDateTime postDate, + Integer page, + Long userId, + String nickName, + Alias alias, + String content, + Integer likeCount, + Integer commentCount, + Boolean isOverview + ){ + this( + postId, + postType, + postDate, + page, + userId, + nickName, + alias.getImageUrl(), + content, + likeCount, + commentCount, + isOverview + ); + } } diff --git a/src/main/java/konkuk/thip/user/adapter/out/jpa/AliasJpaEntity.java b/src/main/java/konkuk/thip/user/adapter/out/jpa/AliasJpaEntity.java deleted file mode 100644 index a5e885417..000000000 --- a/src/main/java/konkuk/thip/user/adapter/out/jpa/AliasJpaEntity.java +++ /dev/null @@ -1,29 +0,0 @@ -package konkuk.thip.user.adapter.out.jpa; - -import jakarta.persistence.*; -import konkuk.thip.common.entity.BaseJpaEntity; -import lombok.*; - - -@Entity -@Table(name = "aliases") -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Builder -public class AliasJpaEntity extends BaseJpaEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "alias_id") - private Long aliasId; - - @Column(name = "alias_value", length = 50, nullable = false) - private String value; - - @Column(name = "image_url", columnDefinition = "TEXT", nullable = false) - private String imageUrl; - - @Column(name = "alias_color", length = 10, nullable = false) - private String color; -} diff --git a/src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java b/src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java index 02e1c3621..1a2c51c77 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java +++ b/src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import konkuk.thip.common.entity.BaseJpaEntity; +import konkuk.thip.user.domain.value.Alias; import konkuk.thip.user.domain.User; import lombok.*; @@ -37,16 +38,16 @@ public class UserJpaEntity extends BaseJpaEntity { @Column(nullable = false) private UserRole role; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_alias_id", nullable = false) - private AliasJpaEntity aliasForUserJpaEntity; + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private Alias alias; - public void updateIncludeAliasFrom(User user, AliasJpaEntity aliasJpaEntity) { + public void updateIncludeAliasFrom(User user) { this.nickname = user.getNickname(); this.nicknameUpdatedAt = user.getNicknameUpdatedAt(); this.role = UserRole.from(user.getUserRole()); this.followerCount = user.getFollowerCount(); - this.aliasForUserJpaEntity = aliasJpaEntity; + this.alias = user.getAlias(); } public void updateFrom(User user) { 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 e1df025e5..0eaeacf67 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 @@ -1,23 +1,21 @@ package konkuk.thip.user.adapter.out.mapper; -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; @Component public class UserMapper { - public UserJpaEntity toJpaEntity(User user, AliasJpaEntity aliasJpaEntity) { + public UserJpaEntity toJpaEntity(User user) { return UserJpaEntity.builder() .nickname(user.getNickname()) .nicknameUpdatedAt(user.getNicknameUpdatedAt()) .role(UserRole.from(user.getUserRole())) .oauth2Id(user.getOauth2Id()) .followerCount(user.getFollowerCount()) - .aliasForUserJpaEntity(aliasJpaEntity) + .alias(user.getAlias()) .build(); } @@ -29,7 +27,7 @@ public User toDomainEntity(UserJpaEntity userJpaEntity) { .userRole(userJpaEntity.getRole().getType()) .oauth2Id(userJpaEntity.getOauth2Id()) .followerCount(userJpaEntity.getFollowerCount()) - .alias(Alias.from(userJpaEntity.getAliasForUserJpaEntity().getValue())) + .alias(userJpaEntity.getAlias()) .createdAt(userJpaEntity.getCreatedAt()) .modifiedAt(userJpaEntity.getModifiedAt()) .status(userJpaEntity.getStatus()) diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java index c56ad147c..762af4f1f 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java @@ -6,7 +6,6 @@ import konkuk.thip.user.adapter.out.mapper.FollowingMapper; import konkuk.thip.user.adapter.out.mapper.UserMapper; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; import konkuk.thip.user.application.port.out.FollowingCommandPort; import konkuk.thip.user.domain.Following; @@ -25,7 +24,6 @@ public class FollowingCommandPersistenceAdapter implements FollowingCommandPort private final FollowingJpaRepository followingJpaRepository; private final UserJpaRepository userJpaRepository; - private final AliasJpaRepository aliasJpaRepository; private final FollowingMapper followingMapper; private final UserMapper userMapper; diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java index 16bb53ec9..b8d9a774e 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java @@ -2,10 +2,12 @@ import konkuk.thip.common.util.CursorBasedList; import konkuk.thip.common.util.DateUtil; +import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.application.port.out.dto.FollowingQueryDto; import konkuk.thip.user.application.port.out.dto.UserQueryDto; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; import konkuk.thip.user.application.port.out.FollowingQueryPort; +import konkuk.thip.user.domain.value.Alias; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -44,7 +46,10 @@ public CursorBasedList getFollowingByUserId(Long userId, String cu @Override public List getLatestFollowerImageUrls(Long userId, int size) { - return followingJpaRepository.findLatestFollowerImageUrls(userId, size); + return followingJpaRepository.findLatestFollowers(userId, size).stream() + .map(UserJpaEntity::getAlias) + .map(Alias::getImageUrl) + .toList(); } @Override 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 dd73bf0dd..ee76028d1 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 @@ -1,10 +1,8 @@ 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.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.mapper.UserMapper; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.user.application.port.out.UserCommandPort; import konkuk.thip.user.domain.User; @@ -24,16 +22,12 @@ public class UserCommandPersistenceAdapter implements UserCommandPort { private final UserJpaRepository userJpaRepository; - private final AliasJpaRepository aliasJpaRepository; private final UserMapper userMapper; @Override public Long save(User user) { - AliasJpaEntity aliasJpaEntity = aliasJpaRepository.findByValue(user.getAlias().getValue()).orElseThrow( - () -> new EntityNotFoundException(ALIAS_NOT_FOUND)); - - UserJpaEntity userJpaEntity = userMapper.toJpaEntity(user, aliasJpaEntity); + UserJpaEntity userJpaEntity = userMapper.toJpaEntity(user); return userJpaRepository.save(userJpaEntity).getUserId(); } @@ -59,13 +53,7 @@ public void update(User user) { () -> new EntityNotFoundException(USER_NOT_FOUND) ); - aliasJpaRepository.findByValue(user.getAlias().getValue()).ifPresentOrElse( - aliasJpaEntity -> userJpaEntity.updateIncludeAliasFrom(user, aliasJpaEntity), - () -> { - throw new EntityNotFoundException(ALIAS_NOT_FOUND); - } - ); - + userJpaEntity.updateIncludeAliasFrom(user); userJpaRepository.save(userJpaEntity); } } 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 e463f3b04..d95bce510 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 @@ -5,8 +5,6 @@ import konkuk.thip.user.adapter.out.persistence.function.ReactionQueryFunction; import konkuk.thip.user.application.port.out.dto.ReactionQueryDto; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; -import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; import konkuk.thip.user.application.port.out.UserQueryPort; import konkuk.thip.user.application.port.out.dto.UserQueryDto; import lombok.RequiredArgsConstructor; @@ -21,7 +19,6 @@ public class UserQueryPersistenceAdapter implements UserQueryPort { private final UserJpaRepository userJpaRepository; - private final AliasJpaRepository aliasJpaRepository; @Override public boolean existsByNickname(String nickname) { @@ -43,11 +40,6 @@ public Set findUserIdsParticipatedInRoomsByBookId(Long bookId) { return userJpaRepository.findUserIdsByBookId(bookId); } - @Override - public UserViewAliasChoiceResult getAllAliasesAndCategories() { - return aliasJpaRepository.getAllAliasesAndCategories(); - } - @Override public List findUsersByNicknameOrderByAccuracy(String keyword, Long userId, Integer size) { return userJpaRepository.findUsersByNicknameOrderByAccuracy(keyword, userId, size); diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepositoryImpl.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepositoryImpl.java index 11bb0f6ba..d796d52df 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepositoryImpl.java @@ -7,13 +7,10 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import konkuk.thip.comment.adapter.out.jpa.QCommentJpaEntity; import konkuk.thip.common.entity.StatusType; -import konkuk.thip.feed.adapter.out.jpa.QFeedJpaEntity; import konkuk.thip.post.adapter.out.jpa.QPostJpaEntity; import konkuk.thip.post.adapter.out.jpa.QPostLikeJpaEntity; import konkuk.thip.room.adapter.out.jpa.QRoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.QRoomParticipantJpaEntity; -import konkuk.thip.user.adapter.out.jpa.QAliasJpaEntity; -import konkuk.thip.user.adapter.out.jpa.QFollowingJpaEntity; import konkuk.thip.user.adapter.out.jpa.QUserJpaEntity; import konkuk.thip.user.application.port.out.dto.QReactionQueryDto; import konkuk.thip.user.application.port.out.dto.QUserQueryDto; @@ -54,7 +51,6 @@ public Set findUserIdsByBookId(Long bookId) { @Override public List findUsersByNicknameOrderByAccuracy(String keyword, Long userId, Integer size) { QUserJpaEntity user = QUserJpaEntity.userJpaEntity; - QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; String pattern = "%" + keyword + "%"; @@ -68,14 +64,11 @@ public List findUsersByNicknameOrderByAccuracy(String keyword, Lon .select(new QUserQueryDto( user.userId, user.nickname, - alias.imageUrl, - alias.value, - alias.color, + user.alias, user.followerCount, user.createdAt )) .from(user) - .leftJoin(user.aliasForUserJpaEntity, alias) .where(user.nickname.like(pattern) .and(user.userId.ne(userId)) .and(user.status.eq(StatusType.ACTIVE))) diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasJpaRepository.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasJpaRepository.java deleted file mode 100644 index 96829e2f8..000000000 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasJpaRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package konkuk.thip.user.adapter.out.persistence.repository.alias; - -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/repository/alias/AliasQueryRepository.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasQueryRepository.java deleted file mode 100644 index d0518fa08..000000000 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasQueryRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package konkuk.thip.user.adapter.out.persistence.repository.alias; - -import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; - -public interface AliasQueryRepository { - - UserViewAliasChoiceResult getAllAliasesAndCategories(); -} diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasQueryRepositoryImpl.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasQueryRepositoryImpl.java deleted file mode 100644 index aa1629f75..000000000 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasQueryRepositoryImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package konkuk.thip.user.adapter.out.persistence.repository.alias; - -import com.querydsl.core.types.Projections; -import com.querydsl.jpa.impl.JPAQueryFactory; -import konkuk.thip.room.adapter.out.jpa.QCategoryJpaEntity; -import konkuk.thip.user.adapter.out.jpa.QAliasJpaEntity; -import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -@RequiredArgsConstructor -public class AliasQueryRepositoryImpl implements AliasQueryRepository { - - private final JPAQueryFactory jpaQueryFactory; - - @Override - public UserViewAliasChoiceResult getAllAliasesAndCategories() { - QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; - QCategoryJpaEntity category = QCategoryJpaEntity.categoryJpaEntity; - - List aliasChoices = jpaQueryFactory - .select(Projections.constructor( - UserViewAliasChoiceResult.AliasChoice.class, - // TODO : DB에 String alias 만 저장하도록 바뀐다면 쿼리 수정해야함 - alias.value, - category.value, - alias.imageUrl, - alias.color - )) - .from(alias) - .leftJoin(category) - .on(category.aliasForCategoryJpaEntity.eq(alias)) - .orderBy(alias.aliasId.asc()) - .fetch(); - - return new UserViewAliasChoiceResult(aliasChoices); - } -} diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java index c4bd3cf52..a2d8cd7fa 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java @@ -1,6 +1,7 @@ package konkuk.thip.user.adapter.out.persistence.repository.following; import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; +import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.application.port.out.dto.FollowingQueryDto; import konkuk.thip.user.application.port.out.dto.UserQueryDto; @@ -14,7 +15,7 @@ public interface FollowingQueryRepository { List findFollowerDtosByUserIdBeforeCreatedAt(Long userId, LocalDateTime cursor, int size); List findFollowingDtosByUserIdBeforeCreatedAt(Long userId, LocalDateTime cursor, int size); - List findLatestFollowerImageUrls(Long userId, int size); + List findLatestFollowers(Long userId, int size); List findAllFollowingUsersOrderByFollowedAtDesc(Long userId); } diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java index 3eb5650c3..28638b0fe 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java @@ -4,9 +4,9 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import konkuk.thip.common.entity.StatusType; import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; -import konkuk.thip.user.adapter.out.jpa.QAliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.QFollowingJpaEntity; import konkuk.thip.user.adapter.out.jpa.QUserJpaEntity; +import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.application.port.out.dto.FollowingQueryDto; import konkuk.thip.user.application.port.out.dto.QFollowingQueryDto; import konkuk.thip.user.application.port.out.dto.QUserQueryDto; @@ -61,7 +61,6 @@ public List findFollowingDtosByUserIdBeforeCreatedAt(Long userId, private List findFollowDtos(Long userId, LocalDateTime cursor, int size, boolean isFollowerQuery) { QFollowingJpaEntity following = QFollowingJpaEntity.followingJpaEntity; QUserJpaEntity user = QUserJpaEntity.userJpaEntity; - QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; BooleanBuilder condition = new BooleanBuilder() .and((isFollowerQuery ? following.followingUserJpaEntity.userId.eq(userId) : following.userJpaEntity.userId.eq(userId))) @@ -77,15 +76,12 @@ private List findFollowDtos(Long userId, LocalDateTime cursor, int .select(new QUserQueryDto( targetUser.userId, targetUser.nickname, - alias.imageUrl, - alias.value, - alias.color, + targetUser.alias, targetUser.followerCount, following.createdAt )) .from(following) .leftJoin(targetUser, user) - .leftJoin(user.aliasForUserJpaEntity, alias) .where(condition) .orderBy(following.createdAt.desc()) .limit(size + 1) @@ -93,16 +89,14 @@ private List findFollowDtos(Long userId, LocalDateTime cursor, int } @Override - public List findLatestFollowerImageUrls(Long userId, int size) { + public List findLatestFollowers(Long userId, int size) { QFollowingJpaEntity following = QFollowingJpaEntity.followingJpaEntity; QUserJpaEntity follower = QUserJpaEntity.userJpaEntity; // userId 를 팔로우하는 사람들(= follower) - QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; return jpaQueryFactory - .select(alias.imageUrl) + .select(follower) .from(following) .join(following.userJpaEntity, follower) - .join(follower.aliasForUserJpaEntity, alias) .where(following.followingUserJpaEntity.userId.eq(userId) .and(following.status.eq(StatusType.ACTIVE))) .orderBy(following.createdAt.desc()) @@ -114,18 +108,16 @@ public List findLatestFollowerImageUrls(Long userId, int size) { public List findAllFollowingUsersOrderByFollowedAtDesc(Long userId) { QFollowingJpaEntity following = QFollowingJpaEntity.followingJpaEntity; QUserJpaEntity followingTargetUser = QUserJpaEntity.userJpaEntity; - QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; return jpaQueryFactory.select(new QFollowingQueryDto( following.userJpaEntity.userId, followingTargetUser.userId, followingTargetUser.nickname, - alias.imageUrl, + followingTargetUser.alias, following.createdAt )) .from(following) .join(following.followingUserJpaEntity, followingTargetUser) - .join(followingTargetUser.aliasForUserJpaEntity, alias) .where( following.userJpaEntity.userId.eq(userId) .and(following.userJpaEntity.status.eq(StatusType.ACTIVE)) 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 ea93e4495..dce23f985 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 @@ -7,7 +7,7 @@ public record UserViewAliasChoiceResult(List aliasChoices) { public record AliasChoice( String aliasName, String categoryName, - String imageUrl, + String imageUrl, // 칭호 이미지 url String aliasColor ) {} } 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 e83d76c3c..29be62336 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 @@ -18,8 +18,6 @@ public interface UserQueryPort { Set findUserIdsParticipatedInRoomsByBookId(Long bookId); - UserViewAliasChoiceResult getAllAliasesAndCategories(); - List findUsersByNicknameOrderByAccuracy(String keyword, Long userId, Integer size); CursorBasedList findLikeReactionsByUserId(Long userId, Cursor cursor, String label); diff --git a/src/main/java/konkuk/thip/user/application/port/out/dto/FollowingQueryDto.java b/src/main/java/konkuk/thip/user/application/port/out/dto/FollowingQueryDto.java index d406e6ad9..1c6479c93 100644 --- a/src/main/java/konkuk/thip/user/application/port/out/dto/FollowingQueryDto.java +++ b/src/main/java/konkuk/thip/user/application/port/out/dto/FollowingQueryDto.java @@ -1,6 +1,7 @@ package konkuk.thip.user.application.port.out.dto; import com.querydsl.core.annotations.QueryProjection; +import konkuk.thip.user.domain.value.Alias; import java.time.LocalDateTime; @@ -12,5 +13,19 @@ public record FollowingQueryDto( LocalDateTime followedAt ) { @QueryProjection - public FollowingQueryDto {} + public FollowingQueryDto ( + Long userId, + Long followingTargetUserId, + String followingUserNickname, + Alias followingUserAlias, + LocalDateTime followedAt + ){ + this( + userId, + followingTargetUserId, + followingUserNickname, + followingUserAlias.getImageUrl(), + followedAt + ); + } } diff --git a/src/main/java/konkuk/thip/user/application/port/out/dto/UserQueryDto.java b/src/main/java/konkuk/thip/user/application/port/out/dto/UserQueryDto.java index 71dda165b..4cdef8576 100644 --- a/src/main/java/konkuk/thip/user/application/port/out/dto/UserQueryDto.java +++ b/src/main/java/konkuk/thip/user/application/port/out/dto/UserQueryDto.java @@ -1,7 +1,7 @@ package konkuk.thip.user.application.port.out.dto; import com.querydsl.core.annotations.QueryProjection; -import org.springframework.util.Assert; +import konkuk.thip.user.domain.value.Alias; import java.time.LocalDateTime; @@ -14,13 +14,27 @@ public record UserQueryDto(Long userId, LocalDateTime createdAt) { @QueryProjection - public UserQueryDto { - Assert.notNull(userId, "userId must not be null"); - Assert.notNull(nickname, "nickname must not be null"); - Assert.notNull(profileImageUrl, "profileImageUrl must not be null"); - Assert.notNull(aliasName, "aliasName must not be null"); - Assert.notNull(aliasColor, "aliasColor must not be null"); -// Assert.notNull(followerCount, "followerCount must not be null"); // 내 팔로잉 목록 조회에서는 필요 x - Assert.notNull(createdAt, "createdAt must not be null"); + public UserQueryDto ( + Long userId, + String nickname, + Alias userAlias, + Integer followerCount, + LocalDateTime createdAt + ){ +// Assert.notNull(userId, "userId must not be null"); +// Assert.notNull(nickname, "nickname must not be null"); +// Assert.notNull(userAlias, "userAlias must not be null"); +//// Assert.notNull(followerCount, "followerCount must not be null"); // 내 팔로잉 목록 조회에서는 필요 x +// Assert.notNull(createdAt, "createdAt must not be null"); + + this( + userId, + nickname, + userAlias.getImageUrl(), + userAlias.getValue(), + userAlias.getColor(), + followerCount, + createdAt + ); } } 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 55507539c..04eb3323b 100644 --- a/src/main/java/konkuk/thip/user/application/service/UserSignupService.java +++ b/src/main/java/konkuk/thip/user/application/service/UserSignupService.java @@ -8,7 +8,7 @@ import konkuk.thip.user.application.port.in.dto.UserSignupResult; import konkuk.thip.user.application.port.out.UserCommandPort; import konkuk.thip.user.application.port.out.UserQueryPort; -import konkuk.thip.user.domain.Alias; +import konkuk.thip.user.domain.value.Alias; import konkuk.thip.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/konkuk/thip/user/application/service/UserUpdateService.java b/src/main/java/konkuk/thip/user/application/service/UserUpdateService.java index 28ec23707..4919c9bd6 100644 --- a/src/main/java/konkuk/thip/user/application/service/UserUpdateService.java +++ b/src/main/java/konkuk/thip/user/application/service/UserUpdateService.java @@ -6,7 +6,7 @@ import konkuk.thip.user.application.port.in.dto.UserUpdateCommand; import konkuk.thip.user.application.port.out.UserCommandPort; import konkuk.thip.user.application.port.out.UserQueryPort; -import konkuk.thip.user.domain.Alias; +import konkuk.thip.user.domain.value.Alias; import konkuk.thip.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; 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 50c64cd2f..3fe0fe9d8 100644 --- a/src/main/java/konkuk/thip/user/application/service/UserViewAliasChoiceService.java +++ b/src/main/java/konkuk/thip/user/application/service/UserViewAliasChoiceService.java @@ -1,19 +1,31 @@ package konkuk.thip.user.application.service; +import konkuk.thip.common.util.EnumMappings; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.application.port.in.UserViewAliasChoiceUseCase; import konkuk.thip.user.application.port.in.dto.UserViewAliasChoiceResult; -import konkuk.thip.user.application.port.out.UserQueryPort; +import konkuk.thip.user.domain.value.Alias; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.Map; + @Service @RequiredArgsConstructor public class UserViewAliasChoiceService implements UserViewAliasChoiceUseCase { - private final UserQueryPort userQueryPort; - @Override public UserViewAliasChoiceResult getAllAliasesAndCategories() { - return userQueryPort.getAllAliasesAndCategories(); + Map aliasToCategory = EnumMappings.getAliasToCategory(); + + return new UserViewAliasChoiceResult( + aliasToCategory.entrySet().stream() + .map(entry -> new UserViewAliasChoiceResult.AliasChoice( + entry.getKey().getValue(), + entry.getValue().getValue(), + entry.getKey().getImageUrl(), + entry.getKey().getColor() + )).toList() + ); } } diff --git a/src/main/java/konkuk/thip/user/domain/User.java b/src/main/java/konkuk/thip/user/domain/User.java index 9a5e12786..d6df512f8 100644 --- a/src/main/java/konkuk/thip/user/domain/User.java +++ b/src/main/java/konkuk/thip/user/domain/User.java @@ -3,6 +3,7 @@ import konkuk.thip.common.entity.BaseDomainEntity; import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.common.exception.code.ErrorCode; +import konkuk.thip.user.domain.value.Alias; import lombok.Getter; import lombok.experimental.SuperBuilder; diff --git a/src/main/java/konkuk/thip/user/domain/Alias.java b/src/main/java/konkuk/thip/user/domain/value/Alias.java similarity index 97% rename from src/main/java/konkuk/thip/user/domain/Alias.java rename to src/main/java/konkuk/thip/user/domain/value/Alias.java index cf145530f..4ea9cbe78 100644 --- a/src/main/java/konkuk/thip/user/domain/Alias.java +++ b/src/main/java/konkuk/thip/user/domain/value/Alias.java @@ -1,4 +1,4 @@ -package konkuk.thip.user.domain; +package konkuk.thip.user.domain.value; import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.common.exception.code.ErrorCode; diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedApiTest.java index c8db670b7..543e136d2 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedApiTest.java @@ -9,11 +9,10 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.book.adapter.out.jpa.SavedBookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.SavedBookJpaRepository; -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.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -46,9 +45,6 @@ class BookChangeSavedApiTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private BookJpaRepository bookJpaRepository; @@ -68,14 +64,14 @@ class BookChangeSavedApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); // 테스트책 미리 저장 @@ -99,7 +95,6 @@ void tearDown() { savedBookJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchApiTest.java index 34ddce6e4..ba428423b 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchApiTest.java @@ -6,20 +6,18 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; import konkuk.thip.book.adapter.out.jpa.SavedBookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.SavedBookJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -54,21 +52,17 @@ class BookDetailSearchApiTest { private FeedJpaRepository feedJpaRepository; @Autowired private SavedBookJpaRepository savedBookJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired - private CategoryJpaRepository categoryJpaRepository; @BeforeEach void setup() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() @@ -82,7 +76,7 @@ void setup() { .description("한강의 소설") .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); RoomJpaEntity room = roomJpaRepository.save(RoomJpaEntity.builder() .title("한강 독서모임") @@ -93,7 +87,7 @@ void setup() { .endDate(LocalDate.now().plusDays(30)) .recruitCount(10) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); roomParticipantJpaRepository.save(RoomParticipantJpaEntity.builder() @@ -126,8 +120,6 @@ void tearDown() { roomJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @@ -166,7 +158,7 @@ void searchDetailBooks_NoRecruitingRooms_ReturnsZero() { .endDate(LocalDate.now().minusDays(5)) .recruitCount(10) .bookJpaEntity(book) - .categoryJpaEntity(categoryJpaRepository.findAll().get(0)) + .category(Category.LITERATURE) .build(); roomJpaRepository.save(pastRoom); diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookGetSelectableListApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookGetSelectableListApiTest.java index 5bdd6f766..5e880dac9 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookGetSelectableListApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookGetSelectableListApiTest.java @@ -4,16 +4,14 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.book.adapter.out.persistence.repository.SavedBookJpaRepository; 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.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -38,10 +36,8 @@ class BookGetSelectableListApiTest { @Autowired private MockMvc mockMvc; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private SavedBookJpaRepository savedBookJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @@ -51,7 +47,7 @@ class BookGetSelectableListApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); savedBook = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("1111111111111")); joiningBook = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("2222222222222")); @@ -60,7 +56,7 @@ void setUp() { savedBookJpaRepository.save(TestEntityFactory.createSavedBook(user, savedBook)); // JOINING 책용 방 생성 - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(joiningBook, category)); roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, user, RoomParticipantRole.HOST, 0.0)); } @@ -88,4 +84,4 @@ void getSelectableBooks_joining_success() throws Exception { .andExpect(jsonPath("$.data.bookList.length()").value(1)) .andExpect(jsonPath("$.data.bookList[0].isbn").value(joiningBook.getIsbn())); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksApiTest.java index a09d7fbe7..b332bfd5a 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksApiTest.java @@ -4,11 +4,10 @@ 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; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -44,9 +43,6 @@ class BookMostSearchedBooksApiTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private RedisTemplate redisTemplate; @@ -64,7 +60,7 @@ class BookMostSearchedBooksApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") @@ -72,14 +68,13 @@ void setUp() { .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .nicknameUpdatedAt(LocalDate.now().minusMonths(1)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); } @AfterEach void tearDown() { userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @@ -164,6 +159,4 @@ void getMostSearchedBooks_returnsEmptyList_whenNoData() throws Exception { assertThat(bookList).isNotNull(); assertThat(bookList.size()).isEqualTo(0); } - - } diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookRecruitingRoomApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookRecruitingRoomApiTest.java index 00154c844..adfbc9bd2 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookRecruitingRoomApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookRecruitingRoomApiTest.java @@ -5,15 +5,13 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -50,15 +48,9 @@ class BookRecruitingRoomApiTest { @Autowired private RoomJpaRepository roomJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private CategoryJpaRepository categoryJpaRepository; - @Test @DisplayName("모집 중인 방 목록 조회 성공") void getRecruitingRoomsByIsbn_success() throws Exception { @@ -74,17 +66,17 @@ void getRecruitingRoomsByIsbn_success() throws Exception { .bestSeller(false) .build()); - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_999") .nickname("유저") .nicknameUpdatedAt(LocalDate.now().minusMonths(6)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); RoomJpaEntity recruitingRoom = roomJpaRepository.save(RoomJpaEntity.builder() .title("모집 중 방") @@ -95,7 +87,7 @@ void getRecruitingRoomsByIsbn_success() throws Exception { .endDate(LocalDate.now().plusDays(30)) .recruitCount(5) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); RoomJpaEntity nonRecruitingRoom = roomJpaRepository.save(RoomJpaEntity.builder() @@ -107,7 +99,7 @@ void getRecruitingRoomsByIsbn_success() throws Exception { .endDate(LocalDate.now().minusDays(1)) .recruitCount(5) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); // when & then @@ -139,8 +131,8 @@ void getRecruitingRoomsWithCursor_success() throws Exception { // given String isbn = "1234567890123"; BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN(isbn)); - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Alias alias = TestEntityFactory.createLiteratureAlias(); + Category category = TestEntityFactory.createLiteratureCategory(); for (int i = 0; i < 15; i++) { roomJpaRepository.save(TestEntityFactory.createCustomRoom( @@ -174,4 +166,4 @@ void getRecruitingRoomsWithCursor_success() throws Exception { .andExpect(jsonPath("$.data.nextCursor").doesNotExist()) .andExpect(jsonPath("$.data.isLast").value(true)); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookSearchApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookSearchApiTest.java index a1b1f13ba..7a8989bc6 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookSearchApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookSearchApiTest.java @@ -6,11 +6,10 @@ import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchJpaEntity; import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchType; import konkuk.thip.recentSearch.adapter.out.persistence.repository.RecentSearchJpaRepository; -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.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -42,9 +41,6 @@ class BookSearchApiTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private RecentSearchJpaRepository recentSearchJpaRepository; @@ -55,14 +51,14 @@ class BookSearchApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); RecentSearchJpaEntity recentSearch = recentSearchJpaRepository.save(RecentSearchJpaEntity.builder() @@ -78,7 +74,6 @@ void setUp() { void tearDown() { recentSearchJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookShowSavedListApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookShowSavedListApiTest.java index d19521bbf..9d4f5be82 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookShowSavedListApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookShowSavedListApiTest.java @@ -4,10 +4,9 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.book.adapter.out.persistence.repository.SavedBookJpaRepository; 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.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -32,7 +31,6 @@ class BookShowSavedListApiTest { @Autowired private MockMvc mockMvc; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private SavedBookJpaRepository savedBookJpaRepository; @@ -41,7 +39,7 @@ class BookShowSavedListApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); savedBook = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("1111111111111")); savedBookJpaRepository.save(TestEntityFactory.createSavedBook(user, savedBook)); @@ -57,5 +55,4 @@ void getSavedBooks_success() throws Exception { .andExpect(jsonPath("$.data.bookList.length()").value(1)) .andExpect(jsonPath("$.data.bookList[0].isbn").value(savedBook.getIsbn())); } - -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentChangeLikeStatusApiTest.java b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentChangeLikeStatusApiTest.java index 6b3944001..6f395291c 100644 --- a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentChangeLikeStatusApiTest.java +++ b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentChangeLikeStatusApiTest.java @@ -12,14 +12,12 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -50,9 +48,7 @@ class CommentChangeLikeStatusApiTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private CommentJpaRepository commentJpaRepository; @@ -60,9 +56,9 @@ class CommentChangeLikeStatusApiTest { @Autowired private RoomJpaRepository roomJpaRepository; - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; + private Category category; private FeedJpaEntity feed; private BookJpaEntity book; private RoomJpaEntity room; @@ -70,9 +66,9 @@ class CommentChangeLikeStatusApiTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); room = roomJpaRepository.save(TestEntityFactory.createRoom(book,category)); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)); diff --git a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentCreateApiTest.java b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentCreateApiTest.java index 49d1dcd48..7d0d26958 100644 --- a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentCreateApiTest.java +++ b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentCreateApiTest.java @@ -7,20 +7,18 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -53,9 +51,7 @@ class CommentCreateApiTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private VoteJpaRepository voteJpaRepository; @@ -64,11 +60,9 @@ class CommentCreateApiTest { @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; - - - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; + private Category category; private FeedJpaEntity feed; private BookJpaEntity book; private RecordJpaEntity record; @@ -77,9 +71,9 @@ class CommentCreateApiTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); room = roomJpaRepository.save(TestEntityFactory.createRoom(book,category)); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)); diff --git a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentCreateControllerTest.java b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentCreateControllerTest.java index 2288bb545..4c1640329 100644 --- a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentCreateControllerTest.java +++ b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentCreateControllerTest.java @@ -7,20 +7,18 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -55,9 +53,7 @@ class CommentCreateControllerTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private VoteJpaRepository voteJpaRepository; @@ -66,10 +62,9 @@ class CommentCreateControllerTest { @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; - - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; + private Category category; private FeedJpaEntity feed; private BookJpaEntity book; private RecordJpaEntity record; @@ -78,9 +73,9 @@ class CommentCreateControllerTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); room = roomJpaRepository.save(TestEntityFactory.createRoom(book,category)); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)); @@ -89,7 +84,6 @@ record = recordJpaRepository.save(TestEntityFactory.createRecord(user,room)); roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, user, RoomParticipantRole.HOST, 0.0)); } - private Map buildValidRequest() { Map req = new HashMap<>(); req.put("content", "정상 댓글"); diff --git a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentDeleteApiTest.java b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentDeleteApiTest.java index bf6950c50..cfa56328f 100644 --- a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentDeleteApiTest.java +++ b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentDeleteApiTest.java @@ -8,20 +8,18 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -47,9 +45,7 @@ class CommentDeleteApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private VoteJpaRepository voteJpaRepository; @@ -59,9 +55,9 @@ class CommentDeleteApiTest { @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @Autowired private CommentLikeJpaRepository commentLikeJpaRepository; - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; + private Category category; private FeedJpaEntity feed; private BookJpaEntity book; private RecordJpaEntity record; @@ -70,9 +66,9 @@ class CommentDeleteApiTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); room = roomJpaRepository.save(TestEntityFactory.createRoom(book,category)); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)); @@ -92,8 +88,6 @@ void tearDown() { roomJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test diff --git a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentShowAllApiTest.java b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentShowAllApiTest.java index c2a8e42e2..9f0b13de4 100644 --- a/src/test/java/konkuk/thip/comment/adapter/in/web/CommentShowAllApiTest.java +++ b/src/test/java/konkuk/thip/comment/adapter/in/web/CommentShowAllApiTest.java @@ -10,10 +10,9 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -41,7 +40,6 @@ class CommentShowAllApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @@ -57,7 +55,6 @@ void tearDown() { commentJpaRepository.deleteAllInBatch(); feedJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); } @@ -65,7 +62,7 @@ void tearDown() { @DisplayName("댓글 조회 요청에 대하여, 특정 게시글(= 피드, 기록, 투표)의 루트 댓글, 루트 댓글의 모든 자식 댓글의 데이터를 구분하여 반환한다.") void comment_show_all_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); @@ -121,7 +118,7 @@ void comment_show_all_test() throws Exception { @DisplayName("루트 댓글은 최신순, 루트 댓글의 모든 자식 댓글은 작성 시각순으로 정렬하여 반환한다.") void comment_show_all_ordering_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); @@ -193,7 +190,7 @@ void comment_show_all_ordering_test() throws Exception { @DisplayName("삭제된 루트 댓글의 경우, 자식 댓글이 있으면 반환하고, 없으면 반환하지 않는다.") void comment_show_all_deleted_root_comment_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); @@ -255,7 +252,7 @@ void comment_show_all_deleted_root_comment_test() throws Exception { @DisplayName("게시글에 달린 댓글이 많을 경우, 루트 댓글을 기준으로 페이징 처리 한다.") void comment_show_all_page_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); diff --git a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java index 733978f23..697458718 100644 --- a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java +++ b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java @@ -5,26 +5,25 @@ import konkuk.thip.comment.adapter.out.jpa.CommentJpaEntity; import konkuk.thip.comment.adapter.out.jpa.CommentLikeJpaEntity; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.FeedTagJpaEntity; import konkuk.thip.feed.adapter.out.jpa.SavedFeedJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.feed.domain.value.TagList; import konkuk.thip.feed.domain.value.ContentList; import konkuk.thip.post.adapter.out.jpa.PostJpaEntity; import konkuk.thip.post.adapter.out.jpa.PostLikeJpaEntity; import konkuk.thip.post.domain.PostType; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; -import konkuk.thip.room.domain.Category; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.*; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; 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.value.Alias; import java.time.LocalDate; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -34,54 +33,42 @@ public class TestEntityFactory { * 유효한 Jpa entity를 만들어주는 Factory */ - public static AliasJpaEntity createLiteratureAlias() { - return AliasJpaEntity.builder() // 실제 존재하는 값으로 - .value(Alias.WRITER.getValue()) - .imageUrl(Alias.WRITER.getImageUrl()) - .color(Alias.WRITER.getColor()) - .build(); + public static Alias createLiteratureAlias() { + return Alias.WRITER; } - public static CategoryJpaEntity createLiteratureCategory(AliasJpaEntity alias) { - return CategoryJpaEntity.builder() // 실제 존재하는 값으로 - .value(Category.LITERATURE.getValue()) - .imageUrl(Category.LITERATURE.getImageUrl()) - .aliasForCategoryJpaEntity(alias) - .build(); + public static Category createLiteratureCategory() { + return Category.LITERATURE; } - public static AliasJpaEntity createScienceAlias() { - return AliasJpaEntity.builder() // 실제 존재하는 값으로 - .value(Alias.SCIENTIST.getValue()) - .imageUrl(Alias.SCIENTIST.getImageUrl()) - .color(Alias.SCIENTIST.getColor()) - .build(); + public static Alias createScienceAlias() { + return Alias.SCIENTIST; } - public static CategoryJpaEntity createScienceCategory(AliasJpaEntity alias) { - return CategoryJpaEntity.builder() // 실제 존재하는 값으로 - .value(Category.SCIENCE_IT.getValue()) - .imageUrl(Category.SCIENCE_IT.getImageUrl()) - .aliasForCategoryJpaEntity(alias) - .build(); + public static Category createScienceCategory() { + return Category.SCIENCE_IT; } - public static UserJpaEntity createUser(AliasJpaEntity alias) { + public static List createTagsFromCategory(Category category) { + return EnumMappings.tagsFrom(category); + } + + public static UserJpaEntity createUser(Alias alias) { return UserJpaEntity.builder() .nickname("테스터") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("kakao_12345678") - .aliasForUserJpaEntity(alias) + .alias(alias) .role(UserRole.USER) .build(); } - public static UserJpaEntity createUser(AliasJpaEntity alias, String nickname) { + public static UserJpaEntity createUser(Alias alias, String nickname) { return UserJpaEntity.builder() .nickname(nickname) .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("kakao_12345678") - .aliasForUserJpaEntity(alias) + .alias(alias) .role(UserRole.USER) .build(); } @@ -141,7 +128,7 @@ public static BookJpaEntity createBookWithISBN(String isbn) { .build(); } - public static RoomJpaEntity createRoom(BookJpaEntity book, CategoryJpaEntity category) { + public static RoomJpaEntity createRoom(BookJpaEntity book, Category category) { return RoomJpaEntity.builder() .title("방이름") .description("설명") @@ -150,11 +137,11 @@ public static RoomJpaEntity createRoom(BookJpaEntity book, CategoryJpaEntity cat .endDate(LocalDate.now().plusDays(5)) .recruitCount(3) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build(); } - public static RoomJpaEntity createCustomRoom(BookJpaEntity book, CategoryJpaEntity category, LocalDate startDate, LocalDate endDate) { + public static RoomJpaEntity createCustomRoom(BookJpaEntity book, Category category, LocalDate startDate, LocalDate endDate) { return RoomJpaEntity.builder() .title("방이름") .description("설명") @@ -163,11 +150,11 @@ public static RoomJpaEntity createCustomRoom(BookJpaEntity book, CategoryJpaEnti .endDate(endDate) .recruitCount(3) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build(); } - public static RoomJpaEntity createCustomRoom(BookJpaEntity book, CategoryJpaEntity category, String roomName, LocalDate startDate, LocalDate endDate) { + public static RoomJpaEntity createCustomRoom(BookJpaEntity book, Category category, String roomName, LocalDate startDate, LocalDate endDate) { return RoomJpaEntity.builder() .title(roomName) .description("설명") @@ -176,7 +163,7 @@ public static RoomJpaEntity createCustomRoom(BookJpaEntity book, CategoryJpaEnti .endDate(endDate) .recruitCount(20) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build(); } @@ -288,52 +275,58 @@ public static FollowingJpaEntity createFollowing(UserJpaEntity followerUser, Use .build(); } - public static TagJpaEntity createTag(CategoryJpaEntity category,String value) { - return TagJpaEntity.builder() - .categoryJpaEntity(category) - .value(value) - .build(); - } - /** * 공개/비공개 여부만을 설정하는 기본 피드 생성을 위한 팩토리 메서드 */ public static FeedJpaEntity createFeed(UserJpaEntity user, BookJpaEntity book, boolean isPublic) { - return FeedJpaEntity.builder() - .content("기본 피드 본문입니다.") - .isPublic(isPublic) - .likeCount(0) - .commentCount(0) - .reportCount(0) - .userJpaEntity(user) - .bookJpaEntity(book) - .contentList(ContentList.empty()) - .build(); - } - - public static FeedTagJpaEntity createFeedTagMapping(FeedJpaEntity feed, TagJpaEntity tag) { - return FeedTagJpaEntity.builder() - .feedJpaEntity(feed) - .tagJpaEntity(tag) - .build(); - } - - - public static FeedJpaEntity createFeedWithContents(UserJpaEntity user, BookJpaEntity book, List imageUrls, boolean isPublic) { - - FeedJpaEntity feed = FeedJpaEntity.builder() - .content("이미지 포함 피드") - .isPublic(isPublic) - .likeCount(0) - .commentCount(0) - .reportCount(0) - .userJpaEntity(user) - .bookJpaEntity(book) - .contentList(ContentList.of(imageUrls)) - .build(); - - return feed; +// return FeedJpaEntity.builder() +// .content("기본 피드 본문입니다.") +// .isPublic(isPublic) +// .likeCount(0) +// .commentCount(0) +// .reportCount(0) +// .userJpaEntity(user) +// .bookJpaEntity(book) +// .contentList(ContentList.empty()) +// .build(); + return createFeed(user, book, isPublic, 0, 0, Collections.emptyList(), Collections.emptyList()); + } + + public static FeedJpaEntity createFeed(UserJpaEntity user, BookJpaEntity book, boolean isPublic, int likeCount, int commentCount, List imageUrls) { + +// FeedJpaEntity feed = FeedJpaEntity.builder() +// .content("이미지 포함 피드") +// .isPublic(isPublic) +// .likeCount(0) +// .commentCount(0) +// .reportCount(0) +// .userJpaEntity(user) +// .bookJpaEntity(book) +// .contentList(ContentList.of(imageUrls)) +// .build(); +// + return createFeed(user, book, isPublic, likeCount, commentCount, imageUrls, Collections.emptyList()); + } + + public static FeedJpaEntity createFeed(UserJpaEntity user, BookJpaEntity book, List imageUrls, boolean isPublic) { + +// FeedJpaEntity feed = FeedJpaEntity.builder() +// .content("이미지 포함 피드") +// .isPublic(isPublic) +// .likeCount(0) +// .commentCount(0) +// .reportCount(0) +// .userJpaEntity(user) +// .bookJpaEntity(book) +// .contentList(ContentList.of(imageUrls)) +// .build(); +// + return createFeed(user, book, isPublic, 0, 0, imageUrls, Collections.emptyList()); + } + + public static FeedJpaEntity createFeed(UserJpaEntity user, BookJpaEntity book, boolean isPublic, List tags) { + return createFeed(user, book, isPublic, 0, 0, Collections.emptyList(), tags); } /** @@ -344,7 +337,9 @@ public static FeedJpaEntity createFeed(UserJpaEntity user, boolean isPublic, int likeCount, int commentCount, - List imageUrls) { + List imageUrls, + List tags + ) { // 1) 기본 Feed 엔티티 빌드 (content, reportCount 등은 테스트용 기본값) FeedJpaEntity feed = FeedJpaEntity.builder() .content("기본 피드 본문입니다.") @@ -355,6 +350,7 @@ public static FeedJpaEntity createFeed(UserJpaEntity user, .userJpaEntity(user) .bookJpaEntity(book) .contentList(ContentList.of(imageUrls)) + .tagList(TagList.of(tags)) .build(); return feed; diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/BasicFeedShowAllApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/BasicFeedShowAllApiTest.java index bf570b9b4..bf8dfb4a8 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/BasicFeedShowAllApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/BasicFeedShowAllApiTest.java @@ -9,11 +9,10 @@ import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; import konkuk.thip.feed.adapter.out.jpa.SavedFeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -44,9 +43,6 @@ class BasicFeedShowAllApiTest { @Autowired private MockMvc mockMvc; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; @@ -75,7 +71,6 @@ void tearDown() { feedJpaRepository.deleteAllInBatch(); followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); } @@ -83,7 +78,7 @@ void tearDown() { @DisplayName("피드 조회를 요청할 경우, [feedId, 작성자 닉네임, ,,] 의 피드 정보를 최신순으로 정렬해서 반환한다.") void feed_show_all_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createLiteratureAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); @@ -148,7 +143,7 @@ void feed_show_all_test() throws Exception { @DisplayName("피드는 [유저 본인이 작성한 글, 다른 모든 유저가 작성한 공개 글을 최신순] 으로 반환한다.") void feed_show_with_priority_and_order() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); @@ -210,7 +205,7 @@ void feed_show_with_priority_and_order() throws Exception { @DisplayName("request parameter의 cursor 값이 null일 경우, 첫번째 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void feed_show_first_page() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); @@ -303,7 +298,7 @@ void feed_show_first_page() throws Exception { @DisplayName("request parameter의 cursor 값이 존재할 경우, 해당 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void feed_show_with_cursor() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedChangeLikeStatusApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedChangeLikeStatusApiTest.java index c692e29e0..921c22204 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedChangeLikeStatusApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedChangeLikeStatusApiTest.java @@ -8,10 +8,9 @@ import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -30,8 +29,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - @SpringBootTest @ActiveProfiles("test") @AutoConfigureMockMvc(addFilters = false) @@ -43,7 +40,6 @@ class FeedChangeLikeStatusApiTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @@ -57,7 +53,7 @@ class FeedChangeLikeStatusApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)); diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedChangeSavedApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedChangeSavedApiTest.java index 5c7e263c4..d51dce63e 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedChangeSavedApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedChangeSavedApiTest.java @@ -8,15 +8,12 @@ import konkuk.thip.feed.adapter.in.web.request.FeedIsSavedRequest; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.Tag.TagJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.feed.adapter.out.jpa.SavedFeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -47,11 +44,8 @@ class FeedChangeSavedApiTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; - @Autowired private TagJpaRepository tagJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private SavedFeedJpaRepository savedFeedJpaRepository; @@ -61,13 +55,10 @@ class FeedChangeSavedApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); - tagJpaRepository.save(TestEntityFactory.createTag(category, "소설추천")); - tagJpaRepository.save(TestEntityFactory.createTag(category, "책추천")); - tagJpaRepository.save(TestEntityFactory.createTag(category, "오늘의책")); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)); } diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedCreateApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedCreateApiTest.java index 78147a56b..a76b8c6bc 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedCreateApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedCreateApiTest.java @@ -8,14 +8,9 @@ import konkuk.thip.config.TestS3MockConfig; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.FeedTag.FeedTagJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.Tag.TagJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -35,13 +30,12 @@ import java.util.List; import java.util.Map; -import static konkuk.thip.feed.domain.Tag.*; +import static konkuk.thip.feed.domain.value.Tag.*; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @SpringBootTest @ActiveProfiles("test") @AutoConfigureMockMvc(addFilters = false) @@ -56,54 +50,31 @@ class FeedCreateApiTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private CategoryJpaRepository categoryJpaRepository; - @Autowired private BookJpaRepository bookJpaRepository; - @Autowired - private TagJpaRepository tagJpaRepository; - @Autowired private FeedJpaRepository feedJpaRepository; - @Autowired - private FeedTagJpaRepository feedTagJpaRepository; - - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); - tagJpaRepository.save(TestEntityFactory.createTag(category,KOREAN_NOVEL.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag(category,FOREIGN_NOVEL.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag(category,CLASSIC_LITERATURE.getValue())); - } @AfterEach void tearDown() { - feedTagJpaRepository.deleteAll(); feedJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); - tagJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } - @Test @DisplayName("isbn 에 해당하는 책이 DB에 존재할 때, 해당 책과 연관된 피드를 생성할 수 있다.") void createFeedWithBookExistsInDB() throws Exception { @@ -115,7 +86,6 @@ void createFeedWithBookExistsInDB() throws Exception { request.put("isbn", "9788954682152"); // 책 ISBN request.put("contentBody", "이 책 정말 좋아요."); request.put("isPublic", true); - request.put("category", "문학"); //실제 카테고리 값 request.put("tagList", List.of(KOREAN_NOVEL.getValue(), FOREIGN_NOVEL.getValue(), CLASSIC_LITERATURE.getValue())); //실제 태그 값 MockMultipartFile requestPart = new MockMultipartFile( @@ -159,7 +129,6 @@ void createFeedWithBookNotExists_usesExternalAPI() throws Exception { request.put("isbn", isbn); request.put("contentBody", "외부 API를 통해 등록된 책 피드입니다."); request.put("isPublic", true); - request.put("category", "문학"); //실제 카테고리 값 request.put("tagList", List.of(KOREAN_NOVEL.getValue(), FOREIGN_NOVEL.getValue(), CLASSIC_LITERATURE.getValue())); //실제 태그 값 MockMultipartFile requestPart = new MockMultipartFile( @@ -212,7 +181,6 @@ void createFeedWithImages_createsContentEntities() throws Exception { request.put("isbn", "9788954682152"); // 책 ISBN request.put("contentBody", "이미지 테스트 피드"); request.put("isPublic", true); - request.put("category", "문학"); //실제 카테고리 값 request.put("tagList", List.of(KOREAN_NOVEL.getValue())); //실제 태그 값 MockMultipartFile requestPart = new MockMultipartFile( @@ -271,7 +239,6 @@ void createFeedWithoutImages_shouldHaveEmptyContentList() throws Exception { request.put("isbn", "9788954682152"); request.put("contentBody", "이미지 없는 피드"); request.put("isPublic", true); - request.put("category", "문학"); request.put("tagList", List.of(KOREAN_NOVEL.getValue())); //실제 태그 값 MockMultipartFile requestPart = new MockMultipartFile( @@ -301,7 +268,7 @@ void createFeedWithoutImages_shouldHaveEmptyContentList() throws Exception { @Test - @DisplayName("피드 생성시, 태그가 들어오면 feed_tags 매핑 테이블에 정상적으로 3개의 태그가 저장된된 후 관련 피드를 생성할 수 있다.") + @DisplayName("피드 생성시 태그가 들어오면, 태그를 포함한 피드가 DB에 저장된다.") void createFeedWithTags_createsFeedTagMappings() throws Exception { // given @@ -311,7 +278,6 @@ void createFeedWithTags_createsFeedTagMappings() throws Exception { request.put("isbn", "9788954682152"); request.put("contentBody", "태그 매핑 테스트 중입니다."); request.put("isPublic", true); - request.put("category", "문학"); request.put("tagList", List.of(KOREAN_NOVEL.getValue(), FOREIGN_NOVEL.getValue(), CLASSIC_LITERATURE.getValue())); //실제 태그 값 MockMultipartFile requestPart = new MockMultipartFile( @@ -343,15 +309,12 @@ void createFeedWithTags_createsFeedTagMappings() throws Exception { assertThat(feedJpaEntity.getIsPublic()).isTrue(); assertThat(feedJpaEntity.getPostId()).isEqualTo(postId); - // DB에 feed_tags 저장되었는지 확인 - long mappingCount = feedTagJpaRepository.findAll().stream() - .filter(f -> f.getFeedJpaEntity().getPostId().equals(postId)) - .count(); - assertThat(mappingCount).isEqualTo(3); + // 저장된 피드가 3개의 태그를 가지는지 확인 + assertThat(feedJpaEntity.getTagList().toUnmodifiableList().size()).isEqualTo(3); } @Test - @DisplayName("카테고리와 태그가 없는 피드는 feed_tags 매핑이 없어야 한다.") + @DisplayName("태그가 없는 피드는 태그가 없는 채로 DB에 저장된다.") void createFeedWithoutTags_shouldNotHaveFeedTags() throws Exception { // given bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); @@ -360,7 +323,6 @@ void createFeedWithoutTags_shouldNotHaveFeedTags() throws Exception { request.put("isbn", "9788954682152"); request.put("contentBody", "태그 없는 피드"); request.put("isPublic", true); - request.put("category", ""); // 카테고리 없이 request.put("tagList", List.of()); // 태그 없음 MockMultipartFile requestPart = new MockMultipartFile( @@ -384,12 +346,7 @@ void createFeedWithoutTags_shouldNotHaveFeedTags() throws Exception { JsonNode root = objectMapper.readTree(json); Long postId = root.path("data").path("feedId").asLong(); - long feedTagCount = feedTagJpaRepository.findAll().stream() - .filter(f -> f.getFeedJpaEntity().getPostId().equals(postId)) - .count(); - - assertThat(feedTagCount).isEqualTo(0); // feed_tags 매핑 없음 + FeedJpaEntity feedJpaEntity = feedJpaRepository.findById(postId).orElse(null); + assertThat(feedJpaEntity.getTagList().toUnmodifiableList().size()).isEqualTo(0); } - - } diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedCreateControllerTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedCreateControllerTest.java index 42c718ea9..f51d478ee 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedCreateControllerTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedCreateControllerTest.java @@ -1,6 +1,7 @@ package konkuk.thip.feed.adapter.in.web; import com.fasterxml.jackson.databind.ObjectMapper; +import konkuk.thip.feed.domain.value.Tag; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -35,18 +36,17 @@ class FeedCreateControllerTest { @Autowired private ObjectMapper objectMapper; - private Map buildValidRequest() { Map request = new HashMap<>(); request.put("isbn", "9788954682152"); request.put("contentBody", "테스트 콘텐츠"); request.put("isPublic", true); request.put("category", "문학"); - request.put("tagList", List.of("책추천", "소설추천")); + request.put("tagList", List.of(Tag.PHYSICS.getValue(), Tag.CHEMISTRY.getValue())); return request; } - private void assertBadRequest_InvalidFeedCreate(Map request, String message) throws Exception { + private void assertBadRequest_InvalidFeedCreate(Map request, String message, int errorCode) throws Exception { mockMvc.perform(multipart("/feeds") .file(new MockMultipartFile( "request", "", MediaType.APPLICATION_JSON_VALUE, @@ -54,7 +54,7 @@ private void assertBadRequest_InvalidFeedCreate(Map request, Str .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) .requestAttr("userId", 1L)) .andExpect(status().isBadRequest()) - .andExpect(jsonPath("$.code").value(INVALID_FEED_COMMAND.getCode())) + .andExpect(jsonPath("$.code").value(errorCode)) .andExpect(jsonPath("$.message", containsString(message))); } @@ -108,16 +108,17 @@ class TagValidation { @DisplayName("태그가 6개 이상이면 400 반환") void tooManyTags() throws Exception { Map req = buildValidRequest(); - req.put("tagList", List.of("1", "2", "3", "4", "5", "6")); - assertBadRequest_InvalidFeedCreate(req, "태그는 최대 5개까지 입력할 수 있습니다."); + req.put("tagList", List.of(Tag.PHYSICS.getValue(), Tag.CHEMISTRY.getValue(), Tag.BIOLOGY.getValue(), + Tag.ARCHITECTURE.getValue(), Tag.ARCHITECTURE.getValue(), Tag.DANCE.getValue())); + assertBadRequest_InvalidFeedCreate(req, TAG_LIST_SIZE_OVERFLOW.getMessage(),TAG_LIST_SIZE_OVERFLOW.getCode()); } @Test @DisplayName("태그가 중복되면 400 반환") void duplicatedTags() throws Exception { Map req = buildValidRequest(); - req.put("tagList", List.of("중복", "중복")); - assertBadRequest_InvalidFeedCreate(req, "태그는 중복 될 수 없습니다."); + req.put("tagList", List.of(Tag.PHYSICS.getValue(), Tag.PHYSICS.getValue())); + assertBadRequest_InvalidFeedCreate(req, TAG_SHOULD_BE_UNIQUE.getMessage(),TAG_SHOULD_BE_UNIQUE.getCode()); } } @@ -142,7 +143,6 @@ void tooManyImages() throws Exception { new MockMultipartFile("images", "img4.jpg", MediaType.IMAGE_JPEG_VALUE, "4".getBytes()) ); - ResultActions result = mockMvc.perform(multipart("/feeds") .file(requestPart) .file(images.get(0)) @@ -159,5 +159,4 @@ void tooManyImages() throws Exception { } } - } diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedDeleteApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedDeleteApiTest.java index 51e29f165..79ed5dc7c 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedDeleteApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedDeleteApiTest.java @@ -7,18 +7,12 @@ import konkuk.thip.comment.adapter.out.persistence.repository.CommentLikeJpaRepository; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.FeedTag.FeedTagJpaRepository; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.Tag.TagJpaRepository; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -33,8 +27,6 @@ import static konkuk.thip.common.entity.StatusType.INACTIVE; import static konkuk.thip.post.domain.PostType.FEED; -import static konkuk.thip.feed.domain.Tag.FOREIGN_NOVEL; -import static konkuk.thip.feed.domain.Tag.KOREAN_NOVEL; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; @@ -50,39 +42,25 @@ class FeedDeleteApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private CommentJpaRepository commentJpaRepository; @Autowired private CommentLikeJpaRepository commentLikeJpaRepository; - @Autowired private TagJpaRepository tagJpaRepository; - @Autowired private FeedTagJpaRepository feedTagJpaRepository; @Autowired private PostLikeJpaRepository postLikeJpaRepository; @Autowired private SavedFeedJpaRepository savedFeedJpaRepository; - private AliasJpaEntity alias; private UserJpaEntity user; - private CategoryJpaEntity category; private FeedJpaEntity feed; private BookJpaEntity book; - private TagJpaEntity tag1; - private TagJpaEntity tag2; private CommentJpaEntity comment; @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); - user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + user = userJpaRepository.save(TestEntityFactory.createUser(Alias.ARTIST)); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); - tag1 = tagJpaRepository.save(TestEntityFactory.createTag(category, KOREAN_NOVEL.getValue())); - tag2 = tagJpaRepository.save(TestEntityFactory.createTag(category, FOREIGN_NOVEL.getValue())); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user, book, true,1,1,List.of("url1", "url2", "url3"))); - feedTagJpaRepository.save(TestEntityFactory.createFeedTagMapping(feed, tag1)); - feedTagJpaRepository.save(TestEntityFactory.createFeedTagMapping(feed, tag2)); postLikeJpaRepository.save(TestEntityFactory.createPostLike(user,feed)); comment = commentJpaRepository.save(TestEntityFactory.createComment(feed, user, FEED)); commentLikeJpaRepository.save(TestEntityFactory.createCommentLike(comment,user)); @@ -105,9 +83,6 @@ void deleteFeed_success() throws Exception { // then: 1) 피드 soft delete (status=INACTIVE) assertThat(feedJpaRepository.findByPostIdAndStatus(feed.getPostId(), INACTIVE)).isPresent(); - // 2) 피드 태그 관계 삭제 - assertTrue(feedTagJpaRepository.findAll().isEmpty()); - // 4) 댓글 삭제 soft delete assertThat(commentJpaRepository.findById(comment.getCommentId())).isPresent(); assertThat(commentJpaRepository.findById(comment.getCommentId()).get().getStatus()).isEqualTo(INACTIVE); diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedRelatedWithBookApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedRelatedWithBookApiTest.java index c4b8d2610..66095fe48 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedRelatedWithBookApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedRelatedWithBookApiTest.java @@ -10,13 +10,11 @@ import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; import konkuk.thip.post.adapter.out.jpa.PostLikeJpaEntity; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -29,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -49,15 +48,9 @@ class FeedRelatedWithBookApiTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private CategoryJpaRepository categoryJpaRepository; - @Autowired private BookJpaRepository bookJpaRepository; @@ -266,23 +259,23 @@ void getFeedsByBook_cursor_paging_success() throws Exception { @DisplayName("비공개 피드 제외 검증") void getFeedsByBook_visibility_and_self_filter() throws Exception { // given - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity requester = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_req") .nickname("요청자") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN(VALID_ISBN)); // 자기 자신 글 두 개 생성 - FeedJpaEntity myPublic = TestEntityFactory.createFeed(requester, book, true); - FeedJpaEntity myPrivate = TestEntityFactory.createFeed(requester, book, false); + FeedJpaEntity myPublic = TestEntityFactory.createFeed(requester, book, true); // 내 공개 피드 + FeedJpaEntity myPrivate = TestEntityFactory.createFeed(requester, book, false); // 내 비공개 피드 feedJpaRepository.saveAll(List.of(myPublic, myPrivate)); // 다른 사람 공개 글 하나 생성 @@ -303,22 +296,29 @@ void getFeedsByBook_visibility_and_self_filter() throws Exception { JsonNode root = objectMapper.readTree(json); JsonNode feeds = root.path("data").path("feeds"); - // 자기 자신 글 제외 비공개 제외로 인해 only othersPublic 만 남아야 함 - assertThat(feeds.size()).isEqualTo(2); - assertThat(feeds.get(0).path("creatorId").asLong()).isEqualTo(other.getUserId()); - assertThat(feeds.get(0).path("isWriter").asBoolean()).isFalse(); + // 자기 자신 글은 포함 & 비공개 글은 제외 -> 자기 자신의 공개 피드 + othersPublic (= 2개)만 남아야 함 + List feedIds = new ArrayList<>(); + for (JsonNode f : feeds) { + feedIds.add(f.path("feedId").asLong()); + } + + assertThat(feedIds.size()).isEqualTo(2); + assertThat(feedIds).containsExactlyInAnyOrder( + myPublic.getPostId(), + othersPublic.getPostId() + ); } private TestData prepareDataForFeeds() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Alias alias = TestEntityFactory.createLiteratureAlias(); + Category category = TestEntityFactory.createLiteratureCategory(); UserJpaEntity requester = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_req") .nickname("요청자") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); UserJpaEntity author = userJpaRepository.save(TestEntityFactory.createUser(alias, "작성자")); @@ -326,7 +326,7 @@ private TestData prepareDataForFeeds() { BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN(VALID_ISBN)); // 공개 피드 두 개 비공개 하나 생성 - FeedJpaEntity publicFeed1 = TestEntityFactory.createFeedWithContents( + FeedJpaEntity publicFeed1 = TestEntityFactory.createFeed( author, book, List.of("http://img/1.jpg", "http://img/2.jpg"), @@ -334,7 +334,7 @@ private TestData prepareDataForFeeds() { ); publicFeed1.updateLikeCount(7); // 좋아요 정렬을 위해 수치 조정 - FeedJpaEntity publicFeed2 = TestEntityFactory.createFeedWithContents( + FeedJpaEntity publicFeed2 = TestEntityFactory.createFeed( author, book, List.of("http://img/3.jpg"), @@ -350,15 +350,14 @@ private TestData prepareDataForFeeds() { } private TestData prepareDataManyFeeds(int count) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); - categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + Alias alias = TestEntityFactory.createScienceAlias(); UserJpaEntity requester = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_req_many") .nickname("요청자") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); UserJpaEntity author = userJpaRepository.save(TestEntityFactory.createUser(alias, "작성자")); @@ -366,7 +365,7 @@ private TestData prepareDataManyFeeds(int count) { BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN(VALID_ISBN)); for (int i = 0; i < count; i++) { - FeedJpaEntity f = TestEntityFactory.createFeedWithContents( + FeedJpaEntity f = TestEntityFactory.createFeed( author, book, List.of("http://img/" + i + ".jpg"), @@ -386,4 +385,4 @@ private record TestData( FeedJpaEntity publicFeed1, FeedJpaEntity publicFeed2 ) {} -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowMineApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowMineApiTest.java index 42d4e991d..2b5fb1b69 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowMineApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowMineApiTest.java @@ -7,11 +7,10 @@ import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -41,9 +40,6 @@ class FeedShowMineApiTest { @Autowired private MockMvc mockMvc; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; @@ -72,7 +68,6 @@ void tearDown() { feedJpaRepository.deleteAllInBatch(); followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); } @@ -80,7 +75,7 @@ void tearDown() { @DisplayName("내 피드 조회를 요청할 경우, [feedId, 작성일, 책정보, ,,] 의 피드 정보를 최신순으로 정렬해서 반환한다.") void feed_show_mine_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity otherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "otherUser")); @@ -130,7 +125,7 @@ void feed_show_mine_test() throws Exception { @DisplayName("내 피드는 [유저 본인이 작성한 글을 최신순] 으로 반환한다.") void feed_show_mine_order_latest() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity otherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "otherUser")); @@ -194,7 +189,7 @@ void feed_show_mine_order_latest() throws Exception { @DisplayName("request parameter의 cursor 값이 null일 경우, 첫번째 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void feed_show_mine_first_page() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); // 공통 Book @@ -281,7 +276,7 @@ void feed_show_mine_first_page() throws Exception { @DisplayName("request parameter의 cursor 값이 존재할 경우, 해당 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void feed_show_mine_with_cursor() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); // 공통 Book diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSavedListApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSavedListApiTest.java index 6eea07861..4d3ff8597 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSavedListApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSavedListApiTest.java @@ -9,10 +9,9 @@ import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; import konkuk.thip.post.adapter.out.jpa.PostLikeJpaEntity; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -25,9 +24,7 @@ import java.sql.Timestamp; import java.time.LocalDateTime; -import java.util.HashSet; import java.util.List; -import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.*; @@ -44,7 +41,6 @@ class FeedShowSavedListApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @@ -58,7 +54,7 @@ class FeedShowSavedListApiTest { @DisplayName("저장된 피드 조회 시 피드 정보를 피드를 저장한 최신순으로 정렬해서 반환한다.") void saved_feed_show_test_success() throws Exception { // given - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(alias, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(alias, "user1")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); @@ -125,7 +121,7 @@ void saved_feed_show_test_success() throws Exception { void saved_feed_show_with_first_page() throws Exception { // given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); @@ -181,7 +177,7 @@ void saved_feed_show_with_first_page() throws Exception { @DisplayName("request parameter의 cursor 값이 존재할 경우, 해당 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void saved_feed_show_with_cursor() throws Exception { // given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSingleApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSingleApiTest.java index 33f9513df..244c43b52 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSingleApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSingleApiTest.java @@ -5,20 +5,15 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.jpa.SavedFeedJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.FeedTag.FeedTagJpaRepository; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.Tag.TagJpaRepository; -import konkuk.thip.feed.domain.Tag; +import konkuk.thip.feed.domain.value.Tag; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -45,28 +40,22 @@ class FeedShowSingleApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; - @Autowired private TagJpaRepository tagJpaRepository; - @Autowired private FeedTagJpaRepository feedTagJpaRepository; @Autowired private FollowingJpaRepository followingJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private SavedFeedJpaRepository savedFeedJpaRepository; @Autowired private PostLikeJpaRepository postLikeJpaRepository; + private List tags; + @AfterEach void tearDown() { postLikeJpaRepository.deleteAllInBatch(); savedFeedJpaRepository.deleteAllInBatch(); - feedTagJpaRepository.deleteAllInBatch(); - tagJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAllInBatch(); feedJpaRepository.deleteAllInBatch(); followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); } @@ -74,19 +63,16 @@ void tearDown() { @DisplayName("단일 피드 조회를 요청할 경우, [피드 정보, 피드 작성자 정보, 피드와 연관된 태그들] 등의 정보를 반환한다.") void feed_show_single_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity feedCreator = userJpaRepository.save(TestEntityFactory.createUser(a0, "feedCreator")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); // 공통 Book // 피드 및 피드 태그 생성 - CategoryJpaEntity c1 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); - TagJpaEntity t1 = tagJpaRepository.save(TestEntityFactory.createTag(c1, Tag.PHYSICS.getValue())); - TagJpaEntity t2 = tagJpaRepository.save(TestEntityFactory.createTag(c1, Tag.GENERAL_SCIENCE.getValue())); - FeedJpaEntity f1 = feedJpaRepository.save(TestEntityFactory.createFeed(feedCreator, book, true, 50, 10, List.of("content1", "content2"))); // feedCreator가 작성한 공개 피드 - feedTagJpaRepository.save(TestEntityFactory.createFeedTagMapping(f1, t1)); - feedTagJpaRepository.save(TestEntityFactory.createFeedTagMapping(f1, t2)); + Category c1 = TestEntityFactory.createScienceCategory(); + tags = List.of(Tag.PHYSICS, Tag.GENERAL_SCIENCE); + FeedJpaEntity f1 = feedJpaRepository.save(TestEntityFactory.createFeed(feedCreator, book, true, 50, 10, List.of("content1", "content2"), tags)); // feedCreator가 작성한 공개 피드 savedFeedJpaRepository.save( SavedFeedJpaEntity.builder() @@ -105,7 +91,7 @@ void feed_show_single_test() throws Exception { .andExpect(jsonPath("$.data.contentUrls", is(List.of("content1", "content2")))) // f1의 첨부파일 이미지 2개 .andExpect(jsonPath("$.data.isSaved", is(true))) // me가 f1을 저장했음 .andExpect(jsonPath("$.data.isLiked", is(false))) // me가 f1을 좋아하지 않음 - .andExpect(jsonPath("$.data.tagList", is(List.of(t1.getValue(), t2.getValue())))); // f1의 태그 value 2개 + .andExpect(jsonPath("$.data.tagList", is(List.of(Tag.PHYSICS.getValue(), Tag.GENERAL_SCIENCE.getValue())))); // f1의 태그 value 2개 } @@ -113,19 +99,15 @@ void feed_show_single_test() throws Exception { @DisplayName("피드 작성자가 아닌 다른 유저가 비공개 피드 단일 조회 요청을 할 경우, 400 error을 반환한다.") void feed_can_not_show_private_one() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity feedCreator = userJpaRepository.save(TestEntityFactory.createUser(a0, "feedCreator")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); // 공통 Book // 피드 및 피드 태그 생성 - CategoryJpaEntity c1 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); - TagJpaEntity t1 = tagJpaRepository.save(TestEntityFactory.createTag(c1, Tag.PHYSICS.getValue())); - TagJpaEntity t2 = tagJpaRepository.save(TestEntityFactory.createTag(c1, Tag.GENERAL_SCIENCE.getValue())); - FeedJpaEntity privateFeed = feedJpaRepository.save(TestEntityFactory.createFeed(feedCreator, book, false, 50, 10, List.of("content1", "content2"))); // feedCreator가 작성한 비공개 피드 - feedTagJpaRepository.save(TestEntityFactory.createFeedTagMapping(privateFeed, t1)); - feedTagJpaRepository.save(TestEntityFactory.createFeedTagMapping(privateFeed, t2)); + Category c1 = TestEntityFactory.createScienceCategory(); + FeedJpaEntity privateFeed = feedJpaRepository.save(TestEntityFactory.createFeed(feedCreator, book, false, 50, 10, List.of("content1", "content2"), List.of(Tag.PHYSICS, Tag.GENERAL_SCIENCE))); // feedCreator가 작성한 비공개 피드 //when //then mockMvc.perform(get("/feeds/{feedId}", privateFeed.getPostId()) @@ -138,18 +120,14 @@ void feed_can_not_show_private_one() throws Exception { @DisplayName("피드 작성자는 비공개 피드를 단일 조회할 수 있다.") void feed_can_show_private_one_by_feed_owner() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); // 공통 Book // 피드 및 피드 태그 생성 - CategoryJpaEntity c1 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); - TagJpaEntity t1 = tagJpaRepository.save(TestEntityFactory.createTag(c1, Tag.PHYSICS.getValue())); - TagJpaEntity t2 = tagJpaRepository.save(TestEntityFactory.createTag(c1, Tag.GENERAL_SCIENCE.getValue())); - FeedJpaEntity privateFeed = feedJpaRepository.save(TestEntityFactory.createFeed(me, book, false, 50, 10, List.of("content1", "content2"))); // me가 작성한 비공개 피드 - feedTagJpaRepository.save(TestEntityFactory.createFeedTagMapping(privateFeed, t1)); - feedTagJpaRepository.save(TestEntityFactory.createFeedTagMapping(privateFeed, t2)); + Category c1 = TestEntityFactory.createScienceCategory(); + FeedJpaEntity privateFeed = feedJpaRepository.save(TestEntityFactory.createFeed(me, book, false, 50, 10, List.of("content1", "content2"), List.of(Tag.PHYSICS, Tag.GENERAL_SCIENCE))); // me가 작성한 비공개 피드 //when //then mockMvc.perform(get("/feeds/{feedId}", privateFeed.getPostId()) diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSpecificUserApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSpecificUserApiTest.java index 3dd903eb4..59237330f 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSpecificUserApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowSpecificUserApiTest.java @@ -9,11 +9,10 @@ import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; import konkuk.thip.feed.adapter.out.jpa.SavedFeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -43,9 +42,6 @@ class FeedShowSpecificUserApiTest { @Autowired private MockMvc mockMvc; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; @@ -74,7 +70,6 @@ void tearDown() { feedJpaRepository.deleteAllInBatch(); followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); } @@ -82,7 +77,7 @@ void tearDown() { @DisplayName("특정 유저의 피드 조회를 요청할 경우, [feedId, 작성일, 책정보, ,,] 의 피드 정보를 최신순으로 정렬해서 반환한다.") void feed_show_all_of_user_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity otherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "otherUser")); @@ -155,7 +150,7 @@ void feed_show_all_of_user_test() throws Exception { @DisplayName("특정 유저의 피드는 [해당 유저가 작성한 공개 피드를 최신순] 으로 반환한다.") void feed_show_mine_order_latest() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity otherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "otherUser")); @@ -218,7 +213,7 @@ void feed_show_mine_order_latest() throws Exception { @DisplayName("request parameter의 cursor 값이 null일 경우, 첫번째 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void feed_show_mine_first_page() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity otherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "otherUser")); @@ -306,7 +301,7 @@ void feed_show_mine_first_page() throws Exception { @DisplayName("request parameter의 cursor 값이 존재할 경우, 해당 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void feed_show_mine_with_cursor() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity otherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "otherUser")); diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowUserInfoApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowUserInfoApiTest.java index 5a0e14a68..13e017cf0 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowUserInfoApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowUserInfoApiTest.java @@ -4,12 +4,11 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,7 +35,6 @@ class FeedShowUserInfoApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private FollowingJpaRepository followingJpaRepository; @@ -48,7 +46,6 @@ void tearDown() { feedJpaRepository.deleteAllInBatch(); followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); } @@ -56,8 +53,8 @@ void tearDown() { @DisplayName("내 피드에서의 유저 정보를 조회할 경우, 내 개인 정보, 나의 팔로워 정보, 내가 작성한 모든 피드 개수 를 반환한다.") void feed_show_mine_info_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); - AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); + Alias a1 = TestEntityFactory.createLiteratureAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity follower1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower1")); UserJpaEntity follower2 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower2")); @@ -101,8 +98,8 @@ void feed_show_mine_info_test() throws Exception { @DisplayName("나를 팔로우하는 사람이 많을 경우, 팔로우 맺은 일자 기준 최신순으로 최대 5명의 팔로워 프로필 이미지만을 반환한다.") void feed_show_mine_info_follower_many_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); - AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); + Alias a1 = TestEntityFactory.createLiteratureAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity follower1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower1")); UserJpaEntity follower2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower2")); @@ -165,8 +162,8 @@ void feed_show_mine_info_follower_many_test() throws Exception { @DisplayName("특정 유저 피드에서의 유저 정보를 조회할 경우, 유저 개인 정보, 유저의 팔로워 정보, 유저가 작성한 모든 '공개' 피드 개수 를 반환한다.") void feed_show_user_info_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); - AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); + Alias a1 = TestEntityFactory.createLiteratureAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity anotherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "anotherUser")); UserJpaEntity follower1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower1")); @@ -214,8 +211,8 @@ void feed_show_user_info_test() throws Exception { @DisplayName("accessToken의 유저가 특정 유저를 팔로잉하는 경우, isFollowing은 true이다.") void feed_show_user_info_isFollowing_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); - AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); + Alias a1 = TestEntityFactory.createLiteratureAlias(); UserJpaEntity anotherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "anotherUser")); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a1, "me")); followingJpaRepository.save(TestEntityFactory.createFollowing(me, anotherUser));// me 가 anotherUser를 follow 하는 상황 @@ -240,8 +237,8 @@ void feed_show_user_info_isFollowing_test() throws Exception { @DisplayName("특정 유저를 팔로우하는 사람이 많을 경우, 팔로우 맺은 일자 기준 최신순으로 최대 5명의 팔로워 프로필 이미지만을 반환한다.") void feed_show_user_info_follower_many_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); - AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); + Alias a1 = TestEntityFactory.createLiteratureAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity anotherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "anotherUser")); UserJpaEntity follower1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower1")); diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowWriteInfoApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowWriteInfoApiTest.java index 28c19cc37..3d485e6b7 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowWriteInfoApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowWriteInfoApiTest.java @@ -1,13 +1,12 @@ package konkuk.thip.feed.adapter.in.web; - +import com.jayway.jsonpath.JsonPath; +import konkuk.thip.common.util.EnumMappings; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.config.TestS3MockConfig; -import konkuk.thip.feed.adapter.out.persistence.repository.Tag.TagJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.room.domain.value.Category; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -20,14 +19,15 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.transaction.annotation.Transactional; -import static konkuk.thip.feed.domain.Tag.*; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; +import java.util.*; +import java.util.stream.Collectors; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @SpringBootTest @ActiveProfiles("test") @AutoConfigureMockMvc(addFilters = false) @@ -39,48 +39,75 @@ class FeedShowWriteInfoApiTest { @Autowired private MockMvc mockMvc; - @Autowired private CategoryJpaRepository categoryJpaRepository; - @Autowired private TagJpaRepository tagJpaRepository; - @Autowired private AliasJpaRepository aliasJpaRepository; - - private AliasJpaEntity literatureAlias; - private AliasJpaEntity scienceAlias; - private CategoryJpaEntity literatureCategory; - private CategoryJpaEntity scienceCategory; + private Alias literatureAlias; + private Alias scienceAlias; + private Category literatureCategory; + private Category scienceCategory; @BeforeEach void setUp() { - literatureAlias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); - scienceAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + literatureAlias = TestEntityFactory.createLiteratureAlias(); + scienceAlias = TestEntityFactory.createScienceAlias(); } @Test - @DisplayName("피드 작성을 위한 화면을 조회하면, DB의 카테고리별 하위 태그 리스트가 전체 반환된다.") + @DisplayName("피드 작성을 위한 화면을 조회하면, enum으로 정의된 Category/Tag 매핑이 형식과 내용 모두 정확히 반환된다.") void showFeedWriteInfo_returnsCategoryAndTags() throws Exception { + // given: SSOT인 EnumMappings에서 기대 맵을 구성 + Map> categoryToTags = EnumMappings.getCategoryToTags(); + int expectedCategoryCount = categoryToTags.size(); - // given - literatureCategory = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(literatureAlias)); - scienceCategory = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(scienceAlias)); - tagJpaRepository.save(TestEntityFactory.createTag(literatureCategory,KOREAN_NOVEL.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag(literatureCategory,FOREIGN_NOVEL.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag(literatureCategory,CLASSIC_LITERATURE.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag(scienceCategory,GENERAL_SCIENCE.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag(scienceCategory,PHYSICS.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag( scienceCategory,CHEMISTRY.getValue())); - - // when // then - mockMvc.perform(get("/feeds/write-info") + // when + var mvcResult = mockMvc.perform(get("/feeds/write-info") .contentType(MediaType.APPLICATION_JSON)) + // 1차: 상태 코드 및 카테고리 개수 검증(하드코딩 지양) .andExpect(status().isOk()) - .andExpect(jsonPath("$.data.categoryList", hasSize(2))) - .andExpect(jsonPath("$.data.categoryList[0].category", is(literatureCategory.getValue()))) - .andExpect(jsonPath("$.data.categoryList[0].tagList[0]", is(KOREAN_NOVEL.getValue()))) - .andExpect(jsonPath("$.data.categoryList[0].tagList[1]", is(FOREIGN_NOVEL.getValue()))) - .andExpect(jsonPath("$.data.categoryList[0].tagList[2]", is(CLASSIC_LITERATURE.getValue()))) - .andExpect(jsonPath("$.data.categoryList[1].category", is(scienceCategory.getValue()))) - .andExpect(jsonPath("$.data.categoryList[1].tagList[0]", is(GENERAL_SCIENCE.getValue()))) - .andExpect(jsonPath("$.data.categoryList[1].tagList[1]", is(PHYSICS.getValue()))) - .andExpect(jsonPath("$.data.categoryList[1].tagList[2]", is(CHEMISTRY.getValue()))); + .andExpect(jsonPath("$.data.categoryList", hasSize(expectedCategoryCount))) + .andReturn(); + + // then: 응답을 파싱하여 형식과 내용 동일성 검증 + String body = mvcResult.getResponse().getContentAsString(); + + // 스키마 형태 검증: 각 요소에 category(String), tagList(Array) 존재 + JsonPath.read(body, "$.data.categoryList[*].category"); + JsonPath.read(body, "$.data.categoryList[*].tagList"); + + // 실제 응답: category(String) -> tag(Set) + java.util.List> actualList = + JsonPath.read(body, "$.data.categoryList"); + + Map> actualMap = new HashMap<>(); + for (Map item : actualList) { + String categoryName = (String) item.get("category"); + @SuppressWarnings("unchecked") + List tags = (List) item.get("tagList"); + actualMap.put(categoryName, new HashSet<>(tags)); + } + + // 기대값: Category.getValue() -> Set + Map> expectedMap = new HashMap<>(); + for (var entry : categoryToTags.entrySet()) { + String categoryName = entry.getKey().getValue(); + Set tagValues = entry.getValue().stream() + .map(Tag::getValue) + .collect(Collectors.toSet()); + expectedMap.put(categoryName, tagValues); + } + + // 키(카테고리) 동일성 + assertThat( + "카테고리 키가 EnumMappings과 일치하지 않습니다.", + actualMap.keySet(), org.hamcrest.Matchers.equalTo(expectedMap.keySet()) + ); + + // 각 카테고리의 태그 집합 동등성 + for (String key : expectedMap.keySet()) { + assertThat( + "태그 목록이 일치하지 않습니다. category=" + key, + actualMap.get(key), + org.hamcrest.Matchers.equalTo(expectedMap.get(key)) + ); + } } } diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedUpdateApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedUpdateApiTest.java index 199ddf525..010146e79 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedUpdateApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedUpdateApiTest.java @@ -6,17 +6,12 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.config.TestS3MockConfig; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.FeedTagJpaEntity; -import konkuk.thip.feed.adapter.out.jpa.TagJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.FeedTag.FeedTagJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.Tag.TagJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -33,14 +28,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; -import static konkuk.thip.feed.domain.Tag.*; +import static konkuk.thip.feed.domain.value.Tag.*; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @SpringBootTest @ActiveProfiles("test") @AutoConfigureMockMvc(addFilters = false) @@ -53,32 +46,25 @@ class FeedUpdateApiTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; - @Autowired private TagJpaRepository tagJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; - @Autowired private FeedTagJpaRepository feedTagJpaRepository; private UserJpaEntity user; private BookJpaEntity book; private FeedJpaEntity feed; - private TagJpaEntity tag1; - private TagJpaEntity tag2; - private TagJpaEntity tag3; + private List tags; @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); - tag1 = tagJpaRepository.save(TestEntityFactory.createTag(category,KOREAN_NOVEL.getValue())); - tag2 = tagJpaRepository.save(TestEntityFactory.createTag(category,FOREIGN_NOVEL.getValue())); - tag3 = tagJpaRepository.save(TestEntityFactory.createTag(category, CLASSIC_LITERATURE.getValue())); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); - feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)); + + tags = List.of(KOREAN_NOVEL, FOREIGN_NOVEL, CLASSIC_LITERATURE); + feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true, tags)); } @Test @@ -88,14 +74,6 @@ void updateTaggedFeed_shouldUpdateTagsCorrectly() throws Exception { // given Long feedId = feed.getPostId(); - // 기존 태그 3개 연관 - List existingTags = List.of(tag1, tag2, tag3); - List mappings = existingTags.stream() - .map(tag -> TestEntityFactory.createFeedTagMapping(feed, tag)) - .toList(); - - feedTagJpaRepository.saveAll(mappings); - // 수정 요청 Map request = new HashMap<>(); request.put("contentBody", "태그 갱신 테스트"); @@ -110,9 +88,7 @@ void updateTaggedFeed_shouldUpdateTagsCorrectly() throws Exception { // then result.andExpect(status().isOk()); - long tagCount = feedTagJpaRepository.findAll().stream() - .filter(ft -> ft.getFeedJpaEntity().getPostId().equals(feedId)) - .count(); + long tagCount = feedJpaRepository.findById(feedId).orElseThrow().getTagList().size(); assertThat(tagCount).isEqualTo(2); } @@ -127,7 +103,7 @@ void updateImageFeed_shouldRetainSomeImagesOnly() throws Exception { "https://s3-mock/image-3.jpg" ); - FeedJpaEntity feed = feedJpaRepository.save(TestEntityFactory.createFeedWithContents(user, book, originalImages, true)); + FeedJpaEntity feed = feedJpaRepository.save(TestEntityFactory.createFeed(user, book, originalImages, true)); Long feedId = feed.getPostId(); // 수정 요청: 이미지 1개만 유지 @@ -160,15 +136,9 @@ void updateFeedWithAllFields_shouldModifyEverythingCorrectly() throws Exception "https://s3-mock/image-2.jpg", "https://s3-mock/image-3.jpg" ); - FeedJpaEntity feed = feedJpaRepository.save(TestEntityFactory.createFeedWithContents(user, book, originalImages, true)); + FeedJpaEntity feed = feedJpaRepository.save(TestEntityFactory.createFeed(user, book, true, 0, 0, originalImages, tags)); Long feedId = feed.getPostId(); - // 기존 태그 3개 매핑 - List existingTags = List.of(tag1, tag2, tag3); - List tagMappings = existingTags.stream() - .map(tag -> TestEntityFactory.createFeedTagMapping(feed, tag)) - .collect(Collectors.toList()); - feedTagJpaRepository.saveAll(tagMappings); // 수정 요청: 태그 일부 삭제 & 이미지 일부 삭제 & 본문 변경 & 공개 여부 변경 Map request = new HashMap<>(); @@ -195,9 +165,7 @@ void updateFeedWithAllFields_shouldModifyEverythingCorrectly() throws Exception assertThat(updated.getContentList()).hasSize(1); assertThat(updated.getContentList().get(0)).isEqualTo("https://s3-mock/image-2.jpg"); // 4. 태그 갯수 - long tagCount = feedTagJpaRepository.findAll().stream() - .filter(tag -> tag.getFeedJpaEntity().getPostId().equals(feedId)) - .count(); + long tagCount = feedJpaRepository.findById(feedId).orElseThrow().getTagList().size(); assertThat(tagCount).isEqualTo(2); } diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedUpdateControllerTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedUpdateControllerTest.java index c8dded14a..97816072e 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedUpdateControllerTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedUpdateControllerTest.java @@ -5,13 +5,10 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.feed.adapter.out.persistence.repository.Tag.TagJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -29,7 +26,7 @@ import java.util.Map; import static konkuk.thip.common.exception.code.ErrorCode.*; -import static konkuk.thip.feed.domain.Tag.*; +import static konkuk.thip.feed.domain.value.Tag.*; import static org.hamcrest.Matchers.containsString; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -46,11 +43,8 @@ class FeedUpdateControllerTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; - @Autowired private TagJpaRepository tagJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; private Long savedFeedId; @@ -59,15 +53,10 @@ class FeedUpdateControllerTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); - - tagJpaRepository.save(TestEntityFactory.createTag(category,KOREAN_NOVEL.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag(category,FOREIGN_NOVEL.getValue())); - tagJpaRepository.save(TestEntityFactory.createTag(category,CLASSIC_LITERATURE.getValue())); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); - savedFeedId = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)).getPostId(); + savedFeedId = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true, List.of(KOREAN_NOVEL, FOREIGN_NOVEL, CLASSIC_LITERATURE))).getPostId(); creatorUserId = user.getUserId(); } @@ -149,16 +138,17 @@ void invalidTagNames() throws Exception { @DisplayName("태그가 5개 초과일 경우 400 반환") void tooManyTags() throws Exception { Map req = buildValidUpdateRequest(); - req.put("tagList", List.of("t1","t2","t3","t4","t5","t6")); - assertBadRequest(INVALID_FEED_COMMAND.getCode(), req, "태그는 최대 5개까지 입력할 수 있습니다."); + req.put("tagList", List.of(PHYSICS.getValue(), CHEMISTRY.getValue(), KOREAN_NOVEL.getValue(), + FOREIGN_NOVEL.getValue(), CLASSIC_LITERATURE.getValue(), HISTORY.getValue())); + assertBadRequest(TAG_LIST_SIZE_OVERFLOW.getCode(), req, TAG_LIST_SIZE_OVERFLOW.getMessage()); } @Test @DisplayName("태그가 중복되어 있을 경우 400 반환") void duplicatedTags() throws Exception { Map req = buildValidUpdateRequest(); - req.put("tagList", List.of("중복", "중복")); - assertBadRequest(INVALID_FEED_COMMAND.getCode(), req, "태그는 중복 될 수 없습니다."); + req.put("tagList", List.of(KOREAN_NOVEL.getValue(), KOREAN_NOVEL.getValue())); + assertBadRequest(TAG_SHOULD_BE_UNIQUE.getCode(), req, TAG_SHOULD_BE_UNIQUE.getMessage()); } } @@ -195,9 +185,8 @@ void invalidImageUrl() throws Exception { .content(objectMapper.writeValueAsBytes(req)) ) .andExpect(status().isBadRequest()) - .andExpect(jsonPath("$.code").value(INVALID_FEED_COMMAND.getCode())) - .andExpect(jsonPath("$.message", containsString("해당 이미지는 이 피드에 존재하지 않습니다"))); + .andExpect(jsonPath("$.code").value(CONTENT_NOT_FOUND.getCode())) + .andExpect(jsonPath("$.message", containsString(CONTENT_NOT_FOUND.getMessage()))); } } - } diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FollowingPriorityFeedShowAllApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FollowingPriorityFeedShowAllApiTest.java index 470a464e4..62025dad9 100644 --- a/src/test/java/konkuk/thip/feed/adapter/in/web/FollowingPriorityFeedShowAllApiTest.java +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FollowingPriorityFeedShowAllApiTest.java @@ -9,11 +9,10 @@ import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; import konkuk.thip.feed.adapter.out.jpa.SavedFeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.SavedFeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -44,9 +43,6 @@ class FollowingPriorityFeedShowAllApiTest { @Autowired private MockMvc mockMvc; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; @@ -75,7 +71,6 @@ void tearDown() { feedJpaRepository.deleteAllInBatch(); followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); } @@ -83,7 +78,7 @@ void tearDown() { @DisplayName("피드 조회를 요청할 경우, [feedId, 작성자 닉네임, ,,] 의 피드 정보를 최신순으로 정렬해서 반환한다.") void feed_show_all_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); @@ -151,7 +146,7 @@ void feed_show_all_test() throws Exception { @DisplayName("피드는 [유저 본인이 작성한 글, 유저가 팔로우하는 다른 유저가 작성한 공개 글을 최신순] 으로 반환한 후, [유저가 팔로우하지 않는 다른 유저가 작성한 공개 글을 최신순] 으로 반환한다.") void feed_show_with_priority_and_order() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); @@ -214,7 +209,7 @@ void feed_show_with_priority_and_order() throws Exception { @DisplayName("request parameter의 cursor 값이 null일 경우, 첫번째 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void feed_show_first_page() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); @@ -308,7 +303,7 @@ void feed_show_first_page() throws Exception { @DisplayName("request parameter의 cursor 값이 존재할 경우, 해당 페이지에 해당하는 피드 10개와, nextCursor, last 값을 반환한다.") void feed_show_with_cursor() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); 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 c774975b9..f24784f86 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 @@ -5,10 +5,9 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -30,9 +29,6 @@ class FeedJpaEntityTest { @Autowired private UserJpaRepository userRepository; - @Autowired - private AliasJpaRepository aliasRepository; - @Autowired private BookJpaRepository bookRepository; @@ -43,7 +39,7 @@ class FeedJpaEntityTest { @DisplayName("FeedJpaEntity 저장 및 조회 테스트") void saveAndFindFeed() { // given - AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userRepository.save(TestEntityFactory.createUser(alias)); BookJpaEntity book = bookRepository.save(TestEntityFactory.createBook()); @@ -66,4 +62,4 @@ void saveAndFindFeed() { assertThat(found.getUserJpaEntity().getNickname()).isEqualTo("테스터"); assertThat(found.getBookJpaEntity().getTitle()).isEqualTo("책제목"); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/feed/domain/FeedTest.java b/src/test/java/konkuk/thip/feed/domain/FeedTest.java index 0c228c6b0..746e5be96 100644 --- a/src/test/java/konkuk/thip/feed/domain/FeedTest.java +++ b/src/test/java/konkuk/thip/feed/domain/FeedTest.java @@ -3,6 +3,8 @@ import konkuk.thip.common.exception.BusinessException; import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.feed.domain.value.ContentList; +import konkuk.thip.feed.domain.value.Tag; +import konkuk.thip.feed.domain.value.TagList; import konkuk.thip.post.domain.service.PostCountService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -12,7 +14,7 @@ import java.util.List; import static konkuk.thip.common.exception.code.ErrorCode.*; -import static konkuk.thip.feed.domain.Tag.KOREAN_NOVEL; +import static konkuk.thip.feed.domain.value.Tag.KOREAN_NOVEL; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.*; @@ -35,7 +37,7 @@ private Feed createPublicFeed() { .creatorId(CREATOR_ID) .content("공개 피드 입니다.") .isPublic(true) - .tagList(List.of(Tag.from(KOREAN_NOVEL.getValue()))) + .tagList(TagList.of(List.of(Tag.from(KOREAN_NOVEL.getValue())))) .contentList(ContentList.of(List.of("url1"))) .commentCount(1) .build(); @@ -61,29 +63,29 @@ private Feed createPrivateFeed() { .build(); } - @Test - @DisplayName("validateTags: 태그가 5개 초과 시 InvalidStateException이 발생한다.") - void validateTags_exceedsMax_throws() { - List tags = List.of("a", "b", "c", "d", "e", "f"); - - InvalidStateException ex = assertThrows(InvalidStateException.class, - () -> Feed.validateTags(tags)); - - assertEquals(INVALID_FEED_COMMAND, ex.getErrorCode()); - assertTrue(ex.getCause().getMessage().contains("최대 5개")); - } - - @Test - @DisplayName("validateTags: 중복 태그 있을 경우 InvalidStateException이 발생한다.") - void validateTags_withDuplicates_throws() { - List tags = List.of("a", "b", "a"); - - InvalidStateException ex = assertThrows(InvalidStateException.class, - () -> Feed.validateTags(tags)); - - assertEquals(INVALID_FEED_COMMAND, ex.getErrorCode()); - assertTrue(ex.getCause().getMessage().contains("중복")); - } +// @Test +// @DisplayName("validateTags: 태그가 5개 초과 시 InvalidStateException이 발생한다.") +// void validateTags_exceedsMax_throws() { +// List tags = List.of("a", "b", "c", "d", "e", "f"); +// +// InvalidStateException ex = assertThrows(InvalidStateException.class, +// () -> Feed.validateTags(tags)); +// +// assertEquals(INVALID_FEED_COMMAND, ex.getErrorCode()); +// assertTrue(ex.getCause().getMessage().contains("최대 5개")); +// } +// +// @Test +// @DisplayName("validateTags: 중복 태그 있을 경우 InvalidStateException이 발생한다.") +// void validateTags_withDuplicates_throws() { +// List tags = List.of("a", "b", "a"); +// +// InvalidStateException ex = assertThrows(InvalidStateException.class, +// () -> Feed.validateTags(tags)); +// +// assertEquals(INVALID_FEED_COMMAND, ex.getErrorCode()); +// assertTrue(ex.getCause().getMessage().contains("중복")); +// } @Test @DisplayName("validateCreateComment: 공개 피드면 누구나 댓글을 작성 할 수 있다") @@ -164,22 +166,6 @@ void updateImages_nonCreator_throws() { assertEquals(FEED_ACCESS_FORBIDDEN, ex.getErrorCode()); } - @Test - @DisplayName("validateOwnsImages: 피드 수정 시에 존재하지 않는 이미지 URL 포함하여 수정하려고 하면 InvalidStateException이 발생한다.") - void validateOwnsImages_withInvalidUrl_throws() { - Feed feed = createPublicFeed(); - - // feed.contentList에는 "url1"만 있음 - List candidateImageUrls = List.of("url1", "invalidUrl"); - - InvalidStateException ex = assertThrows(InvalidStateException.class, - () -> feed.validateOwnsImages(candidateImageUrls)); - - assertEquals(INVALID_FEED_COMMAND, ex.getErrorCode()); - assertTrue(ex.getCause().getMessage().contains("해당 이미지는 이 피드에 존재하지 않습니다")); - } - - @Test @DisplayName("increaseCommentCount: 피드의 댓글 수가 정상적으로 1 증가한다.") void increaseCommentCount_increments() { @@ -255,7 +241,7 @@ private Feed makeFeedWithPublicStatus(Boolean isPublic) { .creatorId(1L) .isPublic(isPublic) .targetBookId(100L) - .tagList(Collections.emptyList()) + .tagList(TagList.of(Collections.emptyList())) .contentList(ContentList.empty()) .build(); } diff --git a/src/test/java/konkuk/thip/recentSearch/adapter/in/web/RecentSearchDeleteApiTest.java b/src/test/java/konkuk/thip/recentSearch/adapter/in/web/RecentSearchDeleteApiTest.java index 54dc00a47..6331a31d4 100644 --- a/src/test/java/konkuk/thip/recentSearch/adapter/in/web/RecentSearchDeleteApiTest.java +++ b/src/test/java/konkuk/thip/recentSearch/adapter/in/web/RecentSearchDeleteApiTest.java @@ -5,10 +5,9 @@ import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchJpaEntity; import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchType; import konkuk.thip.recentSearch.adapter.out.persistence.repository.RecentSearchJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,9 +39,6 @@ class RecentSearchDeleteApiTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private RecentSearchJpaRepository recentSearchJpaRepository; @@ -52,7 +48,7 @@ class RecentSearchDeleteApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); // 요청 사용자 UserJpaEntity currentUser = userJpaRepository.save(TestEntityFactory.createUser(alias, "요청자")); diff --git a/src/test/java/konkuk/thip/recentSearch/adapter/in/web/RecentSearchGetApiTest.java b/src/test/java/konkuk/thip/recentSearch/adapter/in/web/RecentSearchGetApiTest.java index 6abea1462..64b351594 100644 --- a/src/test/java/konkuk/thip/recentSearch/adapter/in/web/RecentSearchGetApiTest.java +++ b/src/test/java/konkuk/thip/recentSearch/adapter/in/web/RecentSearchGetApiTest.java @@ -5,10 +5,9 @@ import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchJpaEntity; import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchType; import konkuk.thip.recentSearch.adapter.out.persistence.repository.RecentSearchJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -45,9 +44,6 @@ class RecentSearchGetApiTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private RecentSearchJpaRepository recentSearchJpaRepository; @@ -56,7 +52,7 @@ class RecentSearchGetApiTest { @BeforeEach void setUp() { // 사용자 및 별칭 생성 - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity currentUser = userJpaRepository.save(TestEntityFactory.createUser(alias, "검색자")); currentUserId = currentUser.getUserId(); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java index aeaab3100..c69cda6e9 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java @@ -4,17 +4,15 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -46,9 +44,7 @@ class RoomCloseJoinApiTest { @Autowired RoomJpaRepository roomJpaRepository; @Autowired RoomParticipantJpaRepository roomParticipantJpaRepository; @Autowired BookJpaRepository bookJpaRepository; - @Autowired CategoryJpaRepository categoryJpaRepository; @Autowired UserJpaRepository userJpaRepository; - @Autowired AliasJpaRepository aliasJpaRepository; private RoomJpaEntity room; private UserJpaEntity host; @@ -57,32 +53,32 @@ class RoomCloseJoinApiTest { @BeforeEach void setup() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); host = userJpaRepository.save(UserJpaEntity.builder() .nickname("호스트") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("kakao_12345678") - .aliasForUserJpaEntity(alias) + .alias(alias) .role(UserRole.USER) .build()); member = userJpaRepository.save(UserJpaEntity.builder() .nickname("방 참여자") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("kakao_12345678") - .aliasForUserJpaEntity(alias) + .alias(alias) .role(UserRole.USER) .build()); outsider = userJpaRepository.save(UserJpaEntity.builder() .nickname("방 미참여자") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("kakao_12345678") - .aliasForUserJpaEntity(alias) + .alias(alias) .role(UserRole.USER) .build()); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); room = roomJpaRepository.save(RoomJpaEntity.builder() .title("방 제목") @@ -93,7 +89,7 @@ void setup() { .recruitCount(5) .memberCount(2) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, host, RoomParticipantRole.HOST, 0.0)); @@ -102,12 +98,10 @@ void setup() { @AfterEach void tearDown() { - roomParticipantJpaRepository.deleteAll(); - roomJpaRepository.deleteAll(); - bookJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); - userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); + roomParticipantJpaRepository.deleteAllInBatch(); + roomJpaRepository.deleteAllInBatch(); + bookJpaRepository.deleteAllInBatch(); + userJpaRepository.deleteAllInBatch(); } @Test @@ -154,4 +148,4 @@ void closeRoomRecruit_fail_already_started() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()); } -} \ No newline at end of file +} 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 0934530a0..f732cc077 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 @@ -5,17 +5,15 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -45,29 +43,12 @@ @DisplayName("[통합] 방 생성 api 통합 테스트") class RoomCreateApiTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private UserJpaRepository userJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @Autowired - private BookJpaRepository bookJpaRepository; - - @Autowired - private RoomJpaRepository roomJpaRepository; - - @Autowired - private RoomParticipantJpaRepository roomParticipantJpaRepository; + @Autowired private MockMvc mockMvc; + @Autowired private ObjectMapper objectMapper; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; + @Autowired private RoomJpaRepository roomJpaRepository; + @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @AfterEach void tearDown() { @@ -75,22 +56,20 @@ void tearDown() { roomJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); } - private void saveUserAndCategory() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + private void saveUserAndLiteratureCategory() { + Alias alias = TestEntityFactory.createLiteratureAlias(); userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); } private void saveBookWithPageCount() { @@ -137,12 +116,11 @@ private Map buildRoomCreateRequest() { @DisplayName("isbn 에 해당하는 책(with pageCount)이 DB에 존재할 때, 해당 책과 연관된 방을 생성할 수 있다.") void room_create_book_with_page_exist() throws Exception { //given : user, category, pageCount값이 있는 book 생성, request 생성 - saveUserAndCategory(); + saveUserAndLiteratureCategory(); saveBookWithPageCount(); Long userId = userJpaRepository.findAll().get(0).getUserId(); Long bookId = bookJpaRepository.findAll().get(0).getBookId(); - Long categoryId = categoryJpaRepository.findAll().get(0).getCategoryId(); Map request = buildRoomCreateRequest(); @@ -170,11 +148,11 @@ void room_create_book_with_page_exist() throws Exception { assertThat(roomJpaEntity).isNotNull() .extracting( "title", "description", "public", "password", "roomPercentage", - "startDate", "endDate", "recruitCount", "bookJpaEntity.bookId", "categoryJpaEntity.categoryId" + "startDate", "endDate", "recruitCount", "bookJpaEntity.bookId", "category" ) .containsExactly( request.get("roomName"), request.get("description"), request.get("isPublic"), request.get("password"), 0.0, - startDate, endDate, request.get("recruitCount"), bookId, categoryId + startDate, endDate, request.get("recruitCount"), bookId, Category.LITERATURE ); } @@ -182,12 +160,11 @@ void room_create_book_with_page_exist() throws Exception { @DisplayName("isbn 에 해당하는 책(without pageCount)이 DB에 존재할 때, 해당 책의 page 정보를 update 한 후 연관된 방을 생성할 수 있다.") void room_create_book_without_page_exist() throws Exception { //given : user, category, pageCount값이 없는 book 생성, request 생성 - saveUserAndCategory(); + saveUserAndLiteratureCategory(); saveBookWithoutPageCount(); Long userId = userJpaRepository.findAll().get(0).getUserId(); Long bookId = bookJpaRepository.findAll().get(0).getBookId(); - Long categoryId = categoryJpaRepository.findAll().get(0).getCategoryId(); Map request = buildRoomCreateRequest(); @@ -215,11 +192,11 @@ void room_create_book_without_page_exist() throws Exception { assertThat(roomJpaEntity).isNotNull() .extracting( "title", "description", "public", "password", "roomPercentage", - "startDate", "endDate", "recruitCount", "bookJpaEntity.bookId", "categoryJpaEntity.categoryId" + "startDate", "endDate", "recruitCount", "bookJpaEntity.bookId", "category" ) .containsExactly( request.get("roomName"), request.get("description"), request.get("isPublic"), request.get("password"), 0.0, - startDate, endDate, request.get("recruitCount"), bookId, categoryId + startDate, endDate, request.get("recruitCount"), bookId, Category.LITERATURE ); // update 된 책 검증 @@ -231,10 +208,9 @@ void room_create_book_without_page_exist() throws Exception { @DisplayName("isbn 에 해당하는 책이 존재하지 않을 경우, page 정보를 포함하는 책을 save 한 후 연관된 방을 생성할 수 있다.") void room_create_book_not_exist() throws Exception { //given : user, category 생성, request 생성 (book 생성 X) - saveUserAndCategory(); + saveUserAndLiteratureCategory(); Long userId = userJpaRepository.findAll().get(0).getUserId(); - Long categoryId = categoryJpaRepository.findAll().get(0).getCategoryId(); Map request = buildRoomCreateRequest(); @@ -262,11 +238,11 @@ void room_create_book_not_exist() throws Exception { assertThat(roomJpaEntity).isNotNull() .extracting( "title", "description", "public", "password", "roomPercentage", - "startDate", "endDate", "recruitCount", "categoryJpaEntity.categoryId" + "startDate", "endDate", "recruitCount", "category" ) .containsExactly( request.get("roomName"), request.get("description"), request.get("isPublic"), request.get("password"), 0.0, - startDate, endDate, request.get("recruitCount"), categoryId + startDate, endDate, request.get("recruitCount"), Category.LITERATURE ); // 새로 DB에 저장된 책 검증 @@ -285,12 +261,11 @@ void room_create_book_not_exist() throws Exception { @Transactional // RoomParticipant -> Room, User 의 manyToOne 지연로딩을 위해 추가 void room_create_room_participant_save_success() throws Exception { //given : user, category, pageCount값이 있는 book 생성, request 생성 - saveUserAndCategory(); + saveUserAndLiteratureCategory(); saveBookWithPageCount(); Long userId = userJpaRepository.findAll().get(0).getUserId(); Long bookId = bookJpaRepository.findAll().get(0).getBookId(); - Long categoryId = categoryJpaRepository.findAll().get(0).getCategoryId(); Map request = buildRoomCreateRequest(); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetDeadlinePopularApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetDeadlinePopularApiTest.java index 3b35c2889..124a674d9 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetDeadlinePopularApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetDeadlinePopularApiTest.java @@ -4,16 +4,14 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.DateUtil; 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.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -46,31 +44,16 @@ @Transactional class RoomGetDeadlinePopularApiTest { - @Autowired - private MockMvc mockMvc; + @Autowired private MockMvc mockMvc; + @Autowired private RoomJpaRepository roomJpaRepository; + @Autowired private RoomParticipantJpaRepository participantJpaRepository; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; - @Autowired - private RoomJpaRepository roomJpaRepository; - - @Autowired - private RoomParticipantJpaRepository participantJpaRepository; - - @Autowired - private UserJpaRepository userJpaRepository; - - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @Autowired - private BookJpaRepository bookJpaRepository; - - private AliasJpaEntity alias; + private Alias alias; + private Category category; private UserJpaEntity currentUser; private BookJpaEntity book; - private CategoryJpaEntity category; private final List rooms = new ArrayList<>(); private final int maxMemberCount = 30; // 인기 방의 최대 인원 수 @@ -81,8 +64,8 @@ class RoomGetDeadlinePopularApiTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + alias = TestEntityFactory.createLiteratureAlias(); + category = TestEntityFactory.createLiteratureCategory(); currentUser = userJpaRepository.save(TestEntityFactory.createUser(alias, "현재유저")); book = bookJpaRepository.save(TestEntityFactory.createBook()); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java index cf5f2ff6f..54722b6ef 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java @@ -3,15 +3,14 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantRole; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.*; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -37,49 +36,30 @@ @DisplayName("[통합] 모임 홈 참여중인 내 모임방 조회 api 통합 테스트") class RoomGetHomeJoinedRoomsApiTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private UserJpaRepository userJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @Autowired - private BookJpaRepository bookJpaRepository; - - @Autowired - private RoomJpaRepository roomJpaRepository; - - @Autowired - private RoomParticipantJpaRepository roomParticipantJpaRepository; + @Autowired private MockMvc mockMvc; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; + @Autowired private RoomJpaRepository roomJpaRepository; + @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; private RoomJpaEntity room1; private RoomJpaEntity room2; private UserJpaEntity user1; private UserJpaEntity user2; private BookJpaEntity book; - private CategoryJpaEntity category; + private Category category; @BeforeEach void setUp() { - AliasJpaEntity alias = TestEntityFactory.createLiteratureAlias(); - aliasJpaRepository.save(alias); - + Alias alias = TestEntityFactory.createLiteratureAlias(); user1 = userJpaRepository.save(TestEntityFactory.createUser(alias)); user2 = userJpaRepository.save(TestEntityFactory.createUser(alias)); book = TestEntityFactory.createBook(); bookJpaRepository.save(book); - category = TestEntityFactory.createLiteratureCategory(alias); - categoryJpaRepository.save(category); - + category = TestEntityFactory.createLiteratureCategory(); room1 = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); room2 = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); @@ -97,8 +77,6 @@ void tearDown() { roomJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @@ -132,9 +110,7 @@ void getHomeJoinedRooms_success() throws Exception { void getHomeJoinedRooms_sortByStartDateWhenUserPercentageEquals() throws Exception { // given - AliasJpaEntity alias = TestEntityFactory.createLiteratureAlias(); - aliasJpaRepository.save(alias); - + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity newUser = userJpaRepository.save(TestEntityFactory.createUser(alias)); // 방1: 시작일 오늘-2 @@ -180,9 +156,7 @@ void getHomeJoinedRooms_sortByStartDateWhenUserPercentageEquals() throws Excepti void getHomeJoinedRooms_excludeRecruitingRooms() throws Exception { // given - AliasJpaEntity alias = TestEntityFactory.createLiteratureAlias(); - aliasJpaRepository.save(alias); - + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity newUser = userJpaRepository.save(TestEntityFactory.createUser(alias)); // 모집중(시작일 미래) @@ -216,8 +190,7 @@ void getHomeJoinedRooms_excludeRecruitingRooms() throws Exception { void getHomeJoinedRooms_empty() throws Exception { //given - AliasJpaEntity alias = TestEntityFactory.createLiteratureAlias(); - aliasJpaRepository.save(alias); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity newUser = userJpaRepository.save(TestEntityFactory.createUser(alias)); //when diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsControllerTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsControllerTest.java index 1f14f50c9..54663deab 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsControllerTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsControllerTest.java @@ -26,7 +26,6 @@ class RoomGetHomeJoinedRoomsControllerTest { @Autowired private MockMvc mockMvc; - private Map buildValidRequest() { Map request = new HashMap<>(); request.put("userId", 1L); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java index 2d6df62db..59a46acf6 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java @@ -3,18 +3,16 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantRole; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -40,47 +38,28 @@ @DisplayName("[통합] 독서 메이트(방 멤버) 조회 api 통합 테스트") class RoomGetMemberListApiTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private UserJpaRepository userJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @Autowired - private BookJpaRepository bookJpaRepository; - - @Autowired - private RoomJpaRepository roomJpaRepository; - - @Autowired - private RoomParticipantJpaRepository roomParticipantJpaRepository; - - @Autowired - private FollowingJpaRepository followingJpaRepository; + @Autowired private MockMvc mockMvc; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; + @Autowired private RoomJpaRepository roomJpaRepository; + @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; + @Autowired private FollowingJpaRepository followingJpaRepository; private RoomJpaEntity room1; private UserJpaEntity user1; private UserJpaEntity user2; private UserJpaEntity user3; private BookJpaEntity book; - private CategoryJpaEntity category; + private Category category; @BeforeEach void setUp() { - AliasJpaEntity alias = TestEntityFactory.createLiteratureAlias(); - aliasJpaRepository.save(alias); - + Alias alias = TestEntityFactory.createLiteratureAlias(); user1 = userJpaRepository.save(UserJpaEntity.builder() .nickname("테스터1") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("kakao_1") - .aliasForUserJpaEntity(alias) + .alias(alias) .role(UserRole.USER) .followerCount(2) // user1이 user2, user3를 팔로우 .build()); @@ -89,7 +68,7 @@ void setUp() { .nickname("테스터2") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("kakao_2") - .aliasForUserJpaEntity(alias) + .alias(alias) .role(UserRole.USER) .followerCount(1) // user2가 user3를 팔로우 .build()); @@ -98,13 +77,13 @@ void setUp() { .nickname("테스터3") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("kakao_3") - .aliasForUserJpaEntity(alias) + .alias(alias) .role(UserRole.USER) .followerCount(1) // user3가 user1을 팔로우 .build()); book = bookJpaRepository.save(TestEntityFactory.createBook()); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); room1 = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); @@ -131,8 +110,6 @@ void tearDown() { roomJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @@ -202,7 +179,7 @@ void getRoomMemberList_subscriberCount() throws Exception { @DisplayName("팔로워가 한 명도 없는 사용자는 followerCount가 0으로 조회된다.") void getRoomMemberList_noSubscriber() throws Exception { //given - UserJpaEntity userNoFollower = userJpaRepository.save(TestEntityFactory.createUser(aliasJpaRepository.findAll().get(0))); + UserJpaEntity userNoFollower = userJpaRepository.save(TestEntityFactory.createUser(Alias.WRITER)); roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room1, userNoFollower, RoomParticipantRole.MEMBER, 10.0)); Long roomId = room1.getRoomId(); @@ -213,4 +190,4 @@ void getRoomMemberList_noSubscriber() throws Exception { result.andExpect(status().isOk()) .andExpect(jsonPath("$.data.userList[?(@.userId==" + userNoFollower.getUserId() + ")].followerCount").value(contains(0))); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListControllerTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListControllerTest.java index ea4eeb2a5..2b740bb15 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListControllerTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListControllerTest.java @@ -26,11 +26,8 @@ @DisplayName("[단위] 독서메이트(방 멤버) 조회 api controller 테스트") class RoomGetMemberListControllerTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private ObjectMapper objectMapper; + @Autowired private MockMvc mockMvc; + @Autowired private ObjectMapper objectMapper; private Map buildValidRequest() { Map request = new HashMap<>(); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomJoinApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomJoinApiTest.java index 458743a4b..7f404183b 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomJoinApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomJoinApiTest.java @@ -4,18 +4,16 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -48,36 +46,34 @@ class RoomJoinApiTest { @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private AliasJpaRepository aliasJpaRepository; private RoomJpaEntity room; private UserJpaEntity host; private UserJpaEntity participant; private void setUpWithOnlyHost() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); createUsers(alias); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); createRoom(book, category,1); // 방장만 포함 roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, host, RoomParticipantRole.HOST, 0.0)); } private void setUpWithParticipant() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); createUsers(alias); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); createRoom(book, category,2); // 방장과 참여자 포함 roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, host, RoomParticipantRole.HOST, 0.0)); roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, participant, RoomParticipantRole.MEMBER, 0.0)); } - private void createRoom(BookJpaEntity book, CategoryJpaEntity category, int memberCount) { + private void createRoom(BookJpaEntity book, Category category, int memberCount) { room = roomJpaRepository.save(RoomJpaEntity.builder() .title("방이름") .description("설명") @@ -86,18 +82,18 @@ private void createRoom(BookJpaEntity book, CategoryJpaEntity category, int memb .endDate(LocalDate.now().plusDays(30)) .recruitCount(3) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .memberCount(memberCount) // 방장과 참여자 포함 .build()); } - private void createUsers(AliasJpaEntity alias) { + private void createUsers(Alias alias) { host = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("user") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); participant = userJpaRepository.save(UserJpaEntity.builder() @@ -105,7 +101,7 @@ private void createUsers(AliasJpaEntity alias) { .nickname("user123") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); } @@ -113,10 +109,8 @@ private void createUsers(AliasJpaEntity alias) { void tearDown() { roomParticipantJpaRepository.deleteAllInBatch(); roomJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @@ -201,4 +195,4 @@ void cancelJoin_notParticipated() throws Exception { result.andExpect(status().isBadRequest()); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomParticipantDeleteApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomParticipantDeleteApiTest.java index 3ce159adf..001323db0 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomParticipantDeleteApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomParticipantDeleteApiTest.java @@ -5,18 +5,16 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.exception.code.ErrorCode; 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.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -46,9 +44,7 @@ class RoomParticipantDeleteApiTest { @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private AliasJpaRepository aliasJpaRepository; private RoomJpaEntity room; private UserJpaEntity host; @@ -57,27 +53,27 @@ class RoomParticipantDeleteApiTest { private RoomParticipantJpaEntity memberParticipation; private void setUpWithOnlyHost() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); createUsers(alias); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); createRoom(book, category,1); // 방장만 포함 roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, host, RoomParticipantRole.HOST, 0.0)); } private void setUpWithParticipant() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); createUsers(alias); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); createRoom(book, category,2); // 방장과 참여자 포함 hostParticipation = roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, host, RoomParticipantRole.HOST, 50.0)); memberParticipation = roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, participant, RoomParticipantRole.MEMBER, 30.0)); } - private void createRoom(BookJpaEntity book, CategoryJpaEntity category, int memberCount) { + private void createRoom(BookJpaEntity book, Category category, int memberCount) { room = roomJpaRepository.save(RoomJpaEntity.builder() .title("방이름") .description("설명") @@ -86,18 +82,18 @@ private void createRoom(BookJpaEntity book, CategoryJpaEntity category, int memb .endDate(LocalDate.now().plusDays(30)) .recruitCount(3) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .memberCount(memberCount) // 방장과 참여자 포함 .build()); } - private void createUsers(AliasJpaEntity alias) { + private void createUsers(Alias alias) { host = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("user") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); participant = userJpaRepository.save(UserJpaEntity.builder() @@ -105,7 +101,7 @@ private void createUsers(AliasJpaEntity alias) { .nickname("user123") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); } @@ -169,4 +165,4 @@ void leaveRoom_hostCannotLeave() throws Exception { .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.code").value(ErrorCode.ROOM_HOST_CANNOT_LEAVE.getCode())); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java index ccdf09139..26ca330a0 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java @@ -4,23 +4,20 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.DateUtil; 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.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.room.domain.Category; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.roompost.adapter.out.jpa.VoteItemJpaEntity; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteItemJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -47,32 +44,13 @@ @DisplayName("[통합] 진행 중인 방 상세조회 api 통합 테스트") class RoomPlayingDetailViewApiTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private UserJpaRepository userJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @Autowired - private BookJpaRepository bookJpaRepository; - - @Autowired - private RoomJpaRepository roomJpaRepository; - - @Autowired - private RoomParticipantJpaRepository roomParticipantJpaRepository; - - @Autowired - private VoteJpaRepository voteJpaRepository; - - @Autowired - private VoteItemJpaRepository voteItemJpaRepository; + @Autowired private MockMvc mockMvc; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; + @Autowired private RoomJpaRepository roomJpaRepository; + @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; + @Autowired private VoteJpaRepository voteJpaRepository; + @Autowired private VoteItemJpaRepository voteItemJpaRepository; @AfterEach void tearDown() { @@ -82,12 +60,10 @@ void tearDown() { roomJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() .title(bookTitle) @@ -100,7 +76,7 @@ private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String room .description("한강의 소설") .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + Category category = TestEntityFactory.createScienceCategory(); return roomJpaRepository.save(RoomJpaEntity.builder() .title(roomName) @@ -111,12 +87,12 @@ private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String room .endDate(LocalDate.now().plusDays(30)) .recruitCount(recruitCount) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); } private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); // User 리스트 생성 및 저장 List users = IntStream.rangeClosed(1, count) @@ -125,7 +101,7 @@ private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("oauth2Id") .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()) .toList(); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomPostChangeLikeStatusApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomPostChangeLikeStatusApiTest.java index 957d0deb1..f41349c8e 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomPostChangeLikeStatusApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomPostChangeLikeStatusApiTest.java @@ -7,21 +7,19 @@ import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; import konkuk.thip.room.adapter.in.web.request.RoomPostIsLikeRequest; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,7 +38,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @SpringBootTest @ActiveProfiles("test") @AutoConfigureMockMvc(addFilters = false) @@ -52,22 +49,19 @@ class RoomPostChangeLikeStatusApiTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private PostLikeJpaRepository postLikeJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @Autowired private RecordJpaRepository recordJpaRepository; @Autowired private VoteJpaRepository voteJpaRepository; - private UserJpaEntity user; private BookJpaEntity book; private FeedJpaEntity feed; - private CategoryJpaEntity category; + private Category category; private RoomJpaEntity room; private RecordJpaEntity record; private VoteJpaEntity vote; @@ -76,11 +70,11 @@ class RoomPostChangeLikeStatusApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user,book, true)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); room = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); // 1번방에 유저 1이 호스트 roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room,user, RoomParticipantRole.HOST, 80.0)); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomPostChangeLikeStatusControllerTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomPostChangeLikeStatusControllerTest.java index 592c7c4ec..f0057b227 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomPostChangeLikeStatusControllerTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomPostChangeLikeStatusControllerTest.java @@ -4,18 +4,16 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.TestEntityFactory; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,7 +34,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @SpringBootTest @ActiveProfiles("test") @AutoConfigureMockMvc(addFilters = false) @@ -48,10 +45,8 @@ class RoomPostChangeLikeStatusControllerTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @Autowired private RecordJpaRepository recordJpaRepository; @@ -59,7 +54,7 @@ class RoomPostChangeLikeStatusControllerTest { private UserJpaEntity user1; private UserJpaEntity user2; private BookJpaEntity book; - private CategoryJpaEntity category; + private Category category; private RoomJpaEntity room; private RecordJpaEntity record; @@ -67,11 +62,11 @@ class RoomPostChangeLikeStatusControllerTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); user1 = userJpaRepository.save(TestEntityFactory.createUser(alias)); user2 = userJpaRepository.save(TestEntityFactory.createUser(alias)); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); room = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); // 1번방에 유저 1이 호스트 roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room,user1, RoomParticipantRole.HOST, 80.0)); @@ -117,6 +112,4 @@ void nonParticipantUser_likeRoomPost_shouldReturnBadRequest() throws Exception { .andExpect(jsonPath("$.code").value(ROOM_ACCESS_FORBIDDEN.getCode())) .andExpect(jsonPath("$.message", containsString("사용자가 이 방의 참가자가 아닙니다."))); } - - } diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java index d06a93334..cbad6f571 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java @@ -4,16 +4,15 @@ import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.DateUtil; 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.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.*; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -39,26 +38,11 @@ @DisplayName("[통합] 모집 중인 방 상세조회 api 통합 테스트") class RoomRecruitingDetailViewApiTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private UserJpaRepository userJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @Autowired - private BookJpaRepository bookJpaRepository; - - @Autowired - private RoomJpaRepository roomJpaRepository; - - @Autowired - private RoomParticipantJpaRepository roomParticipantJpaRepository; + @Autowired private MockMvc mockMvc; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; + @Autowired private RoomJpaRepository roomJpaRepository; + @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @AfterEach void tearDown() { @@ -66,12 +50,10 @@ void tearDown() { roomJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() .title(bookTitle) @@ -84,7 +66,7 @@ private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String room .description("한강의 소설") .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + Category category = TestEntityFactory.createScienceCategory(); return roomJpaRepository.save(RoomJpaEntity.builder() .title(roomName) @@ -95,12 +77,12 @@ private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String room .endDate(LocalDate.now().plusDays(30)) .recruitCount(recruitCount) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); } private RoomJpaEntity saveLiteratureRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() .title(bookTitle) @@ -113,7 +95,7 @@ private RoomJpaEntity saveLiteratureRoom(String bookTitle, String isbn, String r .description("한강의 소설") .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); return roomJpaRepository.save(RoomJpaEntity.builder() .title(roomName) @@ -124,12 +106,12 @@ private RoomJpaEntity saveLiteratureRoom(String bookTitle, String isbn, String r .endDate(LocalDate.now().plusDays(30)) .recruitCount(recruitCount) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); } private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); // User 리스트 생성 및 저장 List users = IntStream.rangeClosed(1, count) @@ -138,7 +120,7 @@ private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("oauth2Id") .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()) .toList(); 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 5a8525004..70b16969d 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 @@ -6,15 +6,13 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchJpaEntity; import konkuk.thip.recentSearch.adapter.out.persistence.repository.RecentSearchJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.domain.Category; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.*; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -42,9 +40,7 @@ class RoomSearchApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @@ -58,23 +54,19 @@ void tearDown() { roomJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); } private RoomJpaEntity saveScienceRoom(String bookTitle, String roomName, LocalDate startDate, LocalDate endDate) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithBookTitle(bookTitle)); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + Category category = TestEntityFactory.createScienceCategory(); return roomJpaRepository.save(TestEntityFactory.createCustomRoom(book, category, roomName, startDate, endDate)); } private RoomJpaEntity saveLiteratureRoom(String bookTitle, String roomName, LocalDate startDate, LocalDate endDate) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithBookTitle(bookTitle)); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); return roomJpaRepository.save(TestEntityFactory.createCustomRoom(book, category, roomName, startDate, endDate)); } @@ -302,7 +294,7 @@ void search_keyword_and_category() throws Exception { @DisplayName("finalized가 true이면 최근 검색어 목록으로 저장된다.") void search_keyword_saved() throws Exception { // given - AliasJpaEntity aliasJpa = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias aliasJpa = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(aliasJpa)); RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_1, 4); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomShowMineApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomShowMineApiTest.java index 97de3c849..9c794fbb5 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomShowMineApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomShowMineApiTest.java @@ -3,17 +3,15 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,7 +24,6 @@ import java.time.LocalDate; -import static konkuk.thip.common.exception.code.ErrorCode.INVALID_MY_ROOM_CURSOR; import static konkuk.thip.common.exception.code.ErrorCode.INVALID_MY_ROOM_TYPE; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -39,26 +36,11 @@ @DisplayName("[통합] 내 방 목록 조회 api 통합 테스트") class RoomShowMineApiTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private UserJpaRepository userJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @Autowired - private BookJpaRepository bookJpaRepository; - - @Autowired - private RoomJpaRepository roomJpaRepository; - - @Autowired - private RoomParticipantJpaRepository roomParticipantJpaRepository; + @Autowired private MockMvc mockMvc; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; + @Autowired private RoomJpaRepository roomJpaRepository; + @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @AfterEach void tearDown() { @@ -66,12 +48,10 @@ void tearDown() { roomJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); } private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, LocalDate endDate, int recruitCount) { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() .title(bookTitle) @@ -84,7 +64,7 @@ private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String room .description("한강의 소설") .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + Category category = TestEntityFactory.createScienceCategory(); return roomJpaRepository.save(RoomJpaEntity.builder() .title(roomName) @@ -95,7 +75,7 @@ private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String room .endDate(endDate) .recruitCount(recruitCount) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); } @@ -132,7 +112,7 @@ void get_my_playing_rooms() throws Exception { RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); changeRoomMemberCount(expiredRoom1, 7); - AliasJpaEntity scienceAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias scienceAlias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(scienceAlias)); // user가 생성한 방에 참여한 상황 가정 @@ -171,7 +151,7 @@ void get_my_recruiting_rooms() throws Exception { RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); changeRoomMemberCount(expiredRoom1, 7); - AliasJpaEntity scienceAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias scienceAlias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(scienceAlias)); // user가 생성한 방에 참여한 상황 가정 @@ -210,7 +190,7 @@ void get_my_playing_and_recruiting_rooms() throws Exception { RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); changeRoomMemberCount(expiredRoom1, 7); - AliasJpaEntity scienceAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias scienceAlias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(scienceAlias)); // user가 생성한 방에 참여한 상황 가정 @@ -250,7 +230,7 @@ void get_my_expired_rooms() throws Exception { RoomJpaEntity expiredRoom2 = saveScienceRoom("만료된방-책-2", "isbn4", "과학-방-10일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(10), 10); changeRoomMemberCount(expiredRoom2, 1); - AliasJpaEntity scienceAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias scienceAlias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(scienceAlias)); // user가 생성한 방에 참여한 상황 가정 @@ -289,7 +269,7 @@ void get_my_rooms_wrong_type() throws Exception { RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); changeRoomMemberCount(expiredRoom1, 7); - AliasJpaEntity scienceAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias scienceAlias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(scienceAlias)); // user가 생성한 방에 참여한 상황 가정 @@ -349,7 +329,7 @@ void get_my_rooms_page_1() throws Exception { RoomJpaEntity recruitingRoom12 = saveScienceRoom("모집중인방-책-12", "isbn12", "과학-방-12일뒤-활동시작", LocalDate.now().plusDays(12), LocalDate.now().plusDays(30), 10); changeRoomMemberCount(recruitingRoom12, 8); - AliasJpaEntity scienceAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias scienceAlias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(scienceAlias)); // user가 생성한 방에 참여한 상황 가정 @@ -428,7 +408,7 @@ void get_my_rooms_page_2() throws Exception { RoomJpaEntity recruitingRoom12 = saveScienceRoom("모집중인방-책-12", "isbn12", "과학-방-12일뒤-활동시작", LocalDate.now().plusDays(12), LocalDate.now().plusDays(30), 10); changeRoomMemberCount(recruitingRoom12, 8); - AliasJpaEntity scienceAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias scienceAlias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(scienceAlias)); // user가 생성한 방에 참여한 상황 가정 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 8f8de79b2..5efa7075f 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 @@ -5,14 +5,12 @@ import konkuk.thip.book.adapter.out.persistence.repository.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.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -26,7 +24,6 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; - import java.time.LocalDate; import static konkuk.thip.common.exception.code.ErrorCode.*; @@ -40,26 +37,11 @@ @DisplayName("[통합] 비공개 방 비밀번호 입력 검증 api 통합 테스트") class RoomVerifyPasswordApiTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private UserJpaRepository userJpaRepository; - - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private BookJpaRepository bookJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @Autowired - private RoomJpaRepository roomJpaRepository; - - @Autowired - private ObjectMapper objectMapper; + @Autowired private MockMvc mockMvc; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; + @Autowired private RoomJpaRepository roomJpaRepository; + @Autowired private ObjectMapper objectMapper; private static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder(); @@ -69,8 +51,7 @@ class RoomVerifyPasswordApiTest { @BeforeEach void setUp() { - - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(alias, "User1")); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() .isbn("1234567890123") @@ -83,13 +64,13 @@ void setUp() { .build()); userId = user.getUserId(); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); // 비공개 방 저장 (비밀번호: 1234) RoomJpaEntity privateRoom = roomJpaRepository.save( RoomJpaEntity.builder() .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .title("비공개방") .description("비공개방입니다") .isPublic(false) @@ -105,7 +86,7 @@ void setUp() { RoomJpaEntity publicRoom = roomJpaRepository.save( RoomJpaEntity.builder() .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .title("공개방") .description("공개방입니다") .isPublic(true) @@ -123,8 +104,6 @@ void tearDown() { roomJpaRepository.deleteAll(); bookJpaRepository.deleteAll(); userJpaRepository.deleteAll(); - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @@ -175,7 +154,7 @@ void verifyRoomPassword_recruitmentPeriodExpired() throws Exception { RoomJpaEntity expiredRoom = roomJpaRepository.save( RoomJpaEntity.builder() .bookJpaEntity(bookJpaRepository.findAll().get(0)) - .categoryJpaEntity(categoryJpaRepository.findAll().get(0)) + .category(Category.LITERATURE) .title("모집만료방") .description("모집기간이 만료된 방입니다") .isPublic(false) @@ -219,4 +198,4 @@ void verifyRoomPassword_publicRoom() throws Exception { .andExpect(jsonPath("$.code").value(ROOM_PASSWORD_NOT_REQUIRED.getCode())) .andExpect(jsonPath("$.message", containsString("공개방은 비밀번호가 필요하지 않습니다"))); } -} \ No newline at end of file +} 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 7d5194580..039fa06fd 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 @@ -4,11 +4,9 @@ import jakarta.persistence.PersistenceContext; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.common.util.TestEntityFactory; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.room.domain.value.Category; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -24,20 +22,9 @@ @DisplayName("[JPA] RoomJpaEntity 테스트") class RoomJpaEntityTest { - @PersistenceContext - private EntityManager em; - - @Autowired - private BookJpaRepository bookRepository; - - @Autowired - private AliasJpaRepository aliasRepository; - - @Autowired - private CategoryJpaRepository categoryRepository; - - @Autowired - private RoomJpaRepository roomRepository; + @PersistenceContext private EntityManager em; + @Autowired private BookJpaRepository bookRepository; + @Autowired private RoomJpaRepository roomRepository; @Test @DisplayName("RoomJpaEntity 저장 및 조회 테스트") @@ -45,8 +32,7 @@ void saveAndFindRoom() { // given String isbn = "1234567890"; BookJpaEntity book = bookRepository.save(TestEntityFactory.createBookWithISBN(isbn)); - AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createLiteratureAlias()); - CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); RoomJpaEntity room = roomRepository.save(TestEntityFactory.createRoom(book, category)); // when @@ -64,4 +50,4 @@ void saveAndFindRoom() { assertThat(foundRoom.getBookJpaEntity().getAuthorName()).isEqualTo("저자"); assertThat(foundRoom.getBookJpaEntity().getIsbn()).isEqualTo(isbn); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/room/application/service/RoomJoinServiceTest.java b/src/test/java/konkuk/thip/room/application/service/RoomJoinServiceTest.java index 5feedd7da..c94bedfe6 100644 --- a/src/test/java/konkuk/thip/room/application/service/RoomJoinServiceTest.java +++ b/src/test/java/konkuk/thip/room/application/service/RoomJoinServiceTest.java @@ -115,5 +115,4 @@ void successCancel() { then(roomCommandPort).should().update(any(Room.class)); } } - -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java b/src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java index 2af43ff2d..b12c0c748 100644 --- a/src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java +++ b/src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java @@ -107,4 +107,4 @@ void member_can_leave_room_test() { assertDoesNotThrow(member::validateRoomLeavable); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/room/domain/RoomTest.java b/src/test/java/konkuk/thip/room/domain/RoomTest.java index f4bd6f9a4..a8d051334 100644 --- a/src/test/java/konkuk/thip/room/domain/RoomTest.java +++ b/src/test/java/konkuk/thip/room/domain/RoomTest.java @@ -2,6 +2,7 @@ import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.common.exception.code.ErrorCode; +import konkuk.thip.room.domain.value.Category; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -288,5 +289,4 @@ void startRoomProgress_recruitmentExpired() { InvalidStateException ex = assertThrows(InvalidStateException.class, room::startRoomProgress); assertEquals(ErrorCode.ROOM_RECRUITMENT_PERIOD_EXPIRED, ex.getErrorCode()); } - } diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/AttendanceCheckCreateApiTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/AttendanceCheckCreateApiTest.java index 269dc8eb4..99493b7fd 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/AttendanceCheckCreateApiTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/AttendanceCheckCreateApiTest.java @@ -2,20 +2,18 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.persistence.repository.attendancecheck.AttendanceCheckJpaRepository; import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -47,9 +45,7 @@ class AttendanceCheckCreateApiTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @@ -61,19 +57,17 @@ void tearDown() { roomParticipantJpaRepository.deleteAllInBatch(); roomJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); } @Test @DisplayName("방의 참석자는 출석체크(= 오늘의 한마디) 를 작성할 수 있다.") void attendance_check_create_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); - CategoryJpaEntity c0 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); + Category c0 = TestEntityFactory.createScienceCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, c0)); @@ -101,10 +95,10 @@ void attendance_check_create_test() throws Exception { @DisplayName("방의 참석자가 아닐 경우, 오늘의 한마디를 작성 요청 시 403 에러 발생한다(400 에러 아님).") void attendance_check_fail_test() throws Exception { //given : me 는 room에 속하지 않는 유저 - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); - CategoryJpaEntity c0 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); + Category c0 = TestEntityFactory.createScienceCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, c0)); @@ -123,10 +117,10 @@ void attendance_check_fail_test() throws Exception { @DisplayName("방의 참석자가 출석체크(= 오늘의 한마디) 를 처음 작성할 경우, response의 isFirstWrite는 true 이다.") void attendance_check_create_first_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); - CategoryJpaEntity c0 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); + Category c0 = TestEntityFactory.createScienceCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, c0)); @@ -152,10 +146,10 @@ void attendance_check_create_first_test() throws Exception { @DisplayName("방의 참석자가 출석체크(= 오늘의 한마디) 를 하루 최대 5회만 작성할 수 있다. 5회를 초과할 경우, 400 error를 반환한다.") void attendance_check_create_too_many_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); - CategoryJpaEntity c0 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); + Category c0 = TestEntityFactory.createScienceCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, c0)); diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/AttendanceCheckShowApiTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/AttendanceCheckShowApiTest.java index b2e096a7b..ed944bdd0 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/AttendanceCheckShowApiTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/AttendanceCheckShowApiTest.java @@ -4,18 +4,16 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.AttendanceCheckJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.attendancecheck.AttendanceCheckJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -45,9 +43,7 @@ class AttendanceCheckShowApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @@ -60,20 +56,18 @@ void tearDown() { roomParticipantJpaRepository.deleteAllInBatch(); roomJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); } @Test @DisplayName("방의 출석체크(= 오늘의 한마디) 조회 요청하면, [오늘의 한마디 작성자 정보, 오늘의 한마디 정보] 등을 최신순으로 반환한다.") void attendance_check_show_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); - CategoryJpaEntity c0 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); + Category c0 = TestEntityFactory.createScienceCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, c0)); @@ -116,11 +110,11 @@ void attendance_check_show_test() throws Exception { @DisplayName("방의 멤버가 아닌 사람이 오늘의 한마디 조회 요청을 보낼 경우, 403 error가 발생한다.") void attendance_check_show_no_room_member() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); - CategoryJpaEntity c0 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); + Category c0 = TestEntityFactory.createScienceCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, c0)); @@ -141,10 +135,10 @@ void attendance_check_show_no_room_member() throws Exception { @DisplayName("오늘의 한마디 조회는 작성 시각 기준 최신순 정렬 & 커서 기반 페이지네이션으로 동작한다.") void attendance_check_show_page_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); - CategoryJpaEntity c0 = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(a0)); + Category c0 = TestEntityFactory.createScienceCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, c0)); diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordCreateControllerTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordCreateControllerTest.java index 954089e89..23e92f679 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordCreateControllerTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordCreateControllerTest.java @@ -5,20 +5,18 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.TestEntityFactory; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.in.web.request.RecordCreateRequest; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -52,15 +50,9 @@ class RecordCreateControllerTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private CategoryJpaRepository categoryJpaRepository; - @Autowired private BookJpaRepository bookJpaRepository; @@ -77,13 +69,13 @@ class RecordCreateControllerTest { private RoomJpaEntity room; private void saveUserAndRoom() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); room = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordDeleteApiTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordDeleteApiTest.java index 9a62a8e1e..bc1c29b67 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordDeleteApiTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordDeleteApiTest.java @@ -7,18 +7,16 @@ import konkuk.thip.comment.adapter.out.persistence.repository.CommentLikeJpaRepository; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -45,9 +43,7 @@ class RecordDeleteApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private CommentJpaRepository commentJpaRepository; @Autowired private CommentLikeJpaRepository commentLikeJpaRepository; @@ -56,9 +52,9 @@ class RecordDeleteApiTest { @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; + private Category category; private BookJpaEntity book; private CommentJpaEntity comment; private RecordJpaEntity record; @@ -66,9 +62,9 @@ class RecordDeleteApiTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); room = roomJpaRepository.save(TestEntityFactory.createRoom(book,category)); record = recordJpaRepository.save(TestEntityFactory.createRecord(user,room)); diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordPinApiTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordPinApiTest.java index 7eb355b64..647b9c78c 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordPinApiTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/RecordPinApiTest.java @@ -3,18 +3,16 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.TestEntityFactory; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,26 +38,24 @@ class RecordPinApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private RecordJpaRepository recordJpaRepository; @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; + private Category category; private BookJpaEntity book; private RecordJpaEntity record; private RoomJpaEntity room; @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); room = roomJpaRepository.save(TestEntityFactory.createRoom(book,category)); record = recordJpaRepository.save(TestEntityFactory.createRecord(user,room)); diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/RoomPostSearchApiTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/RoomPostSearchApiTest.java index e61e978d4..c84b71227 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/RoomPostSearchApiTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/RoomPostSearchApiTest.java @@ -5,24 +5,22 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; import konkuk.thip.common.util.TestEntityFactory; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -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.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.roompost.adapter.out.jpa.VoteItemJpaEntity; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteItemJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -56,8 +54,6 @@ class RoomPostSearchApiTest { @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; @Test @@ -403,14 +399,14 @@ void searchMyRecords_with_invalid_parameters_error() throws Exception { } private TestData createTestData() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_123") .nickname("테스트사용자") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() @@ -424,7 +420,7 @@ private TestData createTestData() { .bestSeller(false) .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); RoomJpaEntity room = roomJpaRepository.save(RoomJpaEntity.builder() .title("방 제목") @@ -435,7 +431,7 @@ private TestData createTestData() { .endDate(LocalDate.now().plusDays(30)) .recruitCount(5) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); // 방 참가자 생성 @@ -521,14 +517,14 @@ private TestData createTestDataWithOverview() { } private TestData createTestDataWithLockedContent() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_123") .nickname("테스트사용자") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() @@ -542,7 +538,7 @@ private TestData createTestDataWithLockedContent() { .bestSeller(false) .build()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); RoomJpaEntity room = roomJpaRepository.save(RoomJpaEntity.builder() .title("방 제목") @@ -553,7 +549,7 @@ private TestData createTestDataWithLockedContent() { .endDate(LocalDate.now().plusDays(30)) .recruitCount(5) .bookJpaEntity(book) - .categoryJpaEntity(category) + .category(category) .build()); // 방 참가자 생성 (현재 페이지 10으로 설정) diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteApiTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteApiTest.java index ae38d0ffe..b470527ab 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteApiTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteApiTest.java @@ -4,22 +4,20 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.roompost.adapter.in.web.request.VoteRequest; import konkuk.thip.roompost.adapter.out.jpa.VoteItemJpaEntity; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteItemJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteParticipantJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -46,18 +44,16 @@ class VoteApiTest { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; @Autowired private VoteJpaRepository voteJpaRepository; @Autowired private VoteItemJpaRepository voteItemJpaRepository; @Autowired private VoteParticipantJpaRepository voteParticipantJpaRepository; - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; + private Category category; private RoomJpaEntity room; private VoteJpaEntity vote; @Autowired @@ -65,9 +61,9 @@ class VoteApiTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + alias = TestEntityFactory.createScienceAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + category = TestEntityFactory.createScienceCategory(); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); room = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); vote = voteJpaRepository.save(TestEntityFactory.createVote(user, room)); diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteCreateApiTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteCreateApiTest.java index e4208b295..e16bb8c0b 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteCreateApiTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteCreateApiTest.java @@ -5,21 +5,19 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.roompost.adapter.in.web.request.VoteCreateRequest; import konkuk.thip.roompost.adapter.out.jpa.VoteItemJpaEntity; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteItemJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -50,15 +48,9 @@ class VoteCreateApiTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private CategoryJpaRepository categoryJpaRepository; - @Autowired private BookJpaRepository bookJpaRepository; @@ -85,16 +77,14 @@ void tearDown() { roomJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); } private void saveUserAndRoom() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(alias, "user")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + Category category = TestEntityFactory.createScienceCategory(); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, user, RoomParticipantRole.MEMBER, 0.0)); diff --git a/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteDeleteApiTest.java b/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteDeleteApiTest.java index bb39dfed9..8824fab09 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteDeleteApiTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/in/web/VoteDeleteApiTest.java @@ -7,21 +7,19 @@ import konkuk.thip.comment.adapter.out.persistence.repository.CommentLikeJpaRepository; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.roompost.adapter.out.jpa.VoteItemJpaEntity; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteItemJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteParticipantJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -48,9 +46,7 @@ class VoteDeleteApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; - @Autowired private CategoryJpaRepository categoryJpaRepository; @Autowired private BookJpaRepository bookJpaRepository; @Autowired private CommentJpaRepository commentJpaRepository; @Autowired private CommentLikeJpaRepository commentLikeJpaRepository; @@ -61,10 +57,10 @@ class VoteDeleteApiTest { @Autowired private RoomJpaRepository roomJpaRepository; @Autowired private RoomParticipantJpaRepository roomParticipantJpaRepository; - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user1; private UserJpaEntity user2; - private CategoryJpaEntity category; + private Category category; private BookJpaEntity book; private CommentJpaEntity comment; private RoomJpaEntity room; @@ -74,10 +70,10 @@ class VoteDeleteApiTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user1 = userJpaRepository.save(TestEntityFactory.createUser(alias)); user2 = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); room = roomJpaRepository.save(TestEntityFactory.createRoom(book,category)); // 유저 1이 호스트, 유저 2가 멤버로 방 참여 diff --git a/src/test/java/konkuk/thip/roompost/adapter/out/jpa/RecordJpaEntityTest.java b/src/test/java/konkuk/thip/roompost/adapter/out/jpa/RecordJpaEntityTest.java index 16c5e8688..e7b8a7581 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/out/jpa/RecordJpaEntityTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/out/jpa/RecordJpaEntityTest.java @@ -4,15 +4,13 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.domain.value.Category; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -34,9 +32,6 @@ class RecordJpaEntityTest { @Autowired private UserJpaRepository userRepository; - @Autowired - private AliasJpaRepository aliasRepository; - @Autowired private BookJpaRepository bookRepository; @@ -46,17 +41,14 @@ class RecordJpaEntityTest { @Autowired private RecordJpaRepository recordRepository; - @Autowired - private CategoryJpaRepository categoryRepository; - @Test @DisplayName("RecordJpaEntity 저장 및 조회 테스트") void saveAndFindRecord() { // given - AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userRepository.save(TestEntityFactory.createUser(alias)); BookJpaEntity book = bookRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); RoomJpaEntity room = roomRepository.save(TestEntityFactory.createRoom(book, category)); RecordJpaEntity record = recordRepository.save(TestEntityFactory.createRecord(user, room)); diff --git a/src/test/java/konkuk/thip/roompost/adapter/out/jpa/VoteJpaEntityTest.java b/src/test/java/konkuk/thip/roompost/adapter/out/jpa/VoteJpaEntityTest.java index 8c708e9ff..385be678a 100644 --- a/src/test/java/konkuk/thip/roompost/adapter/out/jpa/VoteJpaEntityTest.java +++ b/src/test/java/konkuk/thip/roompost/adapter/out/jpa/VoteJpaEntityTest.java @@ -4,15 +4,13 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -34,9 +32,6 @@ class VoteJpaEntityTest { @Autowired private UserJpaRepository userRepository; - @Autowired - private AliasJpaRepository aliasRepository; - @Autowired private BookJpaRepository bookRepository; @@ -46,17 +41,14 @@ class VoteJpaEntityTest { @Autowired private VoteJpaRepository voteRepository; - @Autowired - private CategoryJpaRepository categoryRepository; - @Test @DisplayName("VoteJpaEntity 저장 및 조회 테스트") void saveAndFindVote() { // given - AliasJpaEntity alias = aliasRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userRepository.save(TestEntityFactory.createUser(alias)); BookJpaEntity book = bookRepository.save(TestEntityFactory.createBook()); - CategoryJpaEntity category = categoryRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + Category category = TestEntityFactory.createLiteratureCategory(); RoomJpaEntity room = roomRepository.save(TestEntityFactory.createRoom(book, category)); VoteJpaEntity vote = voteRepository.save(VoteJpaEntity.builder() diff --git a/src/test/java/konkuk/thip/roompost/application/service/VoteCreateServiceTest.java b/src/test/java/konkuk/thip/roompost/application/service/VoteCreateServiceTest.java index 31eb39c3f..abcc74362 100644 --- a/src/test/java/konkuk/thip/roompost/application/service/VoteCreateServiceTest.java +++ b/src/test/java/konkuk/thip/roompost/application/service/VoteCreateServiceTest.java @@ -3,20 +3,18 @@ import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.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.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteItemJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; import konkuk.thip.roompost.application.port.in.dto.vote.VoteCreateCommand; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,15 +34,9 @@ @DisplayName("[통합] 투표 생성 service 통합 테스트") class VoteCreateServiceTest { - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private CategoryJpaRepository categoryJpaRepository; - @Autowired private BookJpaRepository bookJpaRepository; @@ -71,19 +63,17 @@ void tearDown() { roomJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - categoryJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); } @Test @DisplayName("유저가 투표를 생성하면, 해당 유저의 [RoomParticipant의 currentPage, userPercentage]와 해당 방의 [Room의 roomPercentage] 값이 변경된다.") void vote_create_room_participant_and_room_percentage_update() throws Exception { //given - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(alias, "me")); BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook(369)); - CategoryJpaEntity category = categoryJpaRepository.save(TestEntityFactory.createScienceCategory(alias)); + Category category = TestEntityFactory.createScienceCategory(); RoomJpaEntity room = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room, me, RoomParticipantRole.MEMBER, 0.0)); diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java index e542d5ca0..57b281484 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java @@ -1,13 +1,12 @@ package konkuk.thip.user.adapter.in.web; import konkuk.thip.common.util.TestEntityFactory; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -38,9 +37,6 @@ class UserFollowApiTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private FollowingJpaRepository followingJpaRepository; @@ -48,21 +44,20 @@ class UserFollowApiTest { void tearDown() { followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @DisplayName("팔로우 요청 후 언팔로우 요청 시 엔티티가 삭제되었는지 확인한다.") void changeFollowingState_follow_then_unfollow() throws Exception { // 사용자 2명 저장 - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); UserJpaEntity followingUser = userJpaRepository.save(UserJpaEntity.builder() .nickname("user100") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("oauth2_user100") .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); UserJpaEntity target = userJpaRepository.save(UserJpaEntity.builder() @@ -70,7 +65,7 @@ void changeFollowingState_follow_then_unfollow() throws Exception { .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("oauth2_user200") .role(UserRole.USER) - .aliasForUserJpaEntity(alias) + .alias(alias) .build()); // 팔로우 요청 @@ -103,4 +98,4 @@ void changeFollowingState_follow_then_unfollow() throws Exception { userJpaEntity = userJpaRepository.findById(target.getUserId()).orElseThrow(); assertThat(userJpaEntity.getFollowerCount()).isEqualTo(0); // 팔로워 수 감소 확인 } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowersApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowersApiTest.java index 8a59ec1f8..0aba6ac17 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowersApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowersApiTest.java @@ -2,11 +2,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; 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.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -39,9 +38,6 @@ class UserGetFollowersApiTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; @@ -49,14 +45,16 @@ class UserGetFollowersApiTest { private FollowingJpaRepository followingJpaRepository; private UserJpaEntity targetUser; // 팔로워를 조회할 대상 사용자 + private UserJpaEntity loginUser; private List followerUsers; // 팔로워 12명 @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); // 대상 사용자 targetUser = userJpaRepository.save(TestEntityFactory.createUser(alias)); + loginUser = userJpaRepository.save(TestEntityFactory.createUser(alias)); // 팔로워 12명 생성 및 저장 followerUsers = new ArrayList<>(); @@ -73,6 +71,7 @@ void getFollowersWithCursorPaging() throws Exception { // 1. 첫 번째 요청 (cursor 없음) ResultActions firstPageResult = mockMvc.perform( get("/users/{userId}/followers", targetUser.getUserId()) + .requestAttr("userId", loginUser.getUserId()) ); firstPageResult.andExpect(status().isOk()) @@ -91,6 +90,7 @@ void getFollowersWithCursorPaging() throws Exception { ResultActions secondPageResult = mockMvc.perform( get("/users/{userId}/followers", targetUser.getUserId()) .param("cursor", nextCursor) + .requestAttr("userId", loginUser.getUserId()) ); secondPageResult.andExpect(status().isOk()) @@ -98,4 +98,4 @@ void getFollowersWithCursorPaging() throws Exception { .andExpect(jsonPath("$.data.isLast").value(true)) .andExpect(jsonPath("$.data.nextCursor").doesNotExist()); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowingApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowingApiTest.java index 76bbdd475..fb848746d 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowingApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowingApiTest.java @@ -2,11 +2,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; 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.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -39,9 +38,6 @@ class UserGetFollowingApiTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; @@ -53,7 +49,7 @@ class UserGetFollowingApiTest { @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); // 로그인 사용자 loginUser = userJpaRepository.save(TestEntityFactory.createUser(alias)); @@ -100,4 +96,4 @@ void getFollowingsWithCursorPaging() throws Exception { .andExpect(jsonPath("$.data.isLast").value(true)) .andExpect(jsonPath("$.data.nextCursor").doesNotExist()); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserIsFollowingApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserIsFollowingApiTest.java index 5519fe07e..118d5d2b0 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserIsFollowingApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserIsFollowingApiTest.java @@ -1,12 +1,11 @@ package konkuk.thip.user.adapter.in.web; import konkuk.thip.common.util.TestEntityFactory; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -33,9 +32,6 @@ class UserIsFollowingApiTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private FollowingJpaRepository followingJpaRepository; @@ -43,14 +39,13 @@ class UserIsFollowingApiTest { void tearDown() { followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @DisplayName("팔로우 관계가 존재하면 true를 반환한다.") void isFollowing_true() throws Exception { // given - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(alias)); @@ -74,7 +69,7 @@ void isFollowing_true() throws Exception { @DisplayName("팔로우 관계가 없으면 false를 반환한다.") void isFollowing_false() throws Exception { // given - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias alias = TestEntityFactory.createScienceAlias(); UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(alias)); @@ -87,4 +82,4 @@ void isFollowing_false() throws Exception { .andExpect(status().isOk()) .andExpect(jsonPath("$.data.isFollowing").value(false)); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserReactionApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserReactionApiTest.java index ff07c4ef0..494a22ab7 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserReactionApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserReactionApiTest.java @@ -10,20 +10,18 @@ import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; import konkuk.thip.post.adapter.out.jpa.PostLikeJpaEntity; import konkuk.thip.post.adapter.out.persistence.PostLikeJpaRepository; -import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.category.CategoryJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; +import konkuk.thip.room.domain.value.Category; import konkuk.thip.roompost.adapter.out.jpa.RecordJpaEntity; import konkuk.thip.roompost.adapter.out.jpa.VoteJpaEntity; import konkuk.thip.roompost.adapter.out.persistence.repository.record.RecordJpaRepository; import konkuk.thip.roompost.adapter.out.persistence.repository.vote.VoteJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -55,15 +53,9 @@ class UserReactionApiTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private CategoryJpaRepository categoryJpaRepository; - @Autowired private BookJpaRepository bookJpaRepository; @@ -88,9 +80,9 @@ class UserReactionApiTest { @Autowired private PostLikeJpaRepository postLikeJpaRepository; - private AliasJpaEntity alias; + private Alias alias; private UserJpaEntity user; - private CategoryJpaEntity category; + private Category category; private BookJpaEntity book; private RoomJpaEntity room; private FeedJpaEntity feed; @@ -99,9 +91,9 @@ class UserReactionApiTest { @BeforeEach void setUp() { - alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + alias = TestEntityFactory.createLiteratureAlias(); user = userJpaRepository.save(TestEntityFactory.createUser(alias)); - category = categoryJpaRepository.save(TestEntityFactory.createLiteratureCategory(alias)); + category = TestEntityFactory.createLiteratureCategory(); book = bookJpaRepository.save(TestEntityFactory.createBookWithISBN("9788954682152")); room = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); feed = feedJpaRepository.save(TestEntityFactory.createFeed(user, book, true)); @@ -209,4 +201,4 @@ void showUserReaction_cursorPaging_success() throws Exception { .andExpect(jsonPath("$.data.reactionList.length()").value(5)) .andExpect(jsonPath("$.data.isLast").value(true)); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserSearchApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserSearchApiTest.java index fc563c0c0..92842ba8c 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserSearchApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserSearchApiTest.java @@ -4,10 +4,9 @@ import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchJpaEntity; import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchType; import konkuk.thip.recentSearch.adapter.out.persistence.repository.RecentSearchJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -43,14 +42,11 @@ class UserSearchApiTest { @Autowired private RecentSearchJpaRepository recentSearchJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - private Long currentUserId; @BeforeEach void setUp() { - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); // 검색 요청을 하는 사용자 UserJpaEntity currentUser = userJpaRepository.save(TestEntityFactory.createUser(alias, "검색자")); diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserShowFollowingsInFeedViewApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserShowFollowingsInFeedViewApiTest.java index 2d97842d0..95531b453 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserShowFollowingsInFeedViewApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserShowFollowingsInFeedViewApiTest.java @@ -5,12 +5,11 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.feed.adapter.out.jpa.FeedJpaEntity; import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -38,7 +37,6 @@ class UserShowFollowingsInFeedViewApiTest { @Autowired private MockMvc mockMvc; - @Autowired private AliasJpaRepository aliasJpaRepository; @Autowired private UserJpaRepository userJpaRepository; @Autowired private FeedJpaRepository feedJpaRepository; @Autowired private FollowingJpaRepository followingJpaRepository; @@ -50,7 +48,6 @@ void tearDown() { feedJpaRepository.deleteAllInBatch(); followingJpaRepository.deleteAllInBatch(); userJpaRepository.deleteAllInBatch(); - aliasJpaRepository.deleteAllInBatch(); bookJpaRepository.deleteAllInBatch(); } @@ -58,7 +55,7 @@ void tearDown() { @DisplayName("전체 피드 조회 화면에서, 내가 팔로잉 하는 사람들의 [userId, 닉네임, 프로필 이미지] 정보를 1.최근 공개 피드를 작성한 사람 -> 2.최근 팔로잉 맺은 사람 순으로 반환합니다.") void show_my_following_recent_writers_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); @@ -96,7 +93,7 @@ void show_my_following_recent_writers_test() throws Exception { @DisplayName("내가 팔로잉 하는 사람들 중, 공개 피드를 작성한 사람들이 많을 경우, 이들 중 가장 최근에 피드를 작성한 사람들 10명만을 조회합니다.") void show_my_following_recent_writers_private_feed_writer_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); @@ -207,7 +204,7 @@ void show_my_following_recent_writers_private_feed_writer_test() throws Exceptio @DisplayName("내가 팔로잉 하는 사람들 중, 최근에 공개 피드를 작성한 사람이 적을 경우, 이 사람들 + 최근에 팔로잉 맺은 사람들을 10명 조회합니다.") void show_my_following_recent_writers_too_many_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); @@ -330,7 +327,7 @@ void show_my_following_recent_writers_too_many_test() throws Exception { @DisplayName("유저가 가장 최근에 작성한 피드의 작성 시각(= createdAt)을 기준으로 정렬하여 반환된다.") void show_my_following_recent_writers_latest_feed_check_test() throws Exception { //given - AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + Alias a0 = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); UserJpaEntity user1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user1")); UserJpaEntity user2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "user2")); 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 0c22ec6f8..77b38e3be 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 @@ -5,10 +5,9 @@ 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; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,9 +39,6 @@ class UserSignupControllerTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Autowired private UserJpaRepository userJpaRepository; @@ -52,17 +48,16 @@ class UserSignupControllerTest { @AfterEach void tearDown() { userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @DisplayName("[칭호id, 닉네임] 정보를 바탕으로 회원가입을 진행한다.") void signup_success() throws Exception { //given : alias 생성, 회원가입 request 생성 - AliasJpaEntity aliasJpaEntity = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserSignupRequest request = new UserSignupRequest( - aliasJpaEntity.getValue(), + alias.getValue(), "테스트유저" ); @@ -82,10 +77,8 @@ 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(userAliasJpaEntity.getValue()).isEqualTo(request.aliasName()); assertThat(userJpaEntity.getNickname()).isEqualTo(request.nickname()); + assertThat(userJpaEntity.getAlias().getValue()).isEqualTo(request.aliasName()); } @Test @@ -192,11 +185,11 @@ void signup_nickname_too_long() throws Exception { @DisplayName("임시 토큰을 통해 @Oauth2Id로 oauth2Id를 정확히 추출하여 회원가입에 성공한다.") void signup_whenValidSignupToken_thenExtractOauth2IdCorrectly() throws Exception { //given : alias 데이터 저장 - AliasJpaEntity aliasJpaEntity = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); //회원가입 request 생성 UserSignupRequest request = new UserSignupRequest( - aliasJpaEntity.getValue(), + alias.getValue(), "테스트유저" ); @@ -242,6 +235,4 @@ void signup_whenNoToken_thenUnauthorized() throws Exception { .andExpect(jsonPath("$.code").value(AUTH_TOKEN_NOT_FOUND.getCode())) .andExpect(jsonPath("$.message", containsString(AUTH_TOKEN_NOT_FOUND.getMessage()))); } - - } diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserUpdateApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserUpdateApiTest.java index 1c76c0321..04225af42 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserUpdateApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserUpdateApiTest.java @@ -3,11 +3,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.user.adapter.in.web.request.UserUpdateRequest; -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.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,28 +39,24 @@ class UserUpdateApiTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @AfterEach void tearDown() { userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @DisplayName("사용자 닉네임과 별칭이 정상적으로 업데이트된다.") void updateUser_success() throws Exception { // given: 기존 alias 및 user 생성 - AliasJpaEntity oldAlias = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); - AliasJpaEntity newAlias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias oldAlias = TestEntityFactory.createScienceAlias(); + Alias newAlias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .nickname("oldthip") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .oauth2Id("oauth2_user100") .role(UserRole.USER) - .aliasForUserJpaEntity(oldAlias) + .alias(oldAlias) .build()); Long userId = user.getUserId(); @@ -80,8 +75,6 @@ void updateUser_success() throws Exception { // DB 검증: 닉네임과 alias가 업데이트되었는지 확인 UserJpaEntity updatedUser = userJpaRepository.findById(userId).orElseThrow(); assertThat(updatedUser.getNickname()).isEqualTo("newthip"); - - AliasJpaEntity updatedAlias = aliasJpaRepository.findById(updatedUser.getAliasForUserJpaEntity().getAliasId()).orElseThrow(); - assertThat(updatedAlias.getValue()).isEqualTo(newAlias.getValue()); + assertThat(updatedUser.getAlias()).isEqualTo(newAlias); } -} \ No newline at end of file +} 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 c26e0d41b..63b6f12c1 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 @@ -4,10 +4,9 @@ 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; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -44,13 +43,9 @@ class UserVerifyNicknameControllerTest { @Autowired private UserJpaRepository userJpaRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @AfterEach void tearDown() { userJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); } @Test @@ -79,14 +74,14 @@ void verify_nickname_true() throws Exception { @DisplayName("[닉네임]값이 이미 DB에 존재하는 경우, false를 반환한다.") void verify_nickname_false() throws Exception { //given: DB에 "테스트유저" 생성 - AliasJpaEntity aliasJpaEntity = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity userJpaEntity = UserJpaEntity.builder() .nickname("테스트유저") .nicknameUpdatedAt(LocalDate.now().minusMonths(7)) .role(USER) .oauth2Id("kakao_12345678") - .aliasForUserJpaEntity(aliasJpaEntity) + .alias(alias) .build(); userJpaRepository.save(userJpaEntity); 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 8891a3fe2..7b24853db 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,13 +2,10 @@ 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.repository.category.CategoryJpaRepository; -import konkuk.thip.user.adapter.in.web.response.UserViewAliasChoiceResponse; -import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; -import org.junit.jupiter.api.AfterEach; +import konkuk.thip.common.util.EnumMappings; +import konkuk.thip.room.domain.value.Category; +import konkuk.thip.user.domain.value.Alias; +import org.assertj.core.groups.Tuple; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -17,9 +14,8 @@ import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import java.util.List; +import java.util.ArrayList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; @@ -39,51 +35,60 @@ class UserViewAliasChoiceControllerTest { @Autowired private ObjectMapper objectMapper; - @Autowired - private AliasJpaRepository aliasJpaRepository; - - @Autowired - private CategoryJpaRepository categoryJpaRepository; - - @AfterEach - void tearDown() { - categoryJpaRepository.deleteAll(); - aliasJpaRepository.deleteAll(); - } - @Test - @DisplayName("현재 DB에 존재하는 모든 [칭호, 카테고리] 정보를 반환한다.") + @DisplayName("유저 칭호 선택 화면을 조회하면, enum으로 정의된 Alias/Category 매핑이 형식과 내용 모두 정확히 반환된다.") void show_alias_choice_view() throws Exception { - //given - saveAliasesAndCategories(); - - //when - ResultActions result = mockMvc.perform(get("/users/alias") - .contentType(MediaType.APPLICATION_JSON)); - - //then - result.andExpect(status().isOk()) - .andExpect(jsonPath("$.data.aliasChoices").exists()); - - String json = result.andReturn().getResponse().getContentAsString(); - JsonNode jsonNode = objectMapper.readTree(json); - UserViewAliasChoiceResponse showResponse = objectMapper.treeToValue(jsonNode.get("data"), UserViewAliasChoiceResponse.class); - List choices = showResponse.aliasChoices(); - - assertThat(choices).hasSize(2); - assertThat(choices) - .extracting("aliasName", "categoryName") - .containsExactlyInAnyOrder( - tuple("문학가", "문학"), - tuple("과학자", "과학·IT") - ); - } - - private void saveAliasesAndCategories() { - 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)); + // given: EnumMappings을 기준으로 기대값 구성 + var aliasToCategory = EnumMappings.getAliasToCategory(); + int expectedCount = aliasToCategory.size(); + + // when + var mvcResult = mockMvc.perform(get("/users/alias") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.aliasChoices").isArray()) + .andExpect(jsonPath("$.data.aliasChoices.length()").value(expectedCount)) + .andReturn(); + + // then: 응답 파싱 후 형식 및 내용 검증 + String body = mvcResult.getResponse().getContentAsString(); + JsonNode root = objectMapper.readTree(body); + JsonNode choices = root.path("data").path("aliasChoices"); + assertThat(choices.isArray()).isTrue(); + assertThat(choices.size()).isEqualTo(expectedCount); + + // 실제 응답을 (aliasName, categoryName, imageUrl, aliasColor) 튜플로 수집 + var actualTuples = new ArrayList(); + for (JsonNode n : choices) { + String aliasName = n.path("aliasName").asText(); + String categoryName = n.path("categoryName").asText(); + String imageUrl = n.path("imageUrl").asText(); + String aliasColor = n.path("aliasColor").asText(); + + // 스키마 기본 검증 + assertThat(aliasName).isNotBlank(); + assertThat(categoryName).isNotBlank(); + assertThat(imageUrl).isNotBlank(); + assertThat(aliasColor).isNotBlank(); + + actualTuples.add(tuple(aliasName, categoryName, imageUrl, aliasColor)); + } + + // 기대 튜플 구성: EnumMappings의 SSOT 기준 + var expectedTuples = aliasToCategory.entrySet().stream() + .map(e -> { + Alias alias = e.getKey(); + Category category = e.getValue(); + return tuple( + alias.getValue(), // aliasName + category.getValue(), // categoryName + alias.getImageUrl(), // imageUrl + alias.getColor() // aliasColor + ); + }) + .toList(); + + assertThat(actualTuples) + .containsExactlyInAnyOrderElementsOf(expectedTuples); } } 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 e847afb95..832e43af2 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 @@ -3,8 +3,8 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import konkuk.thip.common.util.TestEntityFactory; -import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -26,14 +26,11 @@ class UserJpaEntityTest { @Autowired private UserJpaRepository userRepository; - @Autowired - private AliasJpaRepository aliasJpaRepository; - @Test @DisplayName("UserJpaEntity 저장 및 조회 테스트") void saveAndFindUser() { // given - AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + Alias alias = TestEntityFactory.createLiteratureAlias(); UserJpaEntity user = userRepository.save(TestEntityFactory.createUser(alias)); // when @@ -44,7 +41,7 @@ void saveAndFindUser() { // then assertThat(foundUser.getNickname()).isEqualTo("테스터"); - assertThat(foundUser.getAliasForUserJpaEntity().getValue()).isEqualTo("문학가"); + assertThat(foundUser.getAlias().getValue()).isEqualTo("문학가"); assertThat(foundUser.getRole()).isEqualTo(UserRole.USER); } -} \ No newline at end of file +} diff --git a/src/test/java/konkuk/thip/user/application/service/UserUpdateServiceTest.java b/src/test/java/konkuk/thip/user/application/service/UserUpdateServiceTest.java index 16e24090f..134aff546 100644 --- a/src/test/java/konkuk/thip/user/application/service/UserUpdateServiceTest.java +++ b/src/test/java/konkuk/thip/user/application/service/UserUpdateServiceTest.java @@ -4,7 +4,7 @@ import konkuk.thip.user.application.port.in.dto.UserUpdateCommand; import konkuk.thip.user.application.port.out.UserCommandPort; import konkuk.thip.user.application.port.out.UserQueryPort; -import konkuk.thip.user.domain.Alias; +import konkuk.thip.user.domain.value.Alias; import konkuk.thip.user.domain.User; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/konkuk/thip/user/domain/UserTest.java b/src/test/java/konkuk/thip/user/domain/UserTest.java index 2fb031840..e8a7649ff 100644 --- a/src/test/java/konkuk/thip/user/domain/UserTest.java +++ b/src/test/java/konkuk/thip/user/domain/UserTest.java @@ -2,6 +2,7 @@ import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.common.exception.code.ErrorCode; +import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;