Skip to content

dev to main#69

Merged
wlgusqkr merged 16 commits intomainfrom
dev
Jan 13, 2026
Merged

dev to main#69
wlgusqkr merged 16 commits intomainfrom
dev

Conversation

@wlgusqkr
Copy link
Contributor

Related issue πŸ› 

μ–΄λ–€ 변경사항이 μžˆμ—ˆλ‚˜μš”?

  • πŸ› BugFix Something isn't working
  • πŸ’» CrossBrowsing Browser compatibility
  • 🌏 Deploy Deploy
  • 🎨 Design Markup & styling
  • πŸ“ƒ Docs Documentation writing and editing (README.md, Swagger, etc.)
  • ✨ Feature Feature
  • πŸ”¨ Refactor Code refactoring
  • βš™οΈ Setting Development environment setup
  • βœ… Test Test related

Work Description ✏️

μž‘μ—… λ‚΄μš©μ„ μž‘μ„±ν•΄μ£Όμ„Έμš”.

  • μž‘μ—… λ‚΄μš©

Uncompleted Tasks πŸ˜…

  • Task1

To Reviewers πŸ“’

리뷰어가 μ•Œλ©΄ 쒋은 λ‚΄μš©μ„ μž‘μ„±ν•΄μ£Όμ„Έμš”.

@gemini-code-assist
Copy link

Summary of Changes

Hello @wlgusqkr, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ κ΄€λ¦¬μ˜ 견고성을 높이고, μ•Œλ¦Ό 및 ꡬ독 κ΄€λ ¨ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ¦¬νŒ©ν† λ§ν•˜μ—¬ μ‹œμŠ€ν…œμ˜ μœ μ—°μ„±κ³Ό ν™•μž₯성을 κ°œμ„ ν•˜λŠ” 데 쀑점을 λ‘‘λ‹ˆλ‹€. 특히, μ•Œλ¦Όμ˜ 'κΈ΄κΈ‰ μ—¬λΆ€' κ°œλ…μ„ 'ν‚€μ›Œλ“œ 일치 μ—¬λΆ€'와 'μ•Œλ¦Ό ν™œμ„±ν™” μ—¬λΆ€'둜 μ„ΈλΆ„ν™”ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 더 μ •ν™•ν•˜κ³  λ§žμΆ€ν™”λœ μ•Œλ¦Ό κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆλ„λ‘ κΈ°λ°˜μ„ λ§ˆλ ¨ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 컨트둀러의 μ±…μž„ 뢄리와 ꡬ독 μ—…λ°μ΄νŠΈ κΈ°λŠ₯ λ„μž…μ„ 톡해 μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€.

Highlights

  • λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ λ„μž…: Flywayλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ κ΄€λ¦¬ν•˜λ„λ‘ μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. 초기 μŠ€ν‚€λ§ˆ 생성 및 κΈ°μ‘΄ ν…Œμ΄λΈ”(summaries, subscriptions)의 컬럼 변경을 μœ„ν•œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μŠ€ν¬λ¦½νŠΈκ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • μ•Œλ¦Ό 및 ꡬ독 둜직 λ¦¬νŒ©ν† λ§: ꡬ독 μ—”ν‹°ν‹°μ—μ„œ 'κΈ΄κΈ‰ μ—¬λΆ€(isUrgent)' ν•„λ“œλ₯Ό μ œκ±°ν•˜κ³ , μš”μ•½ μ—”ν‹°ν‹°μ—μ„œ '읽음 μ—¬λΆ€(isRead)' ν•„λ“œλ₯Ό 'ν‚€μ›Œλ“œ 일치 μ—¬λΆ€(isKeywordMatched)'둜 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ•Œλ¦Όμ˜ μš°μ„ μˆœμœ„ 및 μƒνƒœ 관리λ₯Ό 보닀 λͺ…ν™•ν•˜κ²Œ ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.
  • 컨트둀러 μ—­ν•  뢄리 및 ꡬ독 μ—…λ°μ΄νŠΈ κΈ°λŠ₯ μΆ”κ°€: κΈ°μ‘΄ AlarmControllerλ₯Ό AlarmQueryController둜 λΆ„λ¦¬ν•˜μ—¬ 쑰회 λ‘œμ§μ„ λ‹΄λ‹Ήν•˜κ²Œ ν•˜κ³ , ꡬ독 정보λ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆλŠ” μƒˆλ‘œμš΄ API μ—”λ“œν¬μΈνŠΈμ™€ DTOλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 기쑴의 κ°œλ³„ μ•Œλ¦Ό 차단/ν•΄μ œ APIλŠ” ν†΅ν•©λœ μ—…λ°μ΄νŠΈ κΈ°λŠ₯으둜 λŒ€μ²΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • λ‚΄λΆ€ μ•Œλ¦Ό 생성 둜직 κ°œμ„ : 크둀러λ₯Ό μœ„ν•œ λ‚΄λΆ€ μ•Œλ¦Ό 생성 APIμ—μ„œ is_urgent λŒ€μ‹  keyword_matchedλ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½λ˜μ—ˆμœΌλ©°, ν‘Έμ‹œ μ•Œλ¦Ό 전솑 μ‹œ κ΅¬λ…μ˜ μ•Œλ¦Ό ν™œμ„±ν™” 여뢀와 ν‚€μ›Œλ“œ 일치 여뢀에 따라 μ•Œλ¦Ό 제λͺ© 접두사λ₯Ό λ™μ μœΌλ‘œ μ„€μ •ν•˜λ„λ‘ κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • μ˜μ‘΄μ„± 및 μ„€μ • μ—…λ°μ΄νŠΈ: TestContainer 및 Flyway μ˜μ‘΄μ„±μ΄ build.gradle에 μΆ”κ°€λ˜μ—ˆκ³ , JPA의 ddl-auto 섀정이 updateμ—μ„œ validate둜 λ³€κ²½λ˜μ–΄ μŠ€ν‚€λ§ˆ 변경이 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 슀크립트λ₯Ό 톡해 이루어지도둝 κ°•μ œν–ˆμŠ΅λ‹ˆλ‹€.
Ignored Files
  • Ignored by pattern: .github/workflows/** (1)
    • .github/workflows/ci.yml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with πŸ‘ and πŸ‘Ž on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩

@github-actions
Copy link

Test Results

1 tests   1 βœ…β€ƒβ€ƒ0s ⏱️
1 suites  0 πŸ’€
1 files    0 ❌

Results for commit 6ccedf8.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

이번 ν’€ λ¦¬ν€˜μŠ€νŠΈλŠ” isUrgent ν•„λ“œλ₯Ό μ œκ±°ν•˜κ³  isKeywordMatched ν•„λ“œλ₯Ό λ„μž…ν•˜λŠ” λ“± μ€‘μš”ν•œ λ¦¬νŒ©ν† λ§μ„ ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. Flywayλ₯Ό ν†΅ν•œ λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ μΆ”κ°€λ˜μ—ˆκ³ , μ•Œλ¦Ό 및 ν”Όλ“œ κ΄€λ ¨ μ»¨νŠΈλ‘€λŸ¬μ™€ μ„œλΉ„μŠ€ 둜직이 μž¬κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ „λ°˜μ μœΌλ‘œ μ½”λ“œλ² μ΄μŠ€λ₯Ό κ°œμ„ ν•˜λ €λŠ” λ…Έλ ₯이 μ—Ώλ³΄μ΄μ§€λ§Œ, λͺ‡ κ°€μ§€ μ€‘μš”ν•œ μˆ˜μ • 사항이 ν•„μš”ν•©λ‹ˆλ‹€. 특히 isKeywordMatched ν•„λ“œμ˜ μš©λ„μ™€ λ°μ΄ν„°λ² μ΄μŠ€ 초기 슀크립트의 였λ₯˜λŠ” μ‹œκΈ‰νžˆ ν•΄κ²°ν•΄μ•Ό ν•  λ¬Έμ œμž…λ‹ˆλ‹€. λ˜ν•œ, ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ 주석 μ²˜λ¦¬μ™€ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ˜μ‘΄μ„± μ£Όμž…λ„ κ°œμ„ μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

// 읽지 μ•Šμ€ Summary만 필터링
List<Summary> unreadSummaries = subscription.getSummaries().stream()
.filter(summary -> !summary.isRead())
.filter(summary -> !summary.isKeywordMatched())

Choose a reason for hiding this comment

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

critical

!summary.isKeywordMatched()λ₯Ό μ‚¬μš©ν•˜μ—¬ 읽지 μ•Šμ€ μš”μ•½μ„ ν•„ν„°λ§ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. isKeywordMatchedλŠ” ν‚€μ›Œλ“œ 일치 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•„λ“œλ‘œ, μš”μ•½μ˜ '읽음' μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ˜λŠ” 것은 μ μ ˆν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 둜직이 μ˜λ„λœ λ™μž‘μ΄λΌλ©΄ ν•„λ“œ 이름이 isRead λ˜λŠ” isUnread와 같이 λͺ…ν™•ν•˜κ²Œ λ³€κ²½λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ν˜„μž¬λ‘œμ„œλŠ” ν•„λ“œ 이름과 μ‚¬μš© λͺ©μ μ΄ μΌμΉ˜ν•˜μ§€ μ•Šμ•„ ν˜Όλž€μ„ μ•ΌκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ '읽음' μƒνƒœλ₯Ό 좔적해야 ν•œλ‹€λ©΄ λ³„λ„μ˜ isRead ν•„λ“œλ₯Ό μœ μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

}


//그리고 μ§€κΈˆ μ’…λ²„νŠΌμ— 펜 λ²„νŠΌμ„ λ§Œλ“€μ–΄μ„œ μˆ˜μ • νŽ˜μ΄μ§€λ‘œ λ„˜μ–΄κ°ˆ 수 있게 ν•΄μ€„λž˜ UIλŠ” CreateνŽ˜μ΄μ§€λž‘ κ°™μ§€λ§Œ url은 μž¬μ„€μ •ν•  수 μ—†κ³  λ³„μΉ­μ΄λž‘ keywordλž‘ μ•ŒλžŒ λ°›μ„μ§€λ§Œ μ„€μ •ν•  수 μžˆμ–΄ μ•„ 일단 이 전에 ν˜„μž¬ κΈ΄κΈ‰ μ•ŒλžŒμΈμ§€ No newline at end of file

Choose a reason for hiding this comment

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

critical

μ½”λ“œ 파일의 λ§ˆμ§€λ§‰μ— 주석이 μ•„λ‹Œ 일반 ν…μŠ€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 컴파일 였λ₯˜λ₯Ό μœ λ°œν•  수 μžˆμœΌλ―€λ‘œ μ œκ±°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Comment on lines +38 to +39
@Column(name = "is_keyword_matched", nullable = false)
private boolean isKeywordMatched;

Choose a reason for hiding this comment

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

critical

is_read 컬럼이 is_keyword_matched둜 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 ν•„λ“œ 이름은 μš”μ•½μ΄ ν‚€μ›Œλ“œμ— μ˜ν•΄ λ§€μΉ­λ˜μ—ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ markAsRead() λ©”μ„œλ“œμ—μ„œ 이 ν•„λ“œλ₯Ό true둜 μ„€μ •ν•˜λŠ” 것은 μš”μ•½μ΄ 'μ½ν˜”λ‹€'λŠ” 의미둜 μ‚¬μš©λ˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. ν•„λ“œ 이름과 μ‚¬μš© λͺ©μ μ΄ μΌμΉ˜ν•˜μ§€ μ•Šμ•„ ν˜Όλž€μ„ μ•ΌκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ '읽음' μƒνƒœλ₯Ό 좔적해야 ν•œλ‹€λ©΄ isRead ν•„λ“œλ₯Ό μœ μ§€ν•˜κ±°λ‚˜, isKeywordMatched의 의미λ₯Ό λͺ…ν™•νžˆ ν•˜κ³  markAsRead와 같은 λ©”μ„œλ“œ 이름을 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν˜„μž¬λ‘œμ„œλŠ” isKeywordMatchedκ°€ '읽음' μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ²ƒμœΌλ‘œ 였용될 κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€.

// Summaryλ₯Ό 읽음 처리
public void markAsRead() {
this.isRead = true;
this.isKeywordMatched = true;

Choose a reason for hiding this comment

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

critical

markAsRead() λ©”μ„œλ“œκ°€ isKeywordMatched ν•„λ“œλ₯Ό true둜 μ„€μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. isKeywordMatchedλŠ” μš”μ•½μ΄ ν‚€μ›Œλ“œμ— μ˜ν•΄ λ§€μΉ­λ˜μ—ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•„λ“œμ—¬μ•Ό ν•©λ‹ˆλ‹€. μš”μ•½μ΄ 'μ½ν˜”λ‹€'λŠ” μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ 이 ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 ν•„λ“œμ˜ 의미λ₯Ό μ™œκ³‘ν•˜κ³  ν˜Όλž€μ„ μ•ΌκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ '읽음' μƒνƒœλ₯Ό 좔적해야 ν•œλ‹€λ©΄ λ³„λ„μ˜ isRead ν•„λ“œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, markAsRead λ©”μ„œλ“œμ˜ 이름을 markAsKeywordMatched λ“±μœΌλ‘œ λ³€κ²½ν•˜μ—¬ ν•„λ“œμ˜ μ˜λ―Έμ™€ μΌμΉ˜μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€.

content varchar(255) not null,
created_at datetime(6) not null,
hash_tag varchar(255) not null,
is_read bit d not null,

Choose a reason for hiding this comment

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

critical

is_read bit d not null 뢀뢄에 dλΌλŠ” λΆˆν•„μš”ν•œ λ¬Έμžκ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” SQL ꡬ문 였λ₯˜λ₯Ό μœ λ°œν•  수 μžˆμœΌλ―€λ‘œ μ œκ±°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    is_read bit not null,

.fetchJoin().where(subscription.user.id.eq(userId), summary.isRead.eq(false))
.orderBy(subscription.isUrgent.desc(), summary.updatedAt.desc(), summary.id.desc())
return queryFactory.selectFrom(summary).innerJoin(summary.subscription, subscription).fetchJoin()
.where(subscription.user.id.eq(userId)).orderBy(summary.updatedAt.desc(), summary.id.desc())

Choose a reason for hiding this comment

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

high

이전 μ½”λ“œμ—μ„œλŠ” summary.isRead.eq(false) 쑰건을 μ‚¬μš©ν•˜μ—¬ 읽지 μ•Šμ€ μš”μ•½λ§Œ κ°€μ Έμ™”μ§€λ§Œ, ν˜„μž¬λŠ” 이 쑰건이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν”Όλ“œμ— 읽은 μš”μ•½λ„ 포함될 수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. λ§Œμ•½ ν”Όλ“œκ°€ '읽지 μ•Šμ€' μš”μ•½λ§Œ λ³΄μ—¬μ£ΌλŠ” 것이 μ˜λ„μ˜€λ‹€λ©΄, 이 변경은 κΈ°λŠ₯적 였λ₯˜λ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μ˜λ„λœ 변경인지 ν™•μΈν•˜κ³ , λ§Œμ•½ 읽지 μ•Šμ€ μš”μ•½λ§Œ λ³΄μ—¬μ€˜μ•Ό ν•œλ‹€λ©΄ ν•΄λ‹Ή 쑰건을 λ‹€μ‹œ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

.fetchJoin().where(subscription.user.id.eq(userId), summary.isRead.eq(false))
.orderBy(subscription.isUrgent.desc(), summary.updatedAt.desc(), summary.id.desc())
.fetch();
return queryFactory.selectFrom(summary).innerJoin(summary.subscription, subscription).fetchJoin()

Choose a reason for hiding this comment

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

high

이전 μ½”λ“œμ—μ„œλŠ” summary.isRead.eq(false) 쑰건을 μ‚¬μš©ν•˜μ—¬ 읽지 μ•Šμ€ μš”μ•½λ§Œ κ°€μ Έμ™”μ§€λ§Œ, ν˜„μž¬λŠ” 이 쑰건이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν™ˆ ν”Όλ“œμ— 읽은 μš”μ•½λ„ 포함될 수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. λ§Œμ•½ ν™ˆ ν”Όλ“œκ°€ '읽지 μ•Šμ€' μš”μ•½λ§Œ λ³΄μ—¬μ£ΌλŠ” 것이 μ˜λ„μ˜€λ‹€λ©΄, 이 변경은 κΈ°λŠ₯적 였λ₯˜λ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μ˜λ„λœ 변경인지 ν™•μΈν•˜κ³ , λ§Œμ•½ 읽지 μ•Šμ€ μš”μ•½λ§Œ λ³΄μ—¬μ€˜μ•Ό ν•œλ‹€λ©΄ ν•΄λ‹Ή 쑰건을 λ‹€μ‹œ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Comment on lines +24 to 74
// @Test
// void μ‹ κ·œ_ꡬ독을_λ“±λ‘ν•œλ‹€() throws Exception {
// // given
// SubscriptionCreateRequestDto request = new SubscriptionCreateRequestDto(
// 1L,
// List.of(1L, 2L),
// "λ„“μ€λ§ˆμ„",
// true
// );
//
// given(subscriptionCommandService.createSubscription(anyString(), anyString(), any(SubscriptionCreateRequestDto.class)))
// .willReturn(SubscriptionCreationResponseDto.builder()
// .subscriptionId(1L)
// .build()
// );
//
// // when then
// mockMvc.perform(
// post("/api/subscriptions")
// .content(objectMapper.writeValueAsString(request))
// .header("X-User-ID", "test-user-uuid")
// .header("X-Device-Secret", "test-device-secret")
// .contentType(MediaType.APPLICATION_JSON)
// )
// .andDo(print())
// .andExpect(status().isOk())
// .andDo(restDocsHandler.document(
// requestFields(
// fieldWithPath("urlId").type(JsonFieldType.NUMBER)
// .description("ꡬ독할 URL의 ID"),
// fieldWithPath("keywordIds").type(JsonFieldType.ARRAY)
// .optional()
// .description("ꡬ독에 μ—°κ΄€λœ ν‚€μ›Œλ“œ ID 리슀트"),
// fieldWithPath("alias").type(JsonFieldType.STRING)
// .description("ꡬ독 별칭"),
// fieldWithPath("isUrgent").type(JsonFieldType.BOOLEAN)
// .description("κΈ΄κΈ‰ μ•Œλ¦Ό μ—¬λΆ€")
// ),
// responseFields(
// fieldWithPath("errorCode").type(JsonFieldType.NULL)
// .description("μ—λŸ¬ μ½”λ“œ, 성곡 μ‹œ null"),
// fieldWithPath("message").type(JsonFieldType.STRING)
// .description("응닡 λ©”μ‹œμ§€"),
// fieldWithPath("result").type(JsonFieldType.OBJECT)
// .description("응닡 데이터"),
// fieldWithPath("result.subscriptionId").type(JsonFieldType.NUMBER)
// .description("μƒμ„±λœ κ΅¬λ…μ˜ ID")
// )
// ));
// }
}

Choose a reason for hiding this comment

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

high

μ‹ κ·œ_ꡬ독을_λ“±λ‘ν•œλ‹€() ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ 주석 μ²˜λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 핡심 κΈ°λŠ₯에 λŒ€ν•œ ν…ŒμŠ€νŠΈκ°€ λΉ„ν™œμ„±ν™”λ˜λ©΄ μ½”λ“œ λ³€κ²½ μ‹œ νšŒκ·€λ₯Ό κ°μ§€ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 이 ν…ŒμŠ€νŠΈλ₯Ό λ‹€μ‹œ ν™œμ„±ν™”ν•˜κ³ , λ³€κ²½λœ λ‘œμ§μ— 맞좰 μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ 컀버리지λ₯Ό μœ μ§€ν•˜λŠ” 것은 μ½”λ“œ ν’ˆμ§ˆμ— 맀우 μ€‘μš”ν•©λ‹ˆλ‹€.

public class AlarmQueryController implements AlarmApi {

private final AlarmQueryService alarmQueryService;
private final SummaryCommandService summaryCommandService;

Choose a reason for hiding this comment

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

medium

SummaryCommandServiceκ°€ μ£Όμž…λ˜μ—ˆμ§€λ§Œ 이 클래슀 λ‚΄μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ˜μ‘΄μ„±μ€ μ œκ±°ν•˜μ—¬ μ½”λ“œμ˜ λͺ…확성을 높이고 λΆˆν•„μš”ν•œ μžμ› 할당을 λ°©μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

Suggested change
private final SummaryCommandService summaryCommandService;
private final AlarmQueryService alarmQueryService;

alias varchar(255) not null,
created_at datetime(6) not null,
is_alarm_enabled bit not null,
is_urgent bit not null,

Choose a reason for hiding this comment

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

medium

subscriptions ν…Œμ΄λΈ”μ— is_urgent 컬럼이 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ V2__update_schema.sqlμ—μ„œ 이 μ»¬λŸΌμ„ μ‚­μ œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 초기 μŠ€ν‚€λ§ˆ(V1)λŠ” μ΅œμ’…μ μœΌλ‘œ μ‚¬μš©λ  μŠ€ν‚€λ§ˆλ₯Ό λ°˜μ˜ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ§Œμ•½ is_urgentκ°€ 더 이상 ν•„μš” μ—†λŠ” ν•„λ“œλΌλ©΄ V1 μŠ€ν¬λ¦½νŠΈμ—μ„œλΆ€ν„° μ œκ±°ν•˜κ±°λ‚˜, V1 μŠ€ν¬λ¦½νŠΈκ°€ 이미 배포된 μƒνƒœλΌλ©΄ V2μ—μ„œ μ‚­μ œν•˜λŠ” 것이 λ§žμŠ΅λ‹ˆλ‹€. ν˜„μž¬ μƒν™©μ—μ„œλŠ” V1 μŠ€ν¬λ¦½νŠΈκ°€ μ΅œμ‹  μ—”ν‹°ν‹° λͺ¨λΈμ„ λ°˜μ˜ν•˜μ§€ λͺ»ν•˜κ³  μžˆλŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

@wlgusqkr wlgusqkr merged commit 735fd80 into main Jan 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants