Skip to content

Dev 브랜치 코드 Main 병합#32

Merged
HeWillGoTillTheEnd merged 9 commits intomainfrom
Dev
Apr 23, 2025
Merged

Dev 브랜치 코드 Main 병합#32
HeWillGoTillTheEnd merged 9 commits intomainfrom
Dev

Conversation

@HeWillGoTillTheEnd
Copy link
Copy Markdown
Contributor

@HeWillGoTillTheEnd HeWillGoTillTheEnd commented Apr 23, 2025

Summary by CodeRabbit

  • 신규 기능

    • 프로젝트 댓글 및 답글 작성 시 알림이 전송됩니다.
    • 프로젝트 지원자, 지원 결과 등 다양한 상황에 맞는 세분화된 알림 유형이 추가되었습니다.
  • 버그 수정

    • 알림 관련 오타 및 잘못된 명칭(Alram → Alarm) 문제가 수정되었습니다.
  • 리팩터링

    • 알림 시스템이 엔티티별로 세분화되어 관리가 용이해졌으며, 알림 처리 로직이 개선되었습니다.
  • 기타

    • 알림 필터 상수 및 DTO 클래스가 추가되어 알림 데이터 구조가 명확해졌습니다.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 23, 2025

## Walkthrough

이번 변경 사항은 알림(Alarm) 시스템의 엔티티 구조를 리팩토링하고, 알림 처리 로직을 세분화된 엔티티 및 DTO로 분리하는 데 중점을 두었습니다. 기존의 오타가 있던 AlramEntity 및 AlramFilter는 AlarmEntity와 AlarmFilter로 명확하게 교체되었으며, 알림 유형별로 ApplicantAlarmEntity, ProjectAlarmEntity, CommentAlarmEntity 등 하위 엔티티가 도입되었습니다. 서비스 레이어에서는 알림 전송 메서드가 각 알림 유형에 맞게 분리·추가되었고, DTO 계층에도 CommentAlarmDto가 신설되었습니다. 또한, 알림 저장소, 필터 상수, Enum, 서비스 전반에 걸쳐 일관된 네이밍 및 타입 개선이 이루어졌습니다.

## Changes

| 파일/경로 요약 | 변경 내용 요약 |
|---|---|
| .../service/ApplyService.java, .../service/ProjectService.java | AlramFilter → AlarmFilter로 import 및 사용명 변경. alarmService.sendAlarm 호출 시 불필요한 enum 파라미터 제거 및 파라미터 수정. |
| .../service/ProjectCommentService.java | AlarmService 의존성 주입 및 댓글/대댓글 작성 시 알림 전송 로직 추가. |
| .../dto/AlarmDto.java | AlramEntity → AlarmEntity로 타입 변경, CommentAlarmEntity 처리 분기 추가, 필드 접근 및 alarm filter 값 반환 방식 개선. |
| .../dto/CommentAlarmDto.java | 신규 클래스 추가. CommentAlarmEntity 기반의 DTO로 replier, reCommentUserId 필드 및 관련 생성자 구현. |
| .../entity/AlramEntity.java | AlramEntity 클래스 전체 삭제. |
| .../entity/alarm/AlarmEntity.java | AlarmEntity 추상 클래스 신설. JPA 상속 구조, 공통 필드, 추상 메서드(getAlarmFilterIntValue) 정의. |
| .../entity/alarm/ApplicantAlarmEntity.java, .../entity/alarm/ProjectAlarmEntity.java, .../entity/alarm/CommentAlarmEntity.java | 각각 지원자, 프로젝트, 댓글 알림을 위한 엔티티 신설. AlarmEntity 상속, 각 알림 유형에 맞는 필드와 생성자, 필터값 반환 메서드 구현. |
| .../entity/alarm/constants/AlarmFilterConstants.java | 알림 필터 관련 문자열 및 정수 상수 정의 클래스 신설. |
| .../repository/AlarmRepository.java | AlramEntity → AlarmEntity로 교체, 메서드명 및 쿼리에서 userId → receiverId로 변경, 삭제 쿼리에서 타입 기반 필터링 적용. |
| .../service/AlarmService.java | 알림 전송 메서드가 알림 유형별로 분리·추가. 엔티티별 알림 생성 및 SSE 전송 로직 개선. |
| .../service/UserAlarmService.java | AlarmEntity, AlarmFilter 기반으로 네이밍, 필터 비교, 쿼리 등 일관성 있게 수정. |
| .../enums/AlarmFilter.java | Enum명 및 관련 메서드, 생성자, 맵 등 AlramFilter → AlarmFilter로 일괄 수정. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant ProjectService
    participant AlarmService
    participant AlarmRepository

    User->>ProjectService: 프로젝트 지원/댓글/대댓글 작성
    ProjectService->>AlarmService: sendAlarm(알림 유형별 파라미터)
    AlarmService->>AlarmRepository: save(AlarmEntity 하위 클래스)
    AlarmService-->>User: SSE로 알림 전송
sequenceDiagram
    participant User
    participant ProjectCommentService
    participant AlarmService
    participant AlarmRepository

    User->>ProjectCommentService: 댓글/대댓글 작성
    ProjectCommentService->>AlarmService: sendAlarm(comment, project, user 또는 recomment, comment, project)
    AlarmService->>AlarmRepository: save(CommentAlarmEntity)
    AlarmService-->>User: SSE로 알림 전송
Loading

Poem

🐇
알림의 이름이 바뀌었네,
엔티티도 세분화되어 더 똑똑해졌지!
지원, 댓글, 프로젝트 소식
각각의 알림이 토끼 귀처럼 쫑긋!
이제는 실수 없이,
사용자에게 딱 맞는 소식만
토끼가 깡총깡총 전해줄 거야!
🛎️✨


<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

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

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 3f484e6618f190cae7678ef76c5b382e6bcea10c and 578057bdf6ea7f979838c8b54e2aff067b29614d.

</details>

<details>
<summary>📒 Files selected for processing (5)</summary>

* `src/main/java/hs/kr/backend/devpals/domain/user/dto/AlarmDto.java` (2 hunks)
* `src/main/java/hs/kr/backend/devpals/domain/user/dto/CommentAlarmDto.java` (1 hunks)
* `src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java` (1 hunks)
* `src/main/java/hs/kr/backend/devpals/domain/user/repository/AlarmRepository.java` (2 hunks)
* `src/main/java/hs/kr/backend/devpals/domain/user/service/UserAlarmService.java` (4 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (5)</summary>

* src/main/java/hs/kr/backend/devpals/domain/user/dto/CommentAlarmDto.java
* src/main/java/hs/kr/backend/devpals/domain/user/service/UserAlarmService.java
* src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java
* src/main/java/hs/kr/backend/devpals/domain/user/dto/AlarmDto.java
* src/main/java/hs/kr/backend/devpals/domain/user/repository/AlarmRepository.java

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=devpalsPlus/backend&utm_content=32):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `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 generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- 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 generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### 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](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in 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](https://docs.coderabbit.ai/guides/configure-coderabbit) 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](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 9

🔭 Outside diff range comments (1)
src/main/java/hs/kr/backend/devpals/global/common/enums/AlarmFilter.java (1)

30-37: ⚠️ Potential issue

@JsonValue 애너테이션이 두 곳에 중복 지정되어 있습니다.

@JsonValue는 직렬화 시 하나의 속성만을 대표 값으로 선택하도록 설계되었습니다.
동일 클래스(혹은 enum) 내에서 두 곳(30, 34라인)에 붙어 있으면 Jackson 매퍼가 어떤 값을 직렬화해야 하는지 결정하지 못해 InvalidDefinitionException 이 발생할 수 있습니다.

-    @JsonValue
-    public String getDisplayName() {
-        return displayName;
-    }
-    @JsonValue
-    public Integer getValue() {
-        return value;
-    }
+    @JsonValue
+    public Integer getValue() {
+        return value;
+    }
+
+    public String getDisplayName() {
+        return displayName;
+    }
🧹 Nitpick comments (7)
src/main/java/hs/kr/backend/devpals/domain/user/service/UserAlarmService.java (1)

70-70: 용어 일관성 확인 필요

코드 전체에서는 '알림'으로 용어를 사용하지만, 여기서는 '알람'으로 표현하고 있습니다. 용어를 일관되게 사용하는 것이 좋습니다.

-        ApiResponse<String> response = new ApiResponse<>(true, "알람 삭제 성공", null);
+        ApiResponse<String> response = new ApiResponse<>(true, "알림 삭제 성공", null);
src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ProjectAlarmEntity.java (1)

16-17: 주석 포맷 개선 필요

한글 주석과 빈 줄이 분리되어 있어 코드 가독성이 떨어집니다. 주석을 한 줄로 통합하거나 Javadoc 스타일로 변경하는 것이 좋습니다.

-//공고에 지원자가 지원할 시 공고생성자가 수신받는 알림
-
+// 공고에 지원자가 지원할 시 공고생성자가 수신받는 알림
src/main/java/hs/kr/backend/devpals/global/common/enums/AlarmFilter.java (1)

21-24: VALUE_MAP 초기화 시 중복 키 예외 처리 고려

현재 구현은 Collectors.toMap 기본 동작을 사용하므로, 추후 enum 값이 잘못 수정되어 동일한 value 가 두 개 생기면 런타임 시 IllegalStateException 이 발생합니다.
중복 키를 덮어쓰도록 하거나, 테스트 케이스로 사전에 잡아두는 방법을 고려해 주세요.

-            Arrays.stream(AlarmFilter.values())
-                    .collect(Collectors.toMap(AlarmFilter::getValue, f -> f));
+            Arrays.stream(AlarmFilter.values())
+                    .collect(Collectors.toMap(
+                        AlarmFilter::getValue,
+                        f -> f,
+                        (a, b) -> a   // 중복 시 기존 값 유지
+                    ));
src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/AlarmEntity.java (4)

3-8: 사용되지 않는 import 정리

ApplicantEntity, CommentEntity, ProjectEntity, AlarmFilter 는 본 클래스에서 사용되지 않습니다.
IDE 레벨에서 워닝이 뜨고, 빌드 규칙에 따라 실패할 수 있으므로 삭제해 주세요.


21-22: 테이블명 대소문자 및 예약어 충돌 위험

@Table(name = "Alarm") 처럼 대문자를 포함하거나 DB 예약어와 충돌할 가능성이 있는 이름은 일부 RDBMS(MySQL, PostgreSQL)에서 이스케이프가 필요합니다.
스네이크 케이스(alarm) 혹은 접두어를 붙여 충돌을 피하는 것이 안전합니다.


36-37: DB 독립적인 Boolean 기본값 지정 방식 권장

columnDefinition = "BOOLEAN DEFAULT FALSE" 는 DB마다 DDL 방언이 달라 호환성 문제가 발생할 수 있습니다.
Hibernate/JPA 어노테이션 @Column(nullable = false) + 필드 기본값(false)만으로도 의도는 충분히 표현됩니다.

-    @Column(nullable = false, columnDefinition = "BOOLEAN DEFAULT FALSE")
+    @Column(nullable = false)

47-48: 생성 시각 필드에 @CreationTimestamp 사용 고려

createdAt = LocalDateTime.now() 는 애플리케이션 서버 시간이 DB 시간과 불일치할 때 데이터 정합성이 깨질 수 있습니다.
Hibernate 의 @CreationTimestamp 를 사용하면 DB 레벨에서 일관된 시간이 기록됩니다.

-    @Column(updatable = false)
-    private LocalDateTime createdAt = LocalDateTime.now();
+    @CreationTimestamp
+    @Column(updatable = false)
+    private LocalDateTime createdAt;
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between f109999 and 3f484e6.

📒 Files selected for processing (15)
  • src/main/java/hs/kr/backend/devpals/domain/project/service/ApplyService.java (2 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/project/service/ProjectCommentService.java (4 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/project/service/ProjectService.java (3 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/dto/AlarmDto.java (2 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/dto/CommentAlarmDto.java (1 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/entity/AlramEntity.java (0 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/AlarmEntity.java (1 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ApplicantAlarmEntity.java (1 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/CommentAlarmEntity.java (1 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ProjectAlarmEntity.java (1 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java (1 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/repository/AlarmRepository.java (2 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/service/AlarmService.java (2 hunks)
  • src/main/java/hs/kr/backend/devpals/domain/user/service/UserAlarmService.java (4 hunks)
  • src/main/java/hs/kr/backend/devpals/global/common/enums/AlarmFilter.java (3 hunks)
💤 Files with no reviewable changes (1)
  • src/main/java/hs/kr/backend/devpals/domain/user/entity/AlramEntity.java
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ProjectAlarmEntity.java (4)
src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java (1)
  • AlarmFilterConstants (3-11)
src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/AlarmEntity.java (1)
  • Entity (14-56)
src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ApplicantAlarmEntity.java (1)
  • Entity (11-36)
src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/CommentAlarmEntity.java (1)
  • Entity (13-55)
🔇 Additional comments (26)
src/main/java/hs/kr/backend/devpals/domain/project/service/ApplyService.java (2)

14-14: 알림 필터 임포트 수정 완료

알람(Alram) → 알림(Alarm)으로 이름 수정이 올바르게 적용되었습니다.


55-55: 알림 서비스 호출 방식 개선

알림 서비스 호출 시 필터 파라미터를 제거하고 엔티티 중심으로 변경하여 코드가 더 간결해졌습니다. 이제 AlarmFilter.APPLICANT_CHECK 파라미터 없이 projectapplicant 객체만으로 알림을 전송할 수 있습니다.

src/main/java/hs/kr/backend/devpals/domain/project/service/ProjectCommentService.java (4)

13-13: 알림 서비스 임포트 추가

댓글 관련 알림 기능 구현을 위한 알림 서비스 임포트가 적절히 추가되었습니다.


32-32: 알림 서비스 의존성 주입

댓글 서비스에 알림 서비스 의존성을 추가하여 댓글 작성 시 알림 기능을 구현할 수 있게 되었습니다.


48-48: 댓글 작성 시 알림 발송 로직 추가

댓글이 저장된 후 알림 서비스를 호출하여 프로젝트 소유자에게 알림을 전송하는 기능이 구현되었습니다.


130-130: 대댓글 작성 시 알림 발송 로직 추가

대댓글 저장 후 댓글 작성자에게 알림을 전송하는 기능이 적절히 구현되었습니다.

src/main/java/hs/kr/backend/devpals/domain/project/service/ProjectService.java (3)

17-17: 알림 필터 임포트 수정 완료

알람(Alram) → 알림(Alarm)으로 이름 수정이 올바르게 적용되었습니다.


193-193: 프로젝트 종료 시 알림 전송 로직 개선

프로젝트 종료 시 알림 전송 메서드 호출 방식이 개선되었습니다. 필터 파라미터를 제거하고 엔티티 중심으로 변경하여 코드가 더 간결해졌습니다.


220-220: 일괄 프로젝트 종료 시 알림 전송 로직 개선

여러 프로젝트를 일괄 종료하는 로직에서도 알림 전송 메서드 호출 방식이 적절히 개선되었습니다.

src/main/java/hs/kr/backend/devpals/domain/user/service/UserAlarmService.java (2)

33-39: 변수명 수정이 잘 이루어졌습니다.

cachedAlrams에서 cachedAlarms로 변수명이 수정되어 일관성이 개선되었습니다. 또한 findByUserId에서 findByReceiverId로 메서드 호출이 변경되어 새로운 엔티티 구조와 잘 일치합니다.


42-49: 필터 검증 로직이 개선되었습니다.

AlarmFilter enum을 사용한 필터 검증 및 필터링 로직이 명확하게 개선되었습니다.

src/main/java/hs/kr/backend/devpals/domain/user/dto/CommentAlarmDto.java (1)

16-20: 생성자 구현이 잘 되었습니다.

부모 클래스의 생성자를 호출하고 필요한 필드를 적절히 설정하고 있습니다. 특히 안전한 getter 호출을 위해 도우미 메서드를 활용한 점이 좋습니다.

src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ApplicantAlarmEntity.java (3)

8-9: 필터 상수 임포트가 적절합니다.

정적 임포트를 통해 코드 가독성이 향상되었습니다.


11-15: 엔티티 정의가 명확합니다.

엔티티 클래스, 식별자 값, 테이블 이름 등이 명확하게 정의되어 있어 JPA 매핑이 올바르게 동작할 것입니다.


26-31: 생성자 구현이 잘 되었습니다.

적절한 인자를 받아 부모 클래스의 생성자를 호출하고, 필요한 필드를 설정하고 있습니다.

src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ProjectAlarmEntity.java (1)

26-31: 생성자 구현이 명확합니다.

적절한 인자를 받아 부모 클래스의 생성자를 호출하고, 필요한 필드를 설정하고 있습니다.

src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/CommentAlarmEntity.java (1)

1-55: 적절한 엔티티 설계와 구현이 이루어졌습니다.

알람 엔티티의 상속 구조와 연관 관계가 명확하게 정의되어 있고, 필요한 생성자와 메서드가 잘 구현되었습니다. 댓글(CommentEntity)과 대댓글(RecommentEntity)에 대한 알람을 구분하여 처리할 수 있는 구조가 잘 설계되었습니다.

src/main/java/hs/kr/backend/devpals/domain/user/repository/AlarmRepository.java (3)

3-3: 알람 엔티티 임포트 수정이 올바르게 되었습니다.

기존 AlramEntity에서 AlarmEntity로 올바르게 수정되었습니다.


15-17: 리포지토리 타입과 메소드 수정이 적절합니다.

JpaRepository<AlarmEntity, Long>로 타입 변경과 findByReceiverId 메소드명이 일관되게 수정되었습니다.


22-24: 엔티티 타입 기반 필터링이 잘 구현되었습니다.

TYPE()를 사용하여 ApplicantAlarmEntity 타입을 제외하는 쿼리가 적절하게 구현되었습니다.

src/main/java/hs/kr/backend/devpals/domain/user/service/AlarmService.java (6)

4-6: 알람 관련 임포트 수정이 잘 이루어졌습니다.

알람 엔티티 클래스들에 대한 임포트가 올바르게 추가되었습니다.

Also applies to: 8-12


78-89: 지원자 결과 알람 전송 메소드가 잘 수정되었습니다.

ApplicantAlarmEntity를 사용하여 지원자 결과 알람을 전송하는 로직이 깔끔하게 구현되었습니다.


91-96: 프로젝트 작성자 알람 전송 메소드가 잘 구현되었습니다.

ProjectAlarmEntity를 사용하여 프로젝트 작성자에게 지원자 알람을 전송하는 로직이 적절하게 구현되었습니다.


98-105: 대댓글 알람 전송 메소드가 잘 구현되었습니다.

대댓글 작성 시 원 댓글 작성자에게 알람을 전송하는 로직이 적절하게 구현되었습니다.


117-133: 메시지 생성 메소드들이 잘 구현되었습니다.

각각의 알람 유형에 맞는 메시지 생성 메소드가 적절하게 구현되었습니다.


136-147: 알람 전송 메소드가 잘 수정되었습니다.

새로운 AlarmEntity 클래스와 함께 작동하도록 sendToUser 메소드가 적절하게 수정되었습니다.

Comment on lines +65 to 68
AlarmEntity alarmEntity
= alarmRepository.findByUserIdAndAlarmId(userId, alarmId).orElseThrow(() -> new CustomException(ErrorException.ALARM_NOT_FOUND));
if(alramEntity.getAlramFilter().equals(AlramFilter.APPLIED_PROJECTS))
if(alarmEntity.getAlarmFilterIntValue().equals(AlarmFilter.APPLIED_PROJECTS.getValue()))
throw new CustomException(ErrorException.CAN_NOT_DELETE_ALARM);
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

필터 값 비교 로직 확인 필요

AlarmFilterConstants에 정의된 모든 필터 값(APPLIED_PROJECT_INT_VALUE, APPLICANT_CHECK_INT_VALUE, COMMENT_AND_REPLY_INT_VALUE)이 모두 1로 설정되어 있어 실제 필터 구분에 혼란이 생길 수 있습니다.


🏁 Script executed:

#!/bin/bash
# AlarmFilterConstants에 정의된 필터 값을 확인합니다.
grep -n "INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java

Length of output: 301


AlarmFilterConstants 값 중복으로 인한 필터 구분 불가

AlarmFilterConstants.java(7~9) 확인 결과:

  • APPLIED_PROJECT_INT_VALUE = 1
  • APPLICANT_CHECK_INT_VALUE = 1
  • COMMENT_AND_REPLY_INT_VALUE = 1

이로 인해 AlarmFilter.APPLIED_PROJECTS.getValue() 등 필터별 분기 로직이 정확히 작동하지 않습니다.
각 필터에 고유한 정수 값을 할당하거나, enum 타입 사용을 통해 필터 구분이 명확해지도록 수정이 필요합니다.

Comment on lines +33 to +35
public Integer getAlarmFilterIntValue() {
return APPLIED_PROJECT_INT_VALUE;
}
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

필터 값 중복 확인 필요

getAlarmFilterIntValue() 메서드가 반환하는 APPLIED_PROJECT_INT_VALUE 값이 다른 필터 값(APPLICANT_CHECK_INT_VALUE, COMMENT_AND_REPLY_INT_VALUE)과 모두 1로 동일합니다. 이로 인해 프론트엔드에서 필터링 시 구분이 어려울 수 있습니다.


🏁 Script executed:

#!/bin/bash
# 필터 상수 파일의 내용을 확인합니다.
cat src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java

Length of output: 597


다른 AlarmEntity 클래스들의 getAlarmFilterIntValue() 반환 상수를 확인합니다.


🏁 Script executed:

#!/bin/bash
# 각 AlarmEntity 클래스의 getAlarmFilterIntValue 반환 값을 조사합니다.
rg -n "getAlarmFilterIntValue" -A2 src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm

Length of output: 1404


AlarmFilterConstants의 필터 값에 고유한 정수 할당 필요

현재 모든 필터 상수(APPLIED_PROJECT_INT_VALUE, APPLICANT_CHECK_INT_VALUE, COMMENT_AND_REPLY_INT_VALUE)가 1로 중복되어 있어, 프론트엔드에서 필터링 시 구분이 불가능합니다.

조치 사항:

  • src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java
    • 각 상수에 서로 다른 정수 값 할당 (예: APPLIED_PROJECT_INT_VALUE = 1, APPLICANT_CHECK_INT_VALUE = 2, COMMENT_AND_REPLY_INT_VALUE = 3)

엔티티 클래스의 getAlarmFilterIntValue()는 상수를 그대로 반환하므로, 상수 값만 수정하면 됩니다.

Comment on lines +33 to +35
public Integer getAlarmFilterIntValue() {
return APPLICANT_CHECK_INT_VALUE;
}
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

필터 값 중복 확인 필요

getAlarmFilterIntValue() 메서드가 반환하는 APPLICANT_CHECK_INT_VALUE 값이 다른 필터 값(APPLIED_PROJECT_INT_VALUE, COMMENT_AND_REPLY_INT_VALUE)과 모두 1로 동일합니다. 이는 알림 유형 구분에 혼란을 줄 수 있습니다.

#!/bin/bash
# AlarmEntity의 자식 클래스들이 반환하는 필터 값을 확인합니다.
echo "ApplicantAlarmEntity returns:"
grep -n "return.*INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ApplicantAlarmEntity.java

echo -e "\nProjectAlarmEntity returns:"
grep -n "return.*INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ProjectAlarmEntity.java

echo -e "\nCommentAlarmEntity returns:"
grep -n "return.*INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/CommentAlarmEntity.java

echo -e "\nAlarmFilterConstants defines:"
grep -n "INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java

Comment thread src/main/java/hs/kr/backend/devpals/domain/user/dto/AlarmDto.java
Comment thread src/main/java/hs/kr/backend/devpals/domain/user/dto/AlarmDto.java
Comment thread src/main/java/hs/kr/backend/devpals/domain/user/repository/AlarmRepository.java Outdated
Comment on lines +108 to +115
//댓글 작성시 프로젝트 작성자에게 알림 전송
public void sendAlarm(CommentEntity comment, ProjectEntity project, UserEntity commenter) {
String content = makeMessage(project, commenter);
UserEntity receiver = userRepository.findById(project.getUserId()).orElseThrow(() -> new CustomException(ErrorException.USER_NOT_FOUND));
CommentAlarmEntity commentAlarmEntity = new CommentAlarmEntity(comment, content, project, receiver);
AlarmEntity saved = alarmRepository.save(commentAlarmEntity);
sendToUser(project.getUserId(),saved);
}
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

댓글 알람 전송 메소드에 불일치 이슈가 있습니다.

111번 줄에서는 userRepository.findById(project.getUserId())로 사용자를 조회하고 있으나, 114번 줄에서는 project.getUserId()를 직접 사용하고 있습니다. 일관성을 위해 receiver.getId()를 사용하는 것이 좋습니다.

-        sendToUser(project.getUserId(),saved);
+        sendToUser(receiver.getId(),saved);

@HeWillGoTillTheEnd HeWillGoTillTheEnd merged commit 217cc13 into main Apr 23, 2025
1 check 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.

1 participant