Conversation
…-password-verify # Conflicts: # src/main/java/konkuk/thip/common/exception/code/ErrorCode.java # src/main/java/konkuk/thip/room/domain/Room.java
|
""" Walkthrough비공개 방의 비밀번호 검증 API가 새롭게 도입되었습니다. 이를 위해 도메인, 서비스, 컨트롤러, 요청/응답 DTO, 예외 코드가 추가 및 확장되었고, 관련 단위 및 통합 테스트가 구현되었습니다. 또한, 불필요한 더미 클래스가 삭제되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant Controller as RoomQueryController
participant Service as RoomVerifyPasswordService
participant RoomPort as RoomCommandPort
participant Room as Room(domain)
Client->>Controller: POST /rooms/{roomId}/password (password)
Controller->>Service: verifyRoomPassword(query)
Service->>RoomPort: findById(roomId)
Service->>Room: verifyPassword(password)
Room-->>Service: (예외 또는 성공)
Service-->>Controller: Void
Controller-->>Client: BaseResponse<Void>
Assessment against linked issues
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (4)
🚧 Files skipped from review as they are similar to previous changes (1)
🧰 Additional context used🧬 Code Graph Analysis (1)src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java (1)
⏰ 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)
🔇 Additional comments (4)
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed 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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
src/main/java/konkuk/thip/room/application/service/RoomVerifyPasswordService.java (1)
21-32: 반환 타입 개선 제안메서드가
Void를 반환하고null을 리턴하는 것보다void를 사용하는 것이 더 명확합니다:@Override -public Void verifyRoomPassword(RoomVerifyPasswordQuery query) { +public void verifyRoomPassword(RoomVerifyPasswordQuery query) { //유저 검증 userCommandPort.findById(query.userId()); //방 검증 Room room = roomCommandPort.findById(query.roomId()); //도메인에서 비밀번호 검증 로직 수행 room.verifyPassword(query.password()); - return null; }이는 UseCase 인터페이스도 함께 수정해야 합니다.
src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordControllerTest.java (1)
84-95: 경로 매개변수 검증 테스트
roomId누락 시나리오 테스트가 적절합니다. 다만 더 구체적인 검증이 가능합니다:@Test @DisplayName("roomId가 없을 때 400 error") void missing_roomId() throws Exception { Map<String, Object> req = buildValidRequest(); req.remove("roomId"); mockMvc.perform(post("/rooms//password") .requestAttr("userId", req.get("userId")) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(req))) - .andExpect(status().is4xxClientError()); + .andExpect(status().isNotFound()); }404 Not Found가 더 구체적인 응답입니다.
src/main/java/konkuk/thip/room/domain/Room.java (1)
119-126: 에러 메시지 개선 제안현재 에러 메시지에 마감일 정보를 포함하고 있는 것이 좋습니다. 다만 메시지 일관성을 위해 소폭 개선할 수 있습니다:
if (isRecruitmentPeriodExpired()) { - String message = String.format("모집기간(%s까지)이 만료된 방에는 참여할 수 없습니다.", deadline); + String message = String.format("모집기간이 만료된 방입니다. (마감일: %s)", deadline); throw new BusinessException( ErrorCode.ROOM_RECRUITMENT_PERIOD_EXPIRED, new IllegalArgumentException(message) ); }이는 테스트의 에러 메시지 검증과도 일치합니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (12)
src/main/java/konkuk/thip/common/exception/code/ErrorCode.java(1 hunks)src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java(1 hunks)src/main/java/konkuk/thip/room/adapter/in/web/request/RoomVerifyPasswordRequest.java(1 hunks)src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java(0 hunks)src/main/java/konkuk/thip/room/application/port/in/RoomVerifyPasswordUseCase.java(1 hunks)src/main/java/konkuk/thip/room/application/port/in/dto/DummyQuery.java(0 hunks)src/main/java/konkuk/thip/room/application/port/in/dto/RoomVerifyPasswordQuery.java(1 hunks)src/main/java/konkuk/thip/room/application/service/RoomVerifyPasswordService.java(1 hunks)src/main/java/konkuk/thip/room/domain/Room.java(2 hunks)src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java(1 hunks)src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordControllerTest.java(1 hunks)src/test/java/konkuk/thip/room/domain/RoomTest.java(3 hunks)
💤 Files with no reviewable changes (2)
- src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java
- src/main/java/konkuk/thip/room/application/port/in/dto/DummyQuery.java
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java (1)
src/main/java/konkuk/thip/room/adapter/in/web/RoomCommandController.java (1)
RestController(14-26)
🔇 Additional comments (17)
src/main/java/konkuk/thip/room/application/port/in/dto/RoomVerifyPasswordQuery.java (1)
3-8: 깔끔한 쿼리 DTO 구현입니다레코드 클래스를 사용하여 불변 객체로 구현되었고, 필드 타입과 명명이 적절합니다. 쿼리 DTO 레이어에서는 검증 로직이 없는 것이 맞습니다.
src/main/java/konkuk/thip/room/application/port/in/RoomVerifyPasswordUseCase.java (1)
5-7: 인터페이스 구현이 적절합니다단일 책임 원칙을 잘 따르고 있으며, 메서드명이 명확합니다.
Void반환 타입은 예외 기반 오류 처리 방식에 적합합니다.src/main/java/konkuk/thip/common/exception/code/ErrorCode.java (1)
72-74: 에러 코드 정의가 체계적입니다새로운 에러 코드들이 기존 패턴을 잘 따르고 있으며, 코드 번호 체계와 HTTP 상태 코드가 적절합니다. 에러 메시지도 명확하고 일관성이 있습니다.
src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java (1)
17-24: 컨트롤러 구현이 우수합니다기존 패턴을 잘 따르고 있으며, 파라미터 검증과 응답 구조가 적절합니다.
@UserId어노테이션과@Valid검증이 올바르게 적용되었습니다.src/main/java/konkuk/thip/room/adapter/in/web/request/RoomVerifyPasswordRequest.java (2)
9-11: 검증 로직이 적절합니다
@NotBlank와@Pattern어노테이션을 사용한 검증이 올바르게 구현되었습니다. 4자리 숫자 패턴이 방 비밀번호 요구사항에 적합합니다.
13-18: 변환 메서드 구현이 깔끔합니다
toQuery메서드가 간결하고 명확하게 구현되었습니다. 파라미터 순서와 명명이 적절합니다.src/test/java/konkuk/thip/room/domain/RoomTest.java (2)
194-206: 리플렉션 사용이 적절합니다모집기간 만료 상태를 테스트하기 위해
ReflectionTestUtils.setField를 사용하는 것이 좋은 접근입니다. 이는 도메인 로직의 시간 의존성을 제거하여 테스트 가능하게 만듭니다.
208-240: 포괄적인 예외 시나리오 테스트다양한 예외 상황에 대한 테스트가 잘 구성되어 있습니다:
- 공개방에 비밀번호 입력 시
ROOM_PASSWORD_NOT_REQUIRED- 비밀번호 불일치 시
ROOM_PASSWORD_MISMATCH- 성공 시나리오도 포함
각 테스트가 적절한 에러 코드를 검증하고 있어 도메인 로직의 정확성을 보장합니다.
src/main/java/konkuk/thip/room/application/service/RoomVerifyPasswordService.java (1)
1-34: 잘 구현된 서비스 클래스서비스 구현이 깔끔하고 Clean Architecture 원칙을 잘 따르고 있습니다:
@Transactional(readOnly = true)적절한 사용- 의존성 주입을 통한 포트 활용
- 사용자와 방 존재 검증 후 도메인 로직 위임
- 단일 책임 원칙 준수
도메인 로직에 위임하여 비즈니스 규칙을 도메인 계층에서 처리하는 것이 올바른 접근입니다.
src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordControllerTest.java (2)
36-52: 유용한 테스트 헬퍼 메서드
buildValidRequest()와assertBad()헬퍼 메서드가 테스트 코드의 가독성과 재사용성을 높입니다. 테스트 구조가 깔끔하고 DRY 원칙을 잘 따르고 있습니다.
57-79: 포괄적인 비밀번호 검증 테스트비밀번호 검증 시나리오가 잘 구성되어 있습니다:
- 4자리 숫자가 아닌 경우
- 길이가 4자리가 아닌 경우
- 빈 값인 경우
각 테스트가 적절한 에러 메시지를 검증하고 있어 사용자 경험을 보장합니다.
src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java (4)
70-134: 잘 구성된 테스트 셋업통합 테스트를 위한 데이터 준비가 체계적으로 구성되어 있습니다:
- 사용자, 별칭, 책, 카테고리 엔티티 생성
- 비공개방과 공개방 모두 준비
- 적절한 연관관계 설정
테스트 데이터 격리를 위한
@BeforeEach와@AfterEach설정도 적절합니다.
145-179: 핵심 시나리오 테스트 커버리지성공 시나리오와 실패 시나리오가 모두 포함되어 있어 API의 동작을 종합적으로 검증합니다:
- 정상 비밀번호 입력 시 성공
- 비밀번호 불일치 시 적절한 에러 응답
응답 구조(
isSuccess,code,message) 검증이 일관되게 이루어지고 있습니다.
181-215: 모집기간 만료 시나리오 테스트모집기간 만료 상황을 시뮬레이션하는 방식이 명확합니다:
startDate를 오늘로 설정하여 모집 마감일이 어제가 되도록 함- 주석으로 로직 설명 추가
실제 도메인 로직과 일치하는 테스트 시나리오입니다.
217-234: 공개방 비밀번호 입력 시나리오공개방에 비밀번호를 입력하는 잘못된 시나리오를 적절히 테스트하고 있습니다. 에러 코드
ROOM_PASSWORD_NOT_REQUIRED와 적절한 메시지를 검증합니다.src/main/java/konkuk/thip/room/domain/Room.java (2)
117-137: 잘 구현된 도메인 비즈니스 로직
verifyPassword메서드가 도메인 규칙을 명확하게 구현하고 있습니다:
- 모집기간 만료 체크
- 공개방 비밀번호 입력 방지
- 비밀번호 일치 검증
각 단계에서 적절한
BusinessException과 에러 코드를 사용하여 명확한 오류 처리를 하고 있습니다.
139-143: 재사용 가능한 유틸리티 메서드
isRecruitmentPeriodExpired메서드가 public으로 선언되어 다른 곳에서도 재사용할 수 있도록 설계되었습니다.로직이 명확합니다:
- 모집 마감일:
startDate.minusDays(1)- 현재 날짜가 마감일 이후인지 체크
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
src/test/java/konkuk/thip/room/domain/RoomTest.java (1)
181-191: Reflection 사용 대신 더 자연스러운 테스트 방법 고려현재 reflection을 사용하여 private field를 수정하는 방식은 동작하지만, 더 자연스러운 방법을 고려해볼 수 있습니다.
다음 중 하나의 방법을 고려해보세요:
- Room 도메인에 테스트용 정적 팩토리 메서드 추가:
// Room 클래스에 추가 public static Room withExpiredRecruitmentPeriod(String title, String description, boolean isPublic, String password, LocalDate endDate, int maxParticipants, Long bookId, Long leaderId) { // 만료된 모집기간을 가진 Room 생성 return new Room(title, description, isPublic, password, LocalDate.now().minusDays(1), endDate, maxParticipants, bookId, leaderId); }
- 과거 날짜로 시작하는 Room 생성 허용 (도메인 규칙 변경이 필요한 경우):
LocalDate pastStart = LocalDate.now().minusDays(1); Room room = Room.withoutId( "제목", "설명", false, "1234", pastStart, pastStart.plusDays(10), 5, 123L, 456L );현재 구현도 동작하지만, 위 방법들이 더 명확하고 유지보수하기 쉬운 코드가 될 수 있습니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/test/java/konkuk/thip/room/domain/RoomTest.java(3 hunks)
🔇 Additional comments (8)
src/test/java/konkuk/thip/room/domain/RoomTest.java (8)
3-3: 새로운 테스트 기능에 필요한 import 문들이 적절히 추가됨비즈니스 예외 처리 테스트와 reflection 기반 테스트를 위한 필수 import들이 정확히 추가되었습니다.
Also applies to: 5-5, 14-14
16-16: 테스트 분류를 위한 Display name 개선"[단위]" 접두사 추가로 테스트 유형을 명확히 구분할 수 있어 좋습니다.
159-167: 모집기간 만료 로직의 정상 케이스 테스트 구현모집기간이 만료되지 않은 경우를 올바르게 테스트하고 있습니다.
169-179: 모집마감일 당일 케이스 테스트 구현오늘이 모집마감일인 경우 아직 만료되지 않은 것으로 처리하는 비즈니스 로직을 정확히 검증하고 있습니다.
193-206: 모집기간 만료 시 예외 처리 테스트 구현비즈니스 예외 발생과 에러 코드 검증을 정확히 수행하고 있습니다. reflection 사용으로 만료 상태를 시뮬레이션하는 방법도 적절합니다.
208-218: 공개방 비밀번호 입력 예외 처리 테스트공개방에 비밀번호를 입력했을 때의 예외 처리를 올바르게 검증하고 있습니다.
220-230: 비밀번호 불일치 예외 처리 테스트잘못된 비밀번호 입력 시 적절한 에러 코드와 함께 예외가 발생하는지 정확히 검증하고 있습니다.
232-240: 정상적인 비밀번호 검증 성공 케이스 테스트모든 조건이 만족되었을 때 예외가 발생하지 않는 것을 확인하는 중요한 테스트입니다.
|



#️⃣ 연관된 이슈
📝 작업 내용
isRecruitmentPeriodExpired()같은 경우 방 참여하기 시 재사용가능할 것 같아 public 메서드로 작성하였습니다📸 스크린샷
💬 리뷰 요구사항
📌 PR 진행 시 이러한 점들을 참고해 주세요
Summary by CodeRabbit
신규 기능
버그 수정
테스트