Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#12] 동네 인증 도메인, 유즈케이스 구현 및 테스트 코드 작성 #15

Merged
merged 7 commits into from
Sep 21, 2024

Conversation

Srltas
Copy link
Collaborator

@Srltas Srltas commented Sep 13, 2024

📌 Summary

사용자의 위치를 기반으로 동네를 인증하고 등록하는 기능에 대한 도메인, 유즈케이스를 구현하고 테스트 코드를 만들었습니다.

📝 Description

  • 동네 인증
    • 사용자가 특정 동네 범위 내에 있는지 확인하고, 그 결과에 따라 해당 동네를 인증할 수 있는 유즈케이스 구현
  • 유연한 거리 계산
    • 다양한 거리 계산 방식에 대응할 수 있도록 DistanceCalculator 인터페이스를 정의하고, 이를 구현하는 방식으로 설계
      (Geoapify API를 이용할려고 했으나, 두 위치의 직선 거리 계산은 지원하지 않아 Haversine 공식으로 직접 구현)
  • 객체의 책임 분리
    • Neighborhood클래스는 사용자의 현재 위치가 동네 범위 안에 있는지 검증하고, Location클래스는 두 위치 간의 거리를 계산하는 책임을 가짐
  • 헥사고날 아키텍처를 기반으로 프로젝트 패키지 구조 설계

✅ Checklist

  • 새로운 기능이나 수정된 기능에 대해 충분한 테스트를 작성했습니다.
  • 코딩 스타일 가이드를 준수했습니다.
  • 문서(주석, README 등)가 필요하다면 업데이트했습니다.

- 다양한 거리 계산 방법에 대응할 수 있도록 'DistanceCalculator' 인터페이스 도입
- 'Neighborhood'가 자신의 범위를 확인할 수 있도록 비즈니스 로직을 내부에 포함
- 동네가 없거나 범위 밖인 경우를 처리하기 위해 커스텀 예외 생성
@Srltas Srltas self-assigned this Sep 13, 2024
Copy link
Collaborator

@f-lab-bradley f-lab-bradley left a comment

Choose a reason for hiding this comment

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

해당 프로젝트에 lombok 이 등록 안되어 있어요.
rebase 를 lombok 이 포함 된 브랜치로 진행 한 뒤 Lombok 브렌치가 main 으로 머지 되면 그 때 다시 main 으로 리베이스 해 주세요

Copy link
Collaborator Author

@Srltas Srltas left a comment

Choose a reason for hiding this comment

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

패키지 구조나 클래스들의 위치에 대해서 궁금한 것이 있습니다.

두 위치 간의 거리를 계산하는 인터페이스(DistanceCalculator)는 Location 도메인과 밀접하게 관련되어 있다고 생각하여 domain.model.location 패키지에 생성 했습니다. 해당 인터페이스에 대한 구현체는 언제든 구현 방법이 변경될 수 있고, 외부 API를 사용할 가능성도 있다고 생각해 현재는 adapter.out 패키지에 위치 시켰습니다.

하지만 이 구현체는 Location 도메인 내에서만 사용되며, 애플리케이션에서 사용될 가능성은 낮다고 생각합니다. 이 때문에, 해당 구현체의 패키지를 domain.service.location으로 옮겨 도메인과 관련된 기능을 한 곳에 모아두는 것이 더 나을지 고민이 됩니다. 멘토님께서는 이 부분에 대해 어떻게 생각하시는지 궁금합니다.

Srltas and others added 3 commits September 15, 2024 16:41
 - Lombok의 AllArgsConstructor 어노테이션을 RequiredArgsConstructor로 변경
Nested 애노테이션을 이용해 테스트 목적에 따라 분리
Copy link
Collaborator

@f-lab-bradley f-lab-bradley left a comment

Choose a reason for hiding this comment

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

전체적으로 모킹해서 테스트도 잘 작성 해 주셨네요.
쪼끔만 더 다듬어 보아요

@f-lab-bradley
Copy link
Collaborator

패키지 구조나 클래스들의 위치에 대해서 궁금한 것이 있습니다.

두 위치 간의 거리를 계산하는 인터페이스(DistanceCalculator)는 Location 도메인과 밀접하게 관련되어 있다고 생각하여 domain.model.location 패키지에 생성 했습니다. 해당 인터페이스에 대한 구현체는 언제든 구현 방법이 변경될 수 있고, 외부 API를 사용할 가능성도 있다고 생각해 현재는 adapter.out 패키지에 위치 시켰습니다.

하지만 이 구현체는 Location 도메인 내에서만 사용되며, 애플리케이션에서 사용될 가능성은 낮다고 생각합니다. 이 때문에, 해당 구현체의 패키지를 domain.service.location으로 옮겨 도메인과 관련된 기능을 한 곳에 모아두는 것이 더 나을지 고민이 됩니다. 멘토님께서는 이 부분에 대해 어떻게 생각하시는지 궁금합니다.

이거 답변 늦었죠;; commit 만 보다가 놓쳤어요... ㅈㅅㅈㅅ

일단 저는 domain 에 있어야 한다고 생각해요. 도메인에서도 외부 API 를 사용 할 수 있어요.
다만 도메인에 설정된 인터페이스를 통해서 호출 하는 거구요...

도메인은 도메인에 선언된 interface 를 호출 하는 거고
adapter.out 은 해당 interface 의 구현체를 모아두는 것 이구요

- 캡슐화와 코드의 응집도를 높이기 위한 수정입니다
- Neighborhood를 생성할 때 distanceCalculator를 주입 받습니다
- NeighborhoodVerificationService 유즈케이스에서 더 이상 distanceCalculator에 대해 알 필요가 없습니다
- 인증된 동네를 관리하기 위해 VerifiedNeighborhood 도메인 생성
- User와 VerifiedNeighborhood를 하나의 애그리게이트로 통합
- User 도메인 내에 verifiedNeighborhood 컬렉션을 추가하여 인증된 동네 관리
Copy link
Collaborator

@f-lab-bradley f-lab-bradley left a comment

Choose a reason for hiding this comment

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

PR 에서 의도한 내용들 구현 완료 된건가요???
아니라면 드래프트로 바꿔주시고 맞으면 머지 진행 해 주세요.

@Srltas Srltas added the feature Task to add new features label Sep 21, 2024
@Srltas
Copy link
Collaborator Author

Srltas commented Sep 21, 2024

PR 에서 의도한 내용들 구현 완료 된건가요??? 아니라면 드래프트로 바꿔주시고 맞으면 머지 진행 해 주세요.

처음 목표 했던 동네 인증 도메인 모델, 유즈케이스, 테스트 케이스는 어느정도 구현이 되었다고 생가하여 우선 머지를 진행하도록 하겠습니다.

@Srltas Srltas merged commit cc2a412 into main Sep 21, 2024
1 check passed
@Srltas Srltas deleted the feature_issue_12 branch September 21, 2024 08:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature Task to add new features
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants