Skip to content

[volume-1] 사용자, 포인트 도메인 기능 구현#4

Merged
hyujikoh merged 58 commits into
mainfrom
week1
Oct 31, 2025
Merged

[volume-1] 사용자, 포인트 도메인 기능 구현#4
hyujikoh merged 58 commits into
mainfrom
week1

Conversation

@hyujikoh

Copy link
Copy Markdown
Owner

📌 Summary

  • 사용자 , 포인트, 포인트 이력 엔티티 구현
  • 사용자 등록 및 회원가입 기능, API 구현 (단위, 통합 , E2E 구현)
  • 사용자 조회 기능, API 구현 (통합 , E2E 구현)
  • 포인트 조회 기능, API 구현 (통합 , E2E 구현)
  • 포인트 충전 기능, API 구현 (단위, 통합 , E2E 구현)

💬 Review Points

  1. 아키텍처 관점: 파사드-서비스 간 트랜잭션 경계와 책임 분리가 적절한지
  • 현재 파사드 서비스에서 트랜잭션을 적용해서 원자성을 보장하도록 했는데, 이게 맞는것인지 의견 구합니다. 가령 회원가입시 포인트 엔티티 생성 과같은 프로세스를 통해 원자성을 보장하도록 하였는데. 저는 비즈니스 단위로 기본 트랜잭션을 묶고 하위 트랜잭션을 태우는 형태가 맞다 생각 하여 파사드에 트랜잭션을 적용하였습니다.
  • 각 파사드에서 타 도메인 서비스를 호출하는 방식을 적용하였는데, 이렇게 될경우 파사드와 도메인 서비스의 책임 경계가 무너질것 같아서 파사드에서 타 도메인을 호출할때는 도메인 서비스로 호출하도록 하였습니다. 그렇다면 파사드에서 타 도메인의 파사드로 호출하는것은 원칙상 위배되는것인지 궁금합니다.
  1. 예외 처리 전략: 도메인/애플리케이션 레이어별 예외 타입 전략이 일관성 있는지
  • ApiControllerAdvice.java 로 공통으로 예외 사항을 적용하는 방식으로 일관성있는 에러 메시지 응답을 구성하였습니다. 이 부분에서 이후로 다양한 예외를 고려할때 마다 추가를 하면 너무 많은 코드량이 나올것 같은데, 멘토님들은 어떤식으로 예외 처리를 유지보수를 원활하게 하시는지 궁금합니다.
  1. null 처리 전략: 서비스 레이어별 null/Optional/예외 처리 방식의 일관성
  • PointRepository.findByUsername 에서 사용자 정보 기반으로 조회하는 로직을 구성하였는데, 없을 경우 null 을 던지는 방식으로 구성하였습니다. 이럴경우 어느 레이어에서 명확히 null 예외를 처리 하는것이 좋을지 리뷰를 받고 싶습니다.

✅ Checklist

  • 테스트 코드 포함
  • 불필요한 코드 제거
  • 도메인 문서 작성, 1주차 task 문서 누락된 것 업데이트

회원 가입

🧱 단위 테스트

  • ID 가 영문 및 숫자 10자 이내 형식에 맞지 않으면, User 객체 생성에 실패한다.
  • 이메일이 xx@yy.zz 형식에 맞지 않으면, User 객체 생성에 실패한다.
  • 생년월일이 yyyy-MM-dd 형식에 맞지 않으면, User 객체 생성에 실패한다.

🔗 통합 테스트

  • 회원 가입시 User 저장이 수행된다. ( spy 검증 )
  • 이미 가입된 ID 로 회원가입 시도 시, 실패한다.

🌐 E2E 테스트

  • 회원 가입이 성공할 경우, 생성된 유저 정보를 응답으로 반환한다.
  • 회원 가입 시에 성별이 없을 경우, 400 Bad Request 응답을 반환한다.

내 정보 조회

🔗 통합 테스트

  • 해당 ID 의 회원이 존재할 경우, 회원 정보가 반환된다.
  • 해당 ID 의 회원이 존재하지 않을 경우, null 이 반환된다.

🌐 E2E 테스트

  • 내 정보 조회에 성공할 경우, 해당하는 유저 정보를 응답으로 반환한다.
  • 존재하지 않는 ID 로 조회할 경우, 404 Not Found 응답을 반환한다.

포인트 조회

🔗 통합 테스트

  • 해당 ID 의 회원이 존재할 경우, 보유 포인트가 반환된다.
  • 해당 ID 의 회원이 존재하지 않을 경우, null 이 반환된다.

🌐 E2E 테스트

  • 포인트 조회에 성공할 경우, 보유 포인트를 응답으로 반환한다.
  • X-USER-ID 헤더가 없을 경우, 400 Bad Request 응답을 반환한다.

포인트 충전

🧱 단위 테스트

  • 0 이하의 정수로 포인트를 충전 시 실패한다.

🔗 통합 테스트

  • 존재하지 않는 유저 ID 로 충전을 시도한 경우, 실패한다.

🧱 통합 테스트

  • 존재하는 유저가 1000원을 충전할 경우, 충전된 보유 총량을 응답으로 반환한다.
  • 존재하지 않는 유저로 요청할 경우, 404 Not Found 응답을 반환한다.

📎 References

  • 참고 문서, 오픈소스는 이번에 없었습니다.

hyujikoh and others added 30 commits October 26, 2025 16:51
사용자 등록 spy 테스트 추가
사용자 정보 조회 기능 구현
hyujikoh and others added 28 commits October 29, 2025 20:40
포인트 도메인 기능 구현
# Conflicts:
#	apps/commerce-api/src/test/java/com/loopers/domain/point/PointServiceIntegrationTest.java
#	apps/commerce-api/src/test/java/com/loopers/domain/user/UserUnitTest.java
#	apps/commerce-api/src/test/java/com/loopers/interfaces/api/PointV1E2ETest.java
포인트 사용 기능 추가
# Conflicts:
#	.codeguide/loopers-1-week.md
#	apps/commerce-api/src/main/java/com/loopers/CommerceApiApplication.java
#	apps/commerce-api/src/main/java/com/loopers/application/example/ExampleFacade.java
#	apps/commerce-api/src/main/java/com/loopers/application/example/ExampleInfo.java
#	apps/commerce-api/src/main/java/com/loopers/domain/example/ExampleModel.java
#	apps/commerce-api/src/main/java/com/loopers/domain/example/ExampleService.java
#	apps/commerce-api/src/main/java/com/loopers/infrastructure/example/ExampleJpaRepository.java
#	apps/commerce-api/src/main/java/com/loopers/infrastructure/example/ExampleRepositoryImpl.java
#	apps/commerce-api/src/main/java/com/loopers/interfaces/api/ApiControllerAdvice.java
#	apps/commerce-api/src/main/java/com/loopers/interfaces/api/ApiResponse.java
#	apps/commerce-api/src/main/java/com/loopers/interfaces/api/example/ExampleV1ApiSpec.java
#	apps/commerce-api/src/main/java/com/loopers/interfaces/api/example/ExampleV1Controller.java
#	apps/commerce-api/src/main/java/com/loopers/interfaces/api/example/ExampleV1Dto.java
#	apps/commerce-api/src/main/java/com/loopers/support/error/ErrorType.java
#	apps/commerce-api/src/test/java/com/loopers/domain/example/ExampleModelTest.java
#	apps/commerce-api/src/test/java/com/loopers/domain/example/ExampleServiceIntegrationTest.java
#	apps/commerce-api/src/test/java/com/loopers/interfaces/api/ExampleV1ApiE2ETest.java
#	apps/commerce-api/src/test/java/com/loopers/support/error/CoreExceptionTest.java
1주차 작업물 병합
@hyujikoh hyujikoh self-assigned this Oct 31, 2025
@hyujikoh hyujikoh merged commit 9753ed7 into main Oct 31, 2025
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