Skip to content

feat: 홈 화면 '오늘의 발견'#898

Merged
devfeijoa merged 16 commits into
developfrom
feat/886
Jun 11, 2026
Merged

feat: 홈 화면 '오늘의 발견'#898
devfeijoa merged 16 commits into
developfrom
feat/886

Conversation

@devfeijoa

@devfeijoa devfeijoa commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

📌𝘐𝘴𝘴𝘶𝘦𝘴

📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯

  • 오늘의 발견 카드 UI 개편

    • 썸네일 이미지 blur 배경, 장르 깃발, 키워드 칩 추가
    • 소설 제목/작가/연재 여부 추가
  • /novels/popular api 응답 변경 반영

    • author, genreName, keywords, novelDescription, isNovelCompleted 매핑
    • feedContent 기준 한마디/작품소개 표시 정책을 이전에는 avatar & nickname null 여부로 feedContent 에서 한마디 / 작품 소개로 내려오던것을 avatart & nickname & feedContent 가 null 이면 novelDescription에서 작품소개가 내려오게끔 정책 정리
  • 관련 ViewHolder/Text helper/drawable 네이밍 정리

  • 카드 ui width 크기를 강제로 이전 크기로 계산하는 로직이 있어 카드 ui가 변경됨에 따라 제거하였습니다.

📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵

Screenshot_20260609_034758

💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 인기 소설 카드에 저자, 장르, 완결 여부, 키워드 정보 추가
    • 카드 상단에 흐릿한 배경 효과 적용
    • 최대 2개의 키워드 표시 기능 추가
  • 개선 사항

    • 소설 제목 줄 바꿈 및 말줄임 처리 개선
    • 인기 소설 카드 레이아웃 재구성
    • 저자 상태(연재/완결) 표시 추가

devfeijoa added 8 commits June 8, 2026 17:19
- `PopularNovelsEntity`에 작가, 장르, 완료 여부, 키워드, 작품 설명 등 신규 필드 추가
- 유저 피드 존재 여부를 확인하는 `hasUserFeed` 속성 추가
- `PopularNovelsResponseDto` 및 `NovelMapper`에 추가된 데이터 필드 반영 및 null 허용 처리
- `PopularNovelsViewHolder`에서 유저 피드 유무에 따라 아바타 및 텍스트 레이아웃의 가시성(Visibility)을 조절하도록 수정
- 피드 내용이 없을 경우 작품 설명(`novelDescription`)을 우선적으로 표시하도록 바인딩 로직 고도화
- `PopularNovelsAdapter`에서 코드 내에 직접 정의되어 있던 아이템 너비 계산 및 설정 로직 제거
- `onBindViewHolder`를 단일 식 함수 형태로 간소화
- `bg_popular_novel_gradient_radius_14dp.xml`의 배경색을 그라데이션에서 흰색 단색(@color/white)으로 변경
- `toPopularNovelTitle`: 제목의 최대 노출 길이를 제한하고 단어 단위로 줄바꿈을 처리하는 로직 추가
- `toAuthorStatus`: 작가명(최대 6자)과 작품 연재 상태(완결/연재)를 결합한 문자열 생성 로직 추가
- `wrapByWord`: `TextPaint`를 사용해 TextView 너비를 초과하는 텍스트에 단어 단위 줄바꿈 적용
- `textAreaWidth`: 패딩을 제외한 TextView의 실제 텍스트 영역 너비를 계산하는 프로퍼티 추가
- `PopularNovelsViewHolder`에서 작품 제목(`tvPopularNovelTitle`) 및 작가 상태(`tvPopularNovelAuthorStatus`) 데이터 바인딩 로직 추가
- 작품 제목 생략 처리를 위한 말줄임표(`...`) 추가
- 작가 및 연재 상태 표시를 위한 포맷(`%1$s · %2$s`) 추가
- 연재 및 완결 상태를 나타내는 문자열(`연재작`, `완결작`) 추가
- 아이템 전체 크기를 고정 수치(292dp x 362dp)로 변경
- 작품 이미지를 활용한 블러 배경(`iv_popular_novel_blur_background`) 및 투명도 적용
- 작품 제목, 작가 정보, 커버 이미지의 레이아웃 배치 및 크기 수정
- 작품 제목 텍스트에 말줄임표(`ellipsize`) 및 최대 줄 수(`maxLines`) 제한 추가
- 상단 'BEST' 아이콘 제거 및 하단 정보 영역(`cl_popular_novel_in_short`) 위치 조정
- `PopularNovelsViewHolder`에서 작품 장르(genreName)에 따른 SVG 아이콘 로드 로직 추가 (Coil 사용)
- 장르별 이미지 경로 매핑을 위한 `toPopularNovelGenreImagePath` 확장 함수 추가
- `item_popular_novel.xml` 레이아웃에 장르 아이콘 및 프레임 표시를 위한 `ImageView` 추가
- `iv_popular_novel_blur_background` 속성 순서 변경 및 코드 정리
@devfeijoa devfeijoa requested review from Sadturtleman, m6z1 and s9hn June 8, 2026 18:07
@devfeijoa devfeijoa self-assigned this Jun 8, 2026
@devfeijoa devfeijoa added 🍯 [FEAT] 새로운 기능을 개발합니다. [👸 공주 은영] labels Jun 8, 2026
devfeijoa added 3 commits June 9, 2026 03:40
- `item_popular_novel.xml` 내 키워드 표시를 위한 `LinearLayout` 및 `TextView` 레이아웃 추가
- `PopularNovelsViewHolder`에 키워드 바인딩을 위한 `bindPopularNovelKeywords` 확장 함수 및 로직 구현
- 최대 2개의 키워드를 표시하도록 제한하는 상수 추가 및 예외 처리 로직 적용
- `PopularNovelsViewHolder`에서 하드코딩된 더미 키워드 바인딩 로직 삭제
- `bg_popular_novel_gradient_radius_14dp`의 배경색을 흰색에서 투명도가 적용된 흰색(#B2FFFFFF)으로 변경
@coderabbitai

coderabbitai Bot commented Jun 8, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

이 PR은 홈 화면 인기소설 카드 UI를 개선하는 작업입니다. 데이터 모델에 작가, 장르, 완결 여부, 키워드, 설명 필드를 추가하고, 텍스트 포맷팅 유틸로 제목과 작가 정보를 처리한 뒤, 뷰홀더에서 이를 조건부로 바인딩하며, 마지막으로 레이아웃과 스타일을 업데이트합니다.

Changes

인기소설 카드 UI 개선

Layer / File(s) Summary
데이터 계약 및 매핑
app/src/main/java/com/into/websoso/data/model/PopularNovelsEntity.kt, app/src/main/java/com/into/websoso/data/remote/response/PopularNovelsResponseDto.kt, app/src/main/java/com/into/websoso/data/mapper/NovelMapper.kt
PopularNovelEntityPopularNovelResponseDtoauthor, genreName, isNovelCompleted, keywords, novelDescription 필드를 추가하고 feedContent를 nullable로 변경합니다. hasUserFeed 계산 프로퍼티를 도입해 사용자 피드 존재 여부를 판단하며, 매퍼에서 새 필드들을 매핑합니다.
텍스트 포맷팅 확장 함수
app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt, app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelGenreExtensions.kt, core/resource/src/main/res/values/strings.xml
toPopularNovelTitle() 확장 함수로 제목을 고정 길이로 말줄임 처리한 후 단어 경계 기반 줄바꿈을 적용합니다. toAuthorStatus()로 작가명을 제한하고 완결 여부에 따른 상태 라벨을 결합하며, toPopularNovelGenreImagePath()로 장르 문자열을 이미지 경로로 매핑합니다. 필요한 문자열 리소스를 추가하고 textAreaWidth, takeWithEllipsis, wrapByWord 유틸을 정의합니다.
ViewHolder 바인딩 및 이미지 로딩
app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelsViewHolder.kt
hasUserFeed 조건으로 아바타 및 피드 설명 표시를 분기합니다. 장르 SVG 이미지를 Coil으로 로드하되 SvgDecoder.Factory()를 사용하고 실패 시 로딩 썸네일로 대체합니다. 키워드를 최대 2개까지 표시하고 컨테이너 가시성을 제어하며, 바인딩 작업을 전담 메서드로 분리합니다.
Adapter 단순화, 레이아웃 및 드로어블 업데이트
app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelsAdapter.kt, app/src/main/res/layout/item_popular_novel.xml, app/src/main/res/drawable/bg_popular_novel_translucent_radius_14dp.xml
onBindViewHolder를 식 바디로 단순화하고 레이아웃 너비 조정 로직을 제거합니다. 카드 상단을 블러 배경과 상세 요약 영역으로 재구성하고, 피드 설명 텍스트에 3줄 고정 표시 제약을 적용합니다. 드로어블 배경을 단색 반투명 흰색으로 변경합니다.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • s9hn
  • m6z1
  • Sadturtleman

Poem

🐰 인기 소설들이 더 예쁘게 핀다,
제목 단어는 줄 맞춰 춤을 추고,
작가 이름 옆엔 완결 배지가 반짝,
키워드 두 개, 장르 아이콘까지,
데이터에서 UI까지 우아한 변신! ✨

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive PR 설명이 기본 템플릿 구조를 따르고 있으나, Work Description 섹션이 불완전하고 To Reviewers 섹션이 비어있습니다. Work Description을 더 구체적으로 작성하고, To Reviewers 섹션에 검토자를 위한 주요 사항을 추가하여 검토 효율성을 높이세요.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 변경 사항의 핵심 목표인 홈 화면의 '오늘의 발견' UI 업데이트를 명확하게 요약합니다.
Linked Issues check ✅ Passed PR의 모든 변경 사항이 #886 이슈의 '오늘의 발견' UI 업데이트 요구사항을 충족합니다: 매퍼/엔티티 구조 확장, UI 레이아웃 개선, 텍스트 처리 로직 추가, 장르/키워드 표시 기능 구현 등.
Out of Scope Changes check ✅ Passed 모든 변경 사항이 '오늘의 발견' 섹션의 UI/기능 구현과 직접 관련되어 있으며, 범위를 벗어난 변경이 없습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/886

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

Comment @coderabbitai help to get the list of available commands and usage tips.

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelsViewHolder.kt`:
- Around line 22-58: The issue: bindPopularNovelKeywords(popularNovel) is
defined but never invoked, so keyword UI stays empty; fix by calling
bindPopularNovelKeywords(popularNovel) from inside the bind(popularNovel:
PopularNovelEntity) method (after binding.popularNovel is set or before
executePendingBindings()) so the keyword view logic runs and the "max 2
keywords" display is applied; reference the bind() method and the
bindPopularNovelKeywords() helper to locate where to insert the call.

In `@app/src/main/res/drawable/bg_popular_novel_gradient_radius_14dp.xml`:
- Around line 1-5: The drawable filename
bg_popular_novel_gradient_radius_14dp.xml is misleading because the XML uses a
solid color (<solid android:color="`#B2FFFFFF`" />) not a gradient; rename the
resource to match its content (e.g.
bg_popular_novel_solid_white_transparent_radius_14dp) and update the single
reference in item_popular_novel.xml (the android:background attribute at its use
site) to the new resource name; ensure the XML root/contents (shape, solid,
corners) remain unchanged and keep the 14dp radius in the renamed file.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8bb1b765-addb-4923-abab-44704412845b

📥 Commits

Reviewing files that changed from the base of the PR and between b2635e6 and 15de4a1.

📒 Files selected for processing (9)
  • app/src/main/java/com/into/websoso/data/mapper/NovelMapper.kt
  • app/src/main/java/com/into/websoso/data/model/PopularNovelsEntity.kt
  • app/src/main/java/com/into/websoso/data/remote/response/PopularNovelsResponseDto.kt
  • app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt
  • app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelsAdapter.kt
  • app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelsViewHolder.kt
  • app/src/main/res/drawable/bg_popular_novel_gradient_radius_14dp.xml
  • app/src/main/res/layout/item_popular_novel.xml
  • core/resource/src/main/res/values/strings.xml

devfeijoa added 5 commits June 9, 2026 14:36
- `toPopularNovelGenreImagePath` 확장 함수를 별도 파일(`PopularNovelGenreExtensions.kt`)로 분리하여 모듈화
- `PopularNovelsViewHolder`에서 키워드 바인딩(`bindPopularNovelKeywords`) 로직 호출 추가 및 관련 확장 함수 정리
- `bind` 메서드의 로직을 `bindTopInformation`, `bindGenreFlag`, `bindPopularNovelKeywords`, `bindFeedHeader` 등 역할별로 분리하여 모듈화
- `PopularNovelEntity`에 대한 확장 함수(`toAvatarImageUrl`, `toFeedDescription`)를 추가하여 데이터 변환 로직 정돈
- 키워드 표시 로직 및 뷰 바인딩 순서 최적화
- `POPULAR_NOVEL_KEYWORD_MAX_COUNT` 상수를 `companion object` 내부로 이동하여 캡슐화 강화
- `item_popular_novel.xml` 내 피드 내용(`feedContent`) 데이터 바인딩 제거
- `PopularNovelTextExtensions.kt`에 `takeWithEllipsis` 확장 함수를 추가하여 말줄임표 처리 로직 고도화 및 코드 가독성 개선
- `item_popular_novel.xml`에서 사용되는 배경 드로어블 파일명 수정 (`bg_popular_novel_fcf8f6_bottom_radius_14dp` -> `bg_popular_novel_bottom_radius_14dp`)
- 리소스명에서 특정 색상 코드(`fcf8f6`)를 제거하여 명칭 최적화 및 레이아웃 반영
- `bg_popular_novel_gradient_radius_14dp` 리소스 이름을 `bg_popular_novel_translucent_radius_14dp`로 변경
- `item_popular_novel.xml` 레이아웃에 변경된 배경 리소스 적용

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt (1)

40-44: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

textAreaWidth가 음수/0이 될 수 있어 제목 줄바꿈이 오동작할 수 있습니다.

Line 42에서 layoutParams.width를 그대로 쓰면 -1/-2/0이 들어와 wrapByWordmaxWidth가 비정상값이 될 수 있습니다. 그 경우 실제 폭과 무관하게 줄바꿈이 발생할 수 있습니다.

수정 예시
 private val TextView.textAreaWidth: Float
     get() {
-        val measuredWidth = width.takeIf { it > 0 } ?: layoutParams.width
-        return (measuredWidth - paddingStart - paddingEnd).toFloat()
+        val measuredWidth = width.takeIf { it > 0 } ?: measuredWidth
+        val contentWidth = measuredWidth - paddingStart - paddingEnd
+        return contentWidth.coerceAtLeast(0).toFloat()
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt`
around lines 40 - 44, The current TextView.textAreaWidth getter can return
negative or zero when layoutParams.width is MATCH_PARENT/MATCH_PARENT constants
(-1,-2) or unspecified; change the logic in the textAreaWidth property to prefer
actual measured width values and fall back safely, then clamp to a non-negative
value. Specifically, in the TextView.textAreaWidth getter (the property), use
width.takeIf { it > 0 } ?: measuredWidth.takeIf { it > 0 } ?:
(layoutParams?.width?.takeIf { it > 0 } ?: (rootView?.width ?: 0)) and finally
compute ((resolvedWidth - paddingStart - paddingEnd).coerceAtLeast(0)).toFloat()
so wrapByWord receives a valid non-negative maxWidth.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In
`@app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt`:
- Around line 40-44: The current TextView.textAreaWidth getter can return
negative or zero when layoutParams.width is MATCH_PARENT/MATCH_PARENT constants
(-1,-2) or unspecified; change the logic in the textAreaWidth property to prefer
actual measured width values and fall back safely, then clamp to a non-negative
value. Specifically, in the TextView.textAreaWidth getter (the property), use
width.takeIf { it > 0 } ?: measuredWidth.takeIf { it > 0 } ?:
(layoutParams?.width?.takeIf { it > 0 } ?: (rootView?.width ?: 0)) and finally
compute ((resolvedWidth - paddingStart - paddingEnd).coerceAtLeast(0)).toFloat()
so wrapByWord receives a valid non-negative maxWidth.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3c6b49d1-2c0b-42e6-9b61-fce12dd3787b

📥 Commits

Reviewing files that changed from the base of the PR and between c69384c and 6399604.

📒 Files selected for processing (5)
  • app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt
  • app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelsViewHolder.kt
  • app/src/main/res/drawable/bg_popular_novel_bottom_radius_14dp.xml
  • app/src/main/res/drawable/bg_popular_novel_translucent_radius_14dp.xml
  • app/src/main/res/layout/item_popular_novel.xml
💤 Files with no reviewable changes (1)
  • app/src/main/res/drawable/bg_popular_novel_translucent_radius_14dp.xml
🚧 Files skipped from review as they are similar to previous changes (2)
  • app/src/main/res/layout/item_popular_novel.xml
  • app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelsViewHolder.kt

@m6z1 m6z1 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.

코멘트 확인부탁드려요! 고생하셨습니다

Comment on lines -14 to +24
val avatarImage: String?,
val avatarImage: String? = null,
@SerialName("feedContent")
val feedContent: String,
val feedContent: String? = null,
@SerialName("genreName")
val genreName: String = "",
@SerialName("isNovelCompleted")
val isNovelCompleted: Boolean = false,
@SerialName("keywords")
val keywords: List<String> = emptyList(),

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.

a: DTO 들에 기본값을 넣어주신 이유가있을까요?

@devfeijoa devfeijoa Jun 10, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@m6z1 API 필드값 개편 중에 일부 필드가 누락되면 홈 화면 전체가 역직렬화 실패로 홈 화면 전체가 나오지 않는 상황이 종종 있어 기본값을 넣었습니다.

genreName은 없으면 장르 깃발을 숨기고, keywords는 빈 리스트면 키워드 칩을 숨길 수 있어서 fallback이 가능하다고 봤습니다. isNovelCompleted도 홈 전체가 깨지는 것을 막기 위한 방어값으로 넣었습니다.

별개로, 사용자 피드가 없는 인기 작품에서는 avatarImage, nickname, feedContentnull로 내려올 수 있어 nullable로 받도록 했고, UI에서는 이 값들이 모두 유효할 때만 한마디로 판단합니다. 그렇지 않으면 null님의 한마디가 아니라 작품 소개로 표시되도록 정리했습니다.

다만 isNovelCompleted값이 누락될 일이 없어보이고 누락 된다면 연재작으로 보이는 게 정책적으로 맞는지는 조금 애매한듯 하여 이 값은 기본값 없이 받아도 될 듯 합니다!

Comment on lines +3 to +15
internal fun String.toPopularNovelGenreImagePath(): String =
when (this) {
"romance" -> "/icGenre/romance"
"romanceFantasy" -> "/icGenre/romance-fantasy"
"BL" -> "/icGenre/bl"
"fantasy" -> "/icGenre/fantasy"
"modernFantasy" -> "/icGenre/modern-fantasy"
"wuxia" -> "/icGenre/wuxia"
"lightNovel" -> "/icGenre/light-novel"
"drama" -> "/icGenre/drama"
"mystery" -> "/icGenre/mystery"
else -> ""
}

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.

c: 이건 고민이 좀 필요할 것 같은데 추후에 resource 모듈로 옮기면 좋을 것 같아요

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@m6z1 좋습니다 👍🏻 현재는 "오늘의 발견"에서만 사용해서 home adapter 하위에 두었는데 공통으로 쓸 수 있는 로직에 가까워 추후 resource 모듈로 옮기면 좋을 것 같네요 !

@Sadturtleman Sadturtleman left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

수고하셨습니다!

@devfeijoa devfeijoa merged commit 7f14341 into develop Jun 11, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[👸 공주 은영] 🍯 [FEAT] 새로운 기능을 개발합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 홈 화면 '오늘의 발견'

3 participants