Skip to content

[feat] 팔로잉 조회 여부 api 개발#106

Merged
buzz0331 merged 10 commits into
developfrom
feat/#100-get-isFollowing
Jul 28, 2025
Merged

[feat] 팔로잉 조회 여부 api 개발#106
buzz0331 merged 10 commits into
developfrom
feat/#100-get-isFollowing

Conversation

@buzz0331
Copy link
Copy Markdown
Contributor

@buzz0331 buzz0331 commented Jul 26, 2025

#️⃣ 연관된 이슈

closes #100

📝 작업 내용

팔로잉 조회 여부 api 개발했습니다.

추가적으로, 이전 pr #76 에서 팔로잉 상태 변경 시에 소프트 딜리트를 적용했었는데, 회의에서 결정한 대로 팔로잉에는 소프트 딜리트를 해제하고 이에 따른 서비스 로직도 변경했습니다.

📸 스크린샷

💬 리뷰 요구사항

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

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

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

Summary by CodeRabbit

  • 신규 기능

    • 사용자가 다른 사용자를 팔로우하고 있는지 확인할 수 있는 API 엔드포인트가 추가되었습니다.
  • 버그 수정

    • 언팔로우 시 팔로우 관계가 비활성화 처리 대신 완전히 삭제되도록 변경되었습니다.
  • 테스트

    • "팔로우 여부 확인" API에 대한 통합 테스트가 추가되었습니다.
    • 언팔로우 시 팔로우 엔터티 삭제 여부를 검증하는 테스트가 수정되었습니다.
  • 리팩터

    • 사용자 정보 업데이트 시 여러 필드를 한 번에 갱신하도록 개선되었습니다.
    • 팔로우 관계 조회 시 활성 상태만 반환하도록 쿼리가 수정되었습니다.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jul 26, 2025

"""

Walkthrough

팔로우 관계의 삭제 방식이 소프트 딜리트에서 실제 삭제로 변경되었습니다. 또한, 사용자가 특정 사용자를 팔로우하고 있는지 확인하는 새로운 API 엔드포인트와 관련 서비스, 응답 객체, 테스트가 추가되었습니다. 기존 팔로우 관련 메서드명과 인터페이스도 이에 맞게 조정되었습니다.

Changes

파일/경로 변경 요약
.../user/adapter/in/web/UserQueryController.java
.../user/adapter/in/web/response/UserIsFollowingResponse.java
팔로잉 여부 조회 API 엔드포인트 및 응답 객체 추가
.../user/application/port/in/UserIsFollowingUsecase.java
.../user/application/service/UserIsFollowingService.java
팔로잉 여부 조회 유스케이스 인터페이스 및 구현 서비스 추가
.../user/adapter/out/jpa/FollowingJpaEntity.java 팔로우 엔티티의 소프트 딜리트(@SQLDelete) 제거
.../user/adapter/out/jpa/UserJpaEntity.java 팔로워 카운트만 갱신하는 메서드 제거, 여러 필드를 한 번에 갱신하는 updateFrom 메서드 추가
.../user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java 팔로우 삭제 방식 변경(상태값 변경 → 실제 삭제), 관련 메서드명 및 구현 수정
.../user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java 팔로우 조회 시 ACTIVE 상태만 조회하도록 쿼리 조건 추가
.../user/application/port/out/FollowingCommandPort.java 팔로우 상태값 변경 메서드 제거, 실제 삭제 메서드 및 조회 메서드 추가
.../user/application/service/following/UserFollowService.java 팔로우 상태값 변경 로직을 실제 삭제로 변경, equals 비교 방식 수정
.../user/adapter/in/web/UserIsFollowingApiTest.java 팔로우 여부 조회 API에 대한 통합 테스트 신규 추가
.../user/adapter/in/web/UserFollowApiTest.java 언팔로우 시 상태값 변경 검증에서 실제 삭제 검증으로 테스트 수정
.../user/application/service/UserFollowServiceTest.java 팔로우 상태값 변경 검증에서 실제 삭제 검증으로 테스트 수정

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant UserQueryController
    participant UserIsFollowingService
    participant FollowingCommandPort

    Client->>UserQueryController: GET /users/{targetUserId}/is-following (userId)
    UserQueryController->>UserIsFollowingService: isFollowing(userId, targetUserId)
    UserIsFollowingService->>FollowingCommandPort: findByUserIdAndTargetUserId(userId, targetUserId)
    FollowingCommandPort-->>UserIsFollowingService: Following 존재 여부 반환
    UserIsFollowingService-->>UserQueryController: UserIsFollowingResponse(isFollowing)
    UserQueryController-->>Client: BaseResponse<UserIsFollowingResponse>
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~15–20 minutes

Suggested reviewers

  • seongjunnoh
  • hd0rable

Poem

🐇
팔로우의 길을 따라 hop hop hop,
이제는 삭제도 깔끔하게, 흔적 없이 pop!
"팔로잉 중인가요?" 물으면,
토끼 귀처럼 쫑긋 대답해요—
참과 거짓, 이제 API로 확인해요!

(코드밭에 평화가 깃들길 바라며… 🥕)
"""


📜 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 49b10f2 and 410be15.

📒 Files selected for processing (2)
  • src/main/java/konkuk/thip/user/application/mapper/FollowQueryMapper.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/service/following/UserGetFollowService.java (4 hunks)
✅ Files skipped from review due to trivial changes (2)
  • src/main/java/konkuk/thip/user/application/mapper/FollowQueryMapper.java
  • src/main/java/konkuk/thip/user/application/service/following/UserGetFollowService.java
⏰ 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
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/#100-get-isFollowing

🪧 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.
    • @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 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.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

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

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

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: 6

🧹 Nitpick comments (3)
src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (1)

63-63: 메서드명이 실제 동작과 불일치

updateUserFollowerCount 메서드가 이제 updateFrom(targetUser)를 호출하여 팔로워 수 외에도 다른 필드를 업데이트할 수 있습니다. 메서드명이 실제 동작을 정확히 반영하지 못합니다.

메서드명을 다음과 같이 변경하는 것을 고려해보세요:

-private UserJpaEntity updateUserFollowerCount(User targetUser) {
+private UserJpaEntity updateTargetUser(User targetUser) {
src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java (1)

58-65: 팔로잉 여부 조회 엔드포인트가 올바르게 구현됨

새로운 GET 엔드포인트가 적절한 경로 패턴과 파라미터를 사용하여 구현되었습니다. @UserId@PathVariable 사용이 적절합니다.

하지만 메서드명에 오타가 있습니다:

-public BaseResponse<UserIsFollowingRespone> checkisFollowing(@UserId final Long userId,
+public BaseResponse<UserIsFollowingRespone> checkIsFollowing(@UserId final Long userId,

camelCase 규칙에 따라 checkIsFollowing으로 수정해야 합니다.

src/test/java/konkuk/thip/user/adapter/in/web/UserIsFollowingApiTest.java (1)

60-63: 테스트 데이터 생성 방식을 개선할 수 있습니다.

현재 FollowingJpaEntity를 직접 빌더로 생성하고 있는데, 다른 엔티티들처럼 TestEntityFactory를 사용하는 것이 일관성 측면에서 더 좋을 것 같습니다.

다음과 같이 개선할 수 있습니다:

-        // 팔로잉 관계 저장
-        followingJpaRepository.save(FollowingJpaEntity.builder()
-                .userJpaEntity(user)
-                .followingUserJpaEntity(target)
-                .build());
+        // 팔로잉 관계 저장
+        followingJpaRepository.save(TestEntityFactory.createFollowing(user, target));

단, 이는 TestEntityFactorycreateFollowing 메서드가 존재하는 경우에만 적용 가능합니다.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 6ce94ef and 66613c7.

📒 Files selected for processing (13)
  • src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java (3 hunks)
  • src/main/java/konkuk/thip/user/adapter/in/web/response/UserIsFollowingRespone.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/jpa/FollowingJpaEntity.java (0 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java (2 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (3 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/port/in/UserIsFollowingUsecase.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/port/out/FollowingCommandPort.java (2 hunks)
  • src/main/java/konkuk/thip/user/application/service/UserIsFollowingService.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/service/following/UserFollowService.java (2 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java (4 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserIsFollowingApiTest.java (1 hunks)
  • src/test/java/konkuk/thip/user/application/service/UserFollowServiceTest.java (2 hunks)
💤 Files with no reviewable changes (1)
  • src/main/java/konkuk/thip/user/adapter/out/jpa/FollowingJpaEntity.java
🧰 Additional context used
🧠 Learnings (2)
src/main/java/konkuk/thip/user/application/port/out/FollowingCommandPort.java (1)

Learnt from: seongjunnoh
PR: #43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.

src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (2)

Learnt from: seongjunnoh
PR: #43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.

Learnt from: seongjunnoh
PR: #36
File: src/main/java/konkuk/thip/user/adapter/out/persistence/UserJpaRepository.java:7-7
Timestamp: 2025-06-29T09:47:31.299Z
Learning: Spring Data JPA에서 findBy{FieldName} 패턴의 메서드는 명시적 선언 없이 자동으로 생성되며, Optional 반환 타입을 사용하는 것이 null 안전성을 위해 권장됩니다.

🔇 Additional comments (17)
src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java (1)

6-6: 도메인 객체 import 추가 확인.

User 도메인 객체를 import하여 새로운 updateFrom 메서드에서 활용하는 것이 적절합니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java (1)

32-33: ACTIVE 상태 필터링 추가가 적절합니다.

팔로잉 관계 조회 시 StatusType.ACTIVE 조건을 추가하여 활성화된 팔로잉만 반환하도록 수정한 것이 올바릅니다. 이는 soft delete에서 실제 삭제로 변경된 전체적인 리팩토링과 일치하며, 새로운 "팔로잉 여부 확인" API의 정확한 동작을 보장합니다.

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

42-42: soft delete에서 실제 삭제로 변경이 적절합니다.

updateStatus 대신 deleteFollowing를 호출하도록 변경한 것이 PR 목표와 일치합니다. soft delete 방식을 제거하고 실제 삭제를 수행하는 것이 올바른 접근입니다.

src/test/java/konkuk/thip/user/application/service/UserFollowServiceTest.java (1)

69-69: 테스트 검증 로직 업데이트가 적절합니다.

서비스 구현체의 변경사항(updateStatusdeleteFollowing)에 맞춰 테스트의 검증 로직을 올바르게 업데이트했습니다. 테스트가 실제 서비스 동작을 정확히 검증하도록 보장합니다.

Also applies to: 133-133

src/main/java/konkuk/thip/user/application/port/in/UserIsFollowingUsecase.java (1)

5-7: 인터페이스 구현이 올바르게 정의됨

팔로잉 여부 확인을 위한 유스케이스 인터페이스가 명확하게 정의되어 있습니다.

src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java (2)

54-54: 테스트 표시명이 새로운 동작을 정확히 반영

소프트 삭제에서 실제 삭제로 변경된 비즈니스 로직에 맞게 테스트 표시명이 적절히 업데이트되었습니다.


98-100: 엔티티 삭제 검증 로직이 올바르게 구현됨

이전의 상태 변경 확인에서 실제 엔티티 삭제 확인으로 변경된 검증 로직이 정확합니다. Optional.isPresent()를 사용한 존재 여부 확인이 적절합니다.

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

16-20: 팔로잉 확인 로직이 올바르게 구현됨

Optional.isPresent()를 사용하여 팔로잉 관계 존재 여부를 확인하는 로직이 정확하고 간결합니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (1)

32-32: ACTIVE 팔로잉만 조회한다는 주석이 명확함

소프트 삭제 제거로 인해 ACTIVE 상태만 조회한다는 것을 명시한 주석이 코드 이해에 도움이 됩니다.

src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java (1)

9-9: 필요한 의존성들이 적절히 추가됨

새로운 기능을 위한 응답 클래스와 유스케이스 인터페이스 import가 올바르게 추가되었습니다.

Also applies to: 12-12, 26-26

src/main/java/konkuk/thip/user/application/port/out/FollowingCommandPort.java (3)

3-4: 새로운 import 문이 적절히 추가되었습니다.

EntityNotFoundExceptionErrorCode를 사용하는 새로운 메서드를 위해 필요한 import가 올바르게 추가되었습니다.


14-17: 기본 메서드 구현이 올바르고 일관성 있습니다.

getByUserIdAndTargetUserIdOrThrow 메서드는 Optional을 반환하는 메서드의 throwing 변형으로 일반적인 패턴을 따르고 있습니다. 에러 코드도 적절하게 사용되었습니다.


21-21: 메서드명 변경이 PR 목적과 잘 일치합니다.

updateStatus에서 deleteFollowing으로 메서드명을 변경한 것은 soft delete 제거 정책과 일치하며, 실제 동작을 더 명확하게 표현합니다.

src/test/java/konkuk/thip/user/adapter/in/web/UserIsFollowingApiTest.java (4)

24-28: 테스트 클래스 설정이 적절합니다.

Spring Boot 통합 테스트를 위한 어노테이션들이 올바르게 설정되었고, 한글 DisplayName으로 테스트 목적이 명확하게 표현되었습니다.


42-47: 테스트 격리를 위한 cleanup이 올바르게 구현되었습니다.

외래키 관계를 고려하여 followingJpaRepository.deleteAllInBatch() 먼저 실행하고, 이후 다른 엔티티들을 삭제하는 순서가 적절합니다.


49-71: 팔로잉 관계 존재 시나리오 테스트가 잘 구현되었습니다.

테스트 데이터 설정, API 호출, 응답 검증이 모두 적절하게 작성되었습니다. JSON path를 통한 응답 검증도 정확합니다.


73-89: 팔로잉 관계 없는 시나리오 테스트가 적절합니다.

팔로잉 관계가 존재하지 않는 경우의 테스트도 올바르게 구현되어 있어 API의 두 가지 주요 시나리오를 모두 커버합니다.

Comment thread src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java
Comment thread src/main/java/konkuk/thip/user/application/port/in/UserIsFollowingUsecase.java Outdated
Comment thread src/main/java/konkuk/thip/user/application/service/UserIsFollowingService.java Outdated
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: 0

🧹 Nitpick comments (2)
src/main/java/konkuk/thip/user/application/service/UserIsFollowingService.java (1)

15-15: primitive boolean 타입 사용을 고려해보세요.

성능상 Boolean 래퍼 타입보다는 primitive boolean을 사용하는 것이 좋습니다. null을 반환할 필요가 없다면 primitive 타입을 권장합니다.

-public Boolean isFollowing(Long userId, Long targetUserId) {
+public boolean isFollowing(Long userId, Long targetUserId) {
src/main/java/konkuk/thip/user/application/port/in/UserIsFollowingUsecase.java (1)

4-4: primitive boolean 타입 사용을 권장합니다.

유스케이스 인터페이스에서는 일반적으로 primitive 타입을 사용하는 것이 좋습니다. Boolean 래퍼 타입보다는 boolean을 사용해주세요.

-Boolean isFollowing(Long userId, Long targetUserId);
+boolean isFollowing(Long userId, Long targetUserId);
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between bf0a26c and 4e1d9e3.

📒 Files selected for processing (4)
  • src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java (3 hunks)
  • src/main/java/konkuk/thip/user/adapter/in/web/response/UserIsFollowingResponse.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/port/in/UserIsFollowingUsecase.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/service/UserIsFollowingService.java (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java
  • src/main/java/konkuk/thip/user/adapter/in/web/response/UserIsFollowingResponse.java
⏰ 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 (2)
src/main/java/konkuk/thip/user/application/service/UserIsFollowingService.java (1)

1-19: 아키텍처 문제가 해결되었습니다.

이전 리뷰에서 지적된 웹 어댑터 응답 객체에 대한 의존성 문제가 해결되었습니다. 서비스가 이제 올바르게 Boolean을 반환하고 있습니다.

src/main/java/konkuk/thip/user/application/port/in/UserIsFollowingUsecase.java (1)

1-5: Clean Architecture 원칙 위반 문제가 해결되었습니다.

이전 리뷰에서 지적된 웹 어댑터 응답 객체에 대한 의존성 문제가 해결되었습니다. 유스케이스 인터페이스가 이제 올바르게 도메인 레이어의 관심사만 다루고 있습니다.

Copy link
Copy Markdown
Member

@hd0rable hd0rable left a comment

Choose a reason for hiding this comment

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

image 굿입니다~

Comment on lines 12 to +17
Optional<Following> findByUserIdAndTargetUserId(Long userId, Long targetUserId);

default Following getByUserIdAndTargetUserIdOrThrow(Long userId, Long targetUserId) {
return findByUserIdAndTargetUserId(userId, targetUserId)
.orElseThrow(() -> new EntityNotFoundException(ErrorCode.FOLLOW_NOT_FOUND));
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

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.

[THIP2025-147] [feat] 팔로잉 여부 조회

3 participants