Skip to content

[refactor] alias 응답시 aliasColor 도 같이 반환하도록 수정 + 필요한 사진 데이터 추가#193

Merged
seongjunnoh merged 11 commits into
developfrom
refactor/#131-alias-color-value-add
Aug 12, 2025
Merged

[refactor] alias 응답시 aliasColor 도 같이 반환하도록 수정 + 필요한 사진 데이터 추가#193
seongjunnoh merged 11 commits into
developfrom
refactor/#131-alias-color-value-add

Conversation

@seongjunnoh

@seongjunnoh seongjunnoh commented Aug 11, 2025

Copy link
Copy Markdown
Collaborator

#️⃣ 연관된 이슈

closes #131, #194

📝 작업 내용

이슈 참고해주시면 됩니다

  • 실제 alias color 값 주입 (RDS 에서도 데이터 수정했습니다)
  • aws s3 bucket 에 사용할 실제 image 파일들 업로드하였습니다 (모든 퍼블릭 엑세스 허용이 되어있길래 일단 놔두었습니다)
  • 실제 image url 값 주입 (RDS 에서도 데이터 수정했습니다)
  • response 에서 String aliasName, String aliasColor 값으로 구분해서 응답하도록 수정했습니다

📸 스크린샷

image image

aliasName, aliasColor, user profile image url, room image url 모두 사진과 같이 응답되도록 구성하였습니다
(로컬 서버, 로컬 DB로 테스트하긴 헀는데 개발 서버, RDS 에서도 잘 될 겁니다 하하)

💬 리뷰 요구사항

현재 DB에는 string alias value, category value 에 해당하는 데이터만 존재하는게 아니라, alias 에 대한 모든 값, category 에 대한 모든값이 저장되어 있습니다

지난 서버에서 이를 DB에는 string alias value, category value, tag value 만을 저장하고, 이를 어플리케이션단에서 java 코드의 enum 클래스와 매핑하여 세부적인 값들은 코드상에서 관리하도록 결정하였습니다.

하지만 이번에 alias color, image url 을 반환하기 위해 기존에 구현된 코드를 보니 조회 코드에서 자바 코드의 enum Alias, Category 로부터 color, imageUrl 값을 얻어오는게 아니라, 쿼리문으로 DB상에 저장된 값을 바로 가져오도록 구현된 코드가 많아 보입니다

일단 RDS와 로컬 DB에 Alias, Category 세부 값들을 직접 저장해두어서 api는 제대로 동작할 거지만, 추후 리펙토링을 진행하면서 이 부분 또한 고려해봐야할 것 같습니다!

일단 눈에 보이는 부분은 todo 주석처리해두었습니다!

관련해서 노션 리펙 정리본에 추가해두겠습니다!

📌 PR 진행 시 이러한 점들을 참고해 주세요

* P1 : 꼭 반영해 주세요 (Request Changes) - 이슈가 발생하거나 취약점이 발견되는 케이스 등
* P2 : 반영을 적극적으로 고려해 주시면 좋을 것 같아요 (Comment)
* P3 : 이런 방법도 있을 것 같아요~ 등의 사소한 의견입니다 (Chore)

Summary by CodeRabbit

  • New Features

    • 피드(목록/상세) 및 마이페이지 프로필에 별칭 이름(aliasName)과 별칭 색상(aliasColor) 제공
  • Refactor

    • 공개 응답 필드명 정리: alias → aliasName, color → aliasColor
  • Style

    • 별칭 색상 팔레트에 명확한 HEX 코드 적용 및 별칭/카테고리 이미지가 원격 URL로 전환되어 시각 일관성 개선
  • Tests

    • 일부 테스트의 검증을 간소화하여 값 존재 여부 중심으로 변경
  • Chores

    • 사용되지 않는 빈 응답 타입 제거

@coderabbitai

coderabbitai Bot commented Aug 11, 2025

Copy link
Copy Markdown

Walkthrough

피드·유저 응답 DTO에서 alias를 aliasName/aliasColor로 분리·확장하고, 매퍼와 서비스 호출부를 이에 맞춰 수정했습니다. Alias enum에 imageUrl과 HEX 색상이 추가되었고, Category 이미지 URL과 일부 테스트·빈 DTO 정리도 함께 변경되었습니다.

Changes

Cohort / File(s) Summary
Feed responses & mapper
src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowAllResponse.java, src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowSingleResponse.java, src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java
FeedShowAllResponse.FeedDto: alias 제거 → aliasName, aliasColor 추가. FeedShowSingleResponse: 컴포넌트명 aliasaliasName로 변경(별도 aliasColor 미추가). FeedQueryMapper: 목록 매핑에 aliasColor 추가(Alias.from(...).getColor()), 단건/사용자 매핑은 aliasaliasName 반영.
User responses / service / DTO & repo
src/main/java/konkuk/thip/user/adapter/in/web/response/UserProfileResponse.java, src/main/java/konkuk/thip/user/adapter/in/web/response/UserViewAliasChoiceResponse.java, src/main/java/konkuk/thip/user/application/service/UserMyPageService.java, src/main/java/konkuk/thip/user/application/port/in/dto/UserViewAliasChoiceResult.java, src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasQueryRepositoryImpl.java
UserProfileResponse에 aliasColor 컴포넌트 추가 및 of(...) 시그니처 확장; UserMyPageService에서 color 전달. UserViewAliasChoiceResponse/Result: coloraliasColor로 필드명 변경. AliasQueryRepositoryImpl에 TODO 주석 추가(무기능).
Domain enum Alias
src/main/java/konkuk/thip/user/domain/Alias.java
Alias enum에 imageUrl 필드 추가 및 각 상수에 imageUrl과 HEX 색상값 추가(생성자 3인자: value, color, imageUrl). from(String) 로직 유지.
Room Category enum images
src/main/java/konkuk/thip/room/domain/Category.java
Category enum의 imageUrl 값들을 로컬 키에서 S3 HTTPS URL로 교체.
Vote module cleanup
src/main/java/konkuk/thip/vote/adapter/in/web/response/DummyResponse.java
빈 DTO 클래스 DummyResponse 삭제.
Tests updated
src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java, src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java
테스트 기대값 간소화: roomImageUrl을 notNull로 변경, alias choice assertions에서 imageUrl/color 검증 제거(aliasName/categoryName만 검증).

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant FeedController
  participant FeedService
  participant FeedQueryMapper
  participant AliasEnum as Alias

  Client->>FeedController: GET /feeds
  FeedController->>FeedService: findAll()
  FeedService->>FeedQueryMapper: toFeedShowAllResponse(dtoList)
  loop each dto
    FeedQueryMapper->>AliasEnum: Alias.from(dto.alias).getColor()
    AliasEnum-->>FeedQueryMapper: aliasColor
  end
  FeedQueryMapper-->>FeedService: FeedShowAllResponse(aliasName, aliasColor, ...)
  FeedService-->>FeedController: response
  FeedController-->>Client: 200 OK
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Assessment against linked issues

Objective Addressed Explanation
피드 목록 응답에 alias color 포함하도록 수정 (#131)
피드 단건 응답에 alias color 포함하도록 수정 (#131) FeedShowSingleResponse에 aliasColor 필드가 추가되지 않음.
유저 프로필 응답에 alias color 포함하도록 수정 (#131)
유저 alias 선택 목록에 color 노출 정비 (#131)

Assessment against linked issues: Out-of-scope changes

Code Change Explanation
Alias enum에 imageUrl 추가 및 상수에 imageUrl 값 추가 (src/main/java/konkuk/thip/user/domain/Alias.java) 이슈 #131은 "alias color 반환" 요구만 명시되어 있으며 imageUrl 추가는 요구에 포함되지 않음.
Category enum의 imageUrl을 S3 URL로 변경 (src/main/java/konkuk/thip/room/domain/Category.java) 이 변경은 이슈 #131의 범위(alias color 반환)와 직접 관련이 없음.
DummyResponse 클래스 삭제 (src/main/java/konkuk/thip/vote/adapter/in/web/response/DummyResponse.java) 투표 모듈의 빈 DTO 제거는 이슈 #131의 요구사항과 무관함.

Possibly related PRs

Suggested reviewers

  • hd0rable
  • buzz0331

Poem

깡충깡충 나는 토끼가 말하네,
이름엔 이름을, 옷엔 색을 더했네.
HEX 빛 한 줄기, 그림자에 스민다.
응답 바구니는 이제 더 반짝인다.
토끼는 PR에 당근을 꽂아둔다 🥕✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ae5a717 and e325d0d.

📒 Files selected for processing (2)
  • src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java (1 hunks)
  • src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java (3 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/#131-alias-color-value-add

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions

github-actions Bot commented Aug 11, 2025

Copy link
Copy Markdown

Test Results

374 tests   374 ✅  31s ⏱️
110 suites    0 💤
110 files      0 ❌

Results for commit cf182f9.

♻️ This comment has been updated with latest results.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🔭 Outside diff range comments (1)
src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java (1)

27-33: toFeedShowAllResponse: aliasName 매핑 추가 및 aliasColor null-safe 처리 필요

  • toFeedShowAllResponse 매핑에서 dto.alias() 기반으로 aliasName을 내려주고 있지 않습니다.
  • Alias.from(dto.alias()).getColor()dto.alias()null이거나 잘못된 값일 경우 IllegalArgumentException을 던져 매핑 전체가 실패할 수 있습니다.
  • 다른 매퍼 메서드(feedOwner·feedCreator)에는 이미 aliasName/aliasColor 매핑이 적용되어 있습니다.

권장 최소 변경:

-    @Mapping(target = "aliasColor", expression = "java(Alias.from(dto.alias()).getColor())")
+    @Mapping(target = "aliasName", source = "dto.alias")
+    @Mapping(target = "aliasColor", expression = "java(dto.alias() == null ? null : Alias.from(dto.alias()).getColor())")

더 견고한 방식(@nAmed 헬퍼 사용):

-    @Mapping(target = "aliasColor", expression = "java(Alias.from(dto.alias()).getColor())")
+    @Mapping(target = "aliasName", source = "dto.alias")
+    @Mapping(target = "aliasColor", source = "dto.alias", qualifiedByName = "mapAliasColor")

헬퍼 메서드 추가:

@Named("mapAliasColor")
default String mapAliasColor(String alias) {
    if (alias == null) return null;
    try {
        return Alias.from(alias).getColor();
    } catch (IllegalArgumentException e) {
        // 알 수 없는 alias 방어
        return null;
    }
}
🧹 Nitpick comments (1)
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasQueryRepositoryImpl.java (1)

27-27: TODO 주석 구체화 제안

DB 스키마 변경에 대한 TODO 주석이 추가되었는데, 좀 더 구체적인 정보가 있으면 좋겠습니다. 언제, 어떤 상황에서 이 변경이 필요한지 명시하거나 관련 이슈 번호를 참조하는 것을 추천합니다.

다음과 같이 TODO 주석을 개선할 수 있습니다:

-// TODO : DB에 String alias 만 저장하도록 바뀐다면 쿼리 수정해야함
+// TODO: [이슈번호] DB 스키마가 String alias만 저장하도록 변경될 때 이 쿼리를 alias.value -> alias 로 수정 필요
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 235404c and 37c2da8.

📒 Files selected for processing (10)
  • src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowAllResponse.java (1 hunks)
  • src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowSingleResponse.java (1 hunks)
  • src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java (3 hunks)
  • src/main/java/konkuk/thip/user/adapter/in/web/response/UserProfileResponse.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/in/web/response/UserViewAliasChoiceResponse.java (2 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/alias/AliasQueryRepositoryImpl.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/port/in/dto/UserViewAliasChoiceResult.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/service/UserMyPageService.java (1 hunks)
  • src/main/java/konkuk/thip/user/domain/Alias.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/in/web/response/DummyResponse.java (0 hunks)
💤 Files with no reviewable changes (1)
  • src/main/java/konkuk/thip/vote/adapter/in/web/response/DummyResponse.java
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#113
File: src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/RecentSearchCommandPersistenceAdapter.java:38-44
Timestamp: 2025-07-30T14:05:04.945Z
Learning: seongjunnoh는 코드 최적화 제안에 대해 구체적인 기술적 근거와 효율성 차이를 이해하고 싶어하며, 성능 개선 방식에 대한 상세한 설명을 선호한다.
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#93
File: src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java:49-114
Timestamp: 2025-07-28T16:44:31.224Z
Learning: seongjunnoh는 코드 중복 문제에 대한 리팩토링 제안을 적극적으로 수용하고 함수형 인터페이스를 활용한 해결책을 선호한다.
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#112
File: src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java:272-272
Timestamp: 2025-07-30T10:44:34.115Z
Learning: seongjunnoh는 피드 커서 페이지네이션에서 LocalDateTime 단일 커서 방식을 선호하며, 복합 키 기반 커서보다 구현 단순성과 성능을 우선시한다.
🔇 Additional comments (11)
src/main/java/konkuk/thip/user/application/port/in/dto/UserViewAliasChoiceResult.java (1)

11-11: 필드명 변경 후 레거시 참조 없음 확인

  • rg '\.color\(\)' 검색 결과, .color() 호출이 전혀 발견되지 않음
  • rg 'new AliasChoice.*color' 검색 결과, 생성자 인자로 color를 사용하는 코드가 없음
  • UserViewAliasChoiceResponse 매핑부에서도 ac.aliasColor()로 모두 업데이트됨

따라서 내부 코드 상에서는 더 이상 color 필드를 참조하는 부분이 없어 하위 호환성 문제가 없습니다.

src/main/java/konkuk/thip/user/adapter/in/web/response/UserProfileResponse.java (2)

6-7: aliasName과 aliasColor 필드 추가 승인

PR 목표에 맞게 alias 정보를 name과 color로 분리하여 제공하도록 개선되었습니다.


9-11: 팩토리 메서드 호출 업데이트 검증 완료

UserProfileResponse.of() 호출부가 모두 4개 파라미터로 변경된 것을 확인했습니다.

  • src/main/java/konkuk/thip/user/application/service/UserMyPageService.java: 4개 인자(imageUrl, nickname, aliasName, aliasColor)로 호출됨
src/main/java/konkuk/thip/user/adapter/in/web/response/UserViewAliasChoiceResponse.java (2)

15-15: 매핑 로직 업데이트 승인

DTO에서 ac.aliasColor()를 사용하도록 매핑 로직이 올바르게 업데이트되었습니다.


25-25: AliasChoice record 필드명 변경 승인

중첩 record의 필드명이 color에서 aliasColor로 일관되게 변경되었습니다.

src/main/java/konkuk/thip/user/domain/Alias.java (1)

17-19: 필드 추가 승인

imageUrl 필드가 추가되어 Alias의 시각적 표현을 지원할 수 있게 되었습니다. Lombok의 @RequiredArgsConstructor와 잘 연동됩니다.

src/main/java/konkuk/thip/user/application/service/UserMyPageService.java (1)

51-51: 서비스 로직 업데이트 승인

UserProfileResponse.of() 호출이 새로운 시그니처에 맞게 올바르게 업데이트되었습니다. user.getAlias().getColor()를 통해 도메인에서 색상 정보를 적절히 추출하고 있습니다.

src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowSingleResponse.java (1)

8-8: 필드명 aliasName 변경 – 매핑 로직 정상 반영 확인됨

FeedQueryMappertoFeedShowSingleResponse 메서드에

@Mapping(target = "aliasName", source = "feedCreator.alias.value")
@Mapping(target = "aliasColor",  source = "feedCreator.alias.color")

가 올바르게 적용되어 있어 추가 수정이 필요 없습니다.

src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java (3)

10-10: Alias import 추가 적절

enum 기반 색상 매핑과 어노테이션 imports 지정에 필요한 참조입니다. 문제 없습니다.


22-22: MapStruct imports에 Alias 추가 OK

expression = "java(...)"에서 간단명 Alias를 사용하려면 @Mapper(imports = { ... })에 포함되어야 합니다. 생성된 구현체에 import가 추가되어 컴파일 이슈를 방지합니다.


72-74: 단건 조회 DTO에서 aliasName/aliasColor 매핑 일관화 — LGTM

feedCreator.alias.value/color를 직접 매핑해 FE 계약(aliasName/aliasColor 분리)에 맞췄습니다. 도메인에서 alias가 null이 아님이 보장된다면 현재 방식이 가장 단순하고 안전합니다.

Comment on lines +15 to +16
String aliasName,
String aliasColor,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

aliasName과 aliasColor 필드 추가 승인

기존 alias 필드를 aliasNamealiasColor로 분리하여 PR 목표에 완벽하게 부합하는 개선이 이루어졌습니다. 이제 클라이언트에서 alias의 이름과 색상을 별도로 활용할 수 있습니다.

다음 스크립트로 매퍼에서 새로운 필드들에 대한 매핑이 올바르게 구현되었는지 확인해보겠습니다:


🏁 Script executed:

#!/bin/bash
# Description: FeedShowAllResponse 매핑 로직 확인
# Expected: aliasName과 aliasColor 매핑이 구현되어 있는지 확인

echo "=== FeedShowAllResponse/FeedDto 매핑 관련 코드 검색 ==="
rg -A 10 "FeedShowAllResponse" --type java | grep -E "(aliasName|aliasColor|toFeedShowAllResponse)"

echo "=== toFeedShowAllResponse 메서드 구현 확인 ==="
ast-grep --pattern 'toFeedShowAllResponse($$$) { $$$ }' --lang java

echo "=== aliasName과 aliasColor 매핑 확인 ==="
rg -A 5 -B 5 "aliasName.*aliasColor" --type java

Length of output: 2506


🏁 Script executed:

#!/bin/bash
# 확인: FeedQueryMapper.toFeedShowAllResponse 구현에서 aliasName과 aliasColor 매핑이 빠짐없이 이루어졌는지 조회

echo "=== toFeedShowAllResponse 메서드 구현 전체 보기 ==="
rg -n -C 10 "toFeedShowAllResponse" src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java

Length of output: 1129


FeedQueryMapper에 aliasName 매핑 추가 필요

toFeedShowAllResponse 구현부에서 aliasColor만 매핑되고 aliasName 매핑이 빠져 있습니다. 아래 위치에 aliasName 매핑을 추가해주세요.

• 파일: src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java
위치: 인터페이스 선언부, @Mapping(target = "aliasColor", …) 바로 위

예시 추가 코드:

@Mapping(target = "aliasName", expression = "java(Alias.from(dto.alias()).getName())")
@Mapping(target = "aliasColor", expression = "java(Alias.from(dto.alias()).getColor())")
🤖 Prompt for AI Agents
In
src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowAllResponse.java
around lines 15 to 16, the mapper mapping for aliasName is missing—update the
FeedQueryMapper interface (file:
src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java) by
adding a @Mapping for aliasName immediately above the existing @Mapping for
aliasColor; specifically, map aliasName using an expression like
Alias.from(dto.alias()).getName() and keep the aliasColor mapping as-is so both
aliasName and aliasColor are populated in toFeedShowAllResponse.

Comment thread src/main/java/konkuk/thip/user/domain/Alias.java Outdated
@seongjunnoh seongjunnoh changed the title [refactor] alias 응답시 aliasColor 도 같이 반환하도록 수정 [refactor] alias 응답시 aliasColor 도 같이 반환하도록 수정 + 필요한 사진 데이터 추가 Aug 11, 2025

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (3)
src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java (2)

31-31: 와일드카드 static import 지양 권장

필요한 매처만 명시적으로 import하면 네임스페이스 충돌과 불필요한 의존을 줄일 수 있습니다.

적용 예시:

-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.startsWith;

191-191: roomImageUrl 검증을 더 강하게: 단순 notNull → URL 형태 확인

S3/원격 리소스를 쓰므로 값이 있는지만 보는 것보다 HTTP URL 형태를 보장하는 편이 좋습니다. 버킷/경로를 하드코딩하지 않고도 강건해집니다.

-                .andExpect(jsonPath("$.data.roomImageUrl", notNullValue()))      // 방 대표 이미지 반환된다
+                .andExpect(jsonPath("$.data.roomImageUrl", startsWith("http")))  // 방 대표 이미지: 원격 URL 형태 보장
src/main/java/konkuk/thip/user/domain/Alias.java (1)

11-15: S3 버킷 도메인 하드코딩 대신 CDN/설정 주입 고려

도메인/리전 변경, 사설 버킷 전환, CDN 적용 등을 대비해 커스텀 도메인(CloudFront) 또는 설정 기반 주입으로 전환하면 운영 유연성이 커집니다.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 37c2da8 and ae5a717.

📒 Files selected for processing (4)
  • src/main/java/konkuk/thip/room/domain/Category.java (1 hunks)
  • src/main/java/konkuk/thip/user/domain/Alias.java (1 hunks)
  • src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java (2 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#113
File: src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/RecentSearchCommandPersistenceAdapter.java:38-44
Timestamp: 2025-07-30T14:05:04.945Z
Learning: seongjunnoh는 코드 최적화 제안에 대해 구체적인 기술적 근거와 효율성 차이를 이해하고 싶어하며, 성능 개선 방식에 대한 상세한 설명을 선호한다.
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#93
File: src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java:49-114
Timestamp: 2025-07-28T16:44:31.224Z
Learning: seongjunnoh는 코드 중복 문제에 대한 리팩토링 제안을 적극적으로 수용하고 함수형 인터페이스를 활용한 해결책을 선호한다.
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#112
File: src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java:272-272
Timestamp: 2025-07-30T10:44:34.115Z
Learning: seongjunnoh는 피드 커서 페이지네이션에서 LocalDateTime 단일 커서 방식을 선호하며, 복합 키 기반 커서보다 구현 단순성과 성능을 우선시한다.
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (1)
src/main/java/konkuk/thip/user/domain/Alias.java (1)

11-15: Alias enum 확장(HEX color + imageUrl) 방향 👍

응답 스키마(aliasName/aliasColor)와 쓰임새에 정확히 부합합니다. 각 HEX 코드 값도 일관적으로 보입니다.

Comment on lines +19 to +23
SCIENCE_IT("과학·IT", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_science.png"),
LITERATURE("문학", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_literature.png"),
ART("예술", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_art.png"),
SOCIAL_SCIENCE("사회과학", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_sociology.png"),
HUMANITY("인문학", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_humanities.png");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

S3 URL 하드코딩 최소화: 베이스 URL 상수화/설정화 권장

현재 각 상수에 전체 S3 URL이 반복되어 환경 변경(버킷/리전/도메인 전환)에 취약합니다. 베이스 경로를 상수(혹은 설정)로 분리해 중복과 변경 비용을 줄이세요.

  • 소규모 리팩터(상수화) 예시:
// enum 내부 상단 등 적절한 위치에 추가
private static final String ASSET_BASE = "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/";
-    SCIENCE_IT("과학·IT", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_science.png"),
-    LITERATURE("문학", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_literature.png"),
-    ART("예술", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_art.png"),
-    SOCIAL_SCIENCE("사회과학", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_sociology.png"),
-    HUMANITY("인문학", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_humanities.png");
+    SCIENCE_IT("과학·IT", ASSET_BASE + "group_science.png"),
+    LITERATURE("문학", ASSET_BASE + "group_literature.png"),
+    ART("예술", ASSET_BASE + "group_art.png"),
+    SOCIAL_SCIENCE("사회과학", ASSET_BASE + "group_sociology.png"),
+    HUMANITY("인문학", ASSET_BASE + "group_humanities.png");
  • 운영 관점 조언:

    • 가능하다면 CloudFront 등 CDN 커스텀 도메인(예: https://static.thip.app/)으로 추상화하면 버킷/리전 변경 시 코드 수정이 불필요합니다.
    • 환경별 도메인은 설정(yaml/properties)에서 주입받는 형태도 고려해 주세요.
  • 원격 리소스 유효성 간단 점검 스크립트:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
for p in group_science.png group_literature.png group_art.png group_sociology.png group_humanities.png; do
  url="https://thip-bucket.s3.ap-northeast-2.amazonaws.com/$p"
  echo "HEAD $url"
  curl -sI "$url" | awk 'NR==1{print}'
done

Length of output: 2329


S3 URL 중복 제거: 베이스 URL 상수화/설정화 적용 필요

curl을 이용해 현재 모든 이미지 URL이 HTTP 200 OK로 유효함을 확인했습니다.
하지만 버킷, 리전, 도메인 변경 시 코드 수정 없이 대응하려면 URL 베이스를 상수화하거나 설정화해야 합니다.

• 적용이 필요한 위치

  • src/main/java/konkuk/thip/room/domain/Category.java

• 제안 코드 예시

public enum Category {
    // … 기존 상수 정의 전 또는 enum 선언부 상단에 추가
    private static final String ASSET_BASE = "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/";

    SCIENCE_IT("과학·IT", ASSET_BASE + "group_science.png"),
    LITERATURE("문학",      ASSET_BASE + "group_literature.png"),
    ART("예술",           ASSET_BASE + "group_art.png"),
    SOCIAL_SCIENCE("사회과학", ASSET_BASE + "group_sociology.png"),
    HUMANITY("인문학",     ASSET_BASE + "group_humanities.png");

    private final String title;
    private final String imageUrl;

    Category(String title, String imageUrl) {
        this.title = title;
        this.imageUrl = imageUrl;
    }

    // getters…
}

• 운영 관점 추가 권장 사항

  • CloudFront 등 CDN 커스텀 도메인(예: https://static.thip.app/)으로 추상화
  • 환경별 베이스 URL을 application.yml/properties 등에서 주입
🤖 Prompt for AI Agents
In src/main/java/konkuk/thip/room/domain/Category.java around lines 19 to 23,
the S3 URL base is duplicated across enum constants; define a single ASSET_BASE
(private static final String) at the top of the enum and replace each full URL
with ASSET_BASE + "<filename>" for each constant, update the enum
constructor/fields unchanged, and optionally make ASSET_BASE configurable by
reading from application properties or injecting via a constant in a config
class so bucket/region/domain changes don't require code edits.

Comment on lines +75 to 79
.extracting("aliasName", "categoryName")
.containsExactlyInAnyOrder(
tuple("문학가", "문학", "문학_image", "문학_color"),
tuple("과학자", "과학·IT", "과학_image", "과학_color")
tuple("문학가", "문학"),
tuple("과학자", "과학·IT")
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

aliasColor 검증이 누락되었습니다 — 계약 보장을 위해 포함하세요

PR 목적(별칭 컬러 반환)에 맞춰 aliasColor 존재/정합을 테스트에 포함하는 것이 바람직합니다.

정확 값까지 보장하는 변경 예시(권장):

-        assertThat(choices)
-                .extracting("aliasName", "categoryName")
-                .containsExactlyInAnyOrder(
-                        tuple("문학가", "문학"),
-                        tuple("과학자", "과학·IT")
-                );
+        assertThat(choices)
+                .extracting("aliasName", "aliasColor", "categoryName")
+                .containsExactlyInAnyOrder(
+                        tuple("문학가", "#A0F8E8", "문학"),
+                        tuple("과학자", "#C8A5FF", "과학·IT")
+                );

대안(값 고정이 과도하게 빡빡하다면): HEX 포맷과 존재성만 검증

// 추가 검증(대안)
assertThat(choices)
        .extracting("aliasColor", String.class)
        .allSatisfy(c -> assertThat(c).matches("^#[0-9A-Fa-f]{6}$"));

(선택) imageUrl도 원격 URL 형태 보장 체크를 넣으면 회귀 방지에 도움이 됩니다.

assertThat(choices)
        .extracting("imageUrl", String.class)
        .allSatisfy(u -> assertThat(u).startsWith("http"));
🤖 Prompt for AI Agents
In the file
src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java
around lines 75 to 79, the test is missing validation for the aliasColor field.
To ensure the contract is properly tested, add assertions to verify that the
aliasColor field is present and has a valid hexadecimal color format (e.g.
"#RRGGBB"). Additionally, consider adding a validation for the imageUrl field to
ensure it has a valid URL format.

@hd0rable hd0rable left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다!! 리뷰요구사항 확인했습니당 저희가 코드에 Enum으로 저장한 이상 그 값을 활용하는게 맞다고 생각합니당!
또한 버킷관련해서 리뷰남겼는데 확인해주심 감사하겠습니닷

ART("예술", "예술_image"),
SOCIAL_SCIENCE("사회과학", "사회과학_image"),
HUMANITY("인문학", "인문학_image");
SCIENCE_IT("과학·IT", "https://thip-bucket.s3.ap-northeast-2.amazonaws.com/group_science.png"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p2: 이거 혹시 환경변수로 저장하는건 어떨까요??.. 버킷을 퍼블릭 엑세스 허용을해둬야 저희 서버에서 버킷으로 저장/삭제 요청을 보낼수 있는 것으로 알고있습니다그래서 퍼블릭 엑세스 허용을 해둔거고, 퍼블릭 엑세스 허용을 하면 저희 버킷이름만알고 요청을 보내도 저희 버킷요금에 포함되는 걸로 알고있어서 버킷이름이 현재 노출되고잇기때문에 환경변수로 불러와야 할것 같습니다
또한 저희가 후에 pre-signed-url 방식으로 바꾸기로 했으니, 그때 s3저장/삭제 로직도 바뀌면서 버킷도 퍼블릭 엑세스를 차단하는것으로 바꾸면 될 것같습니다!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉 너무 별 생각없었네요 하하 런타임 시점에 환경변수로부터 base url 불러와서 전체 image url 제공하도록 코드 수정했습니다!!

- aws s3 properties 값이 유효하지 않을 경우에 500 error 발생시키는 코드 추가
- initializer에 의해 aws s3 base url provide func 을 주입받도록 수정

@seongjunnoh seongjunnoh left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금 방 생성 api 통합테스트에서 실패가 발생하는데, 제가 postman 으로 직접 알라딘 api 호출하니 알라딘 내부 시스템 점검으로 인해 저희 테스트 코드도 실패하는 상황인 것 같습니다
image

내일 다시 action 돌려보면 될 것 같습니다!!

추가로 희진님 리뷰 요청으로 yml 파일 또한 수정해서 secret 값 업데이트 했습니다! 노션에서도 확인해주세요 @hd0rable @buzz0331
(노션에 수정한 부분 관련해서 문서화도 추가해놨습니다!)

@hd0rable hd0rable left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻👍🏻👍🏻

@seongjunnoh seongjunnoh merged commit 10fe296 into develop Aug 12, 2025
3 of 4 checks passed
@seongjunnoh seongjunnoh deleted the refactor/#131-alias-color-value-add branch August 12, 2025 04:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[refactor] alias 반환 시 alias color 값 반환하도록 수정해야함

2 participants