Skip to content

Conversation

@mr6208
Copy link
Contributor

@mr6208 mr6208 commented Dec 30, 2025

✨ 변경 사항


✅ 테스트


  • 수동 테스트 완료
  • 테스트 코드 완료

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 에이전트용 성공 내역 목록 조회 API가 추가되었습니다.
    • 성공 내역 조회에 페이징·정렬 옵션과 기본 정렬 필드가 도입되었습니다.
    • 성공 내역의 리뷰 상태(미작성/작성) 및 관련 응답 필드가 제공됩니다.
    • 양식 승인 시 성공 내역 생성 이벤트가 발행되어 백그라운드로 기록됩니다.
  • 버그 수정

    • 양식 수락 관련 오류 메시지가 개선되었습니다.
    • 성공 내역 페이지 크기 검증이 강화되었습니다.

✏️ Tip: You can customize this high-level summary in your review settings.

@mr6208 mr6208 self-assigned this Dec 30, 2025
@mr6208 mr6208 added the feat 새로운 기능 추가 (Feature) label Dec 30, 2025
@coderabbitai
Copy link

coderabbitai bot commented Dec 30, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'ignored_branch'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • 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

Walkthrough

이 PR은 SuccessHistory 도메인(엔티티, 리포지토리, 마이그레이션), 관련 서비스/이벤트 핸들러 및 API(조회 엔드포인트)를 추가하고, fulfillmentform 관련 클래스들의 패키지 재구성을 수행합니다.

Changes

Cohort / File(s) Summary
API Controller & Docs
ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java, .../SuccessHistoryControllerDocs.java
성공내역 조회 GET 엔드포인트(/api/success-history/{agent-id}) 추가 및 API 문서 인터페이스 추가.
Domain Entity & Migration
ticketmate-fulfillmentform/src/main/java/.../infrastructure/entity/SuccessHistory.java, ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql, ticketmate-api/src/main/java/.../schema/HibernateDdlGenerator.java
SuccessHistory JPA 엔티티 추가, Flyway 마이그레이션 추가 및 DDL 생성기에 엔티티 등록.
Repository & Projection
.../infrastructure/repository/successhistory/SuccessHistoryRepository.java, .../SuccessHistoryRow.java
SuccessHistoryRepository 추가(존재 확인 메서드, 커스텀 JPQL로 목록 조회) 및 프로젝션 인터페이스 추가.
Service, Event Handler, Mapper
.../application/service/successhistory/SuccessHistoryService.java, .../SuccessHistoryEventHandler.java, .../mapper/successhistory/SuccessHistoryMapper.java, .../SuccessHistoryMapperImpl.java
생성(트랜잭션 REQUIRES_NEW), 목록 조회(페이징/검증), 이벤트리스너로 자동 생성, 매핑 구현(썸네일 URL 변환).
DTOs & Constants for SuccessHistory
.../dto/successhistory/request/SuccessHistoryFilteredRequest.java, .../response/SuccessHistoryResponse.java, .../core/constant/successhistory/SuccessHistorySortField.java, SuccessHistoryStatus.java
필터/페이징 DTO, 응답 DTO, 정렬 필드 enum, 상태 enum 추가(검증 어노테이션 포함).
FulfillmentForm: 이벤트 발행 및 검증
ticketmate-fulfillmentform/src/main/java/.../application/service/fulfillmentform/FulfillmentFormService.java, ticketmate-common/src/main/java/.../event/fulfillmentform/FulfillmentFormEvent.java
acceptFulfillmentForm에서 ApplicationEventPublisher 주입 후 FulfillmentFormEvent 발행 및 이미 수락된 양식 재수락 방지 로직 추가. FulfillmentFormEvent 레코드 추가.
패키지/임포트 재구성 (FulfillmentForm 관련)
여러 파일 under ticketmate-fulfillmentform/src/main/java/... and ticketmate-api/src/main/java/..., ticketmate-review/src/main/java/...
DTO/서비스/리포지토리/매퍼/상수들의 패키지 계층을 세분화(fulfillmentform, successhistory 등)하고 관련 import 경로를 업데이트.
ErrorCode 변경
ticketmate-common/src/main/java/com/ticketmate/backend/common/application/exception/ErrorCode.java
기존 메시지 일부 수정 및 성공내역 페이징 관련 에러코드 2개 추가(SUCCESS_HISTORY_PAGE_SIZE_TOO_LARGE/TOO_SMALL).
빌드 설정 (무순 변화)
settings.gradle
ticketmate-fulfillmentform 모듈 include 제거 후 동일 항목 재추가(실질적 변경 없음).

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Client
    participant FulfillmentFormService
    participant EventPublisher as EventPub
    participant SuccessHistoryEventHandler as EventHandler
    participant SuccessHistoryService as SHService
    participant Repo as SuccessHistoryRepo
    participant EM as EntityManager

    Client->>FulfillmentFormService: acceptFulfillmentForm(fulfillmentId)
    FulfillmentFormService->>FulfillmentFormService: set status -> ACCEPTED
    alt already accepted
        FulfillmentFormService-->>Client: throw CustomException(FULFILLMENT_FORM_ALREADY_ACCEPTED)
    else now accepted
        FulfillmentFormService->>EventPub: publish(FulfillmentFormEvent(fulfillmentId))
        EventPub->>EventHandler: onEvent(event)
        EventHandler->>SHService: createSuccessHistory(fulfillmentId)
        SHService->>Repo: existsByFulfillmentForm_FulfillmentFormId(fulfillmentId)
        alt exists
            Repo-->>SHService: true (skip)
        else not exists
            SHService->>EM: getReference(FulfillmentForm)
            SHService->>Repo: save(new SuccessHistory(...))
        end
        SHService-->>EventHandler: done
        EventHandler-->>EventPub: ack
        FulfillmentFormService-->>Client: ResponseEntity.ok()
    end
Loading
sequenceDiagram
    autonumber
    participant Client
    participant SuccessHistoryController as Controller
    participant SHService as SuccessHistoryService
    participant MemberService
    participant Repo as SuccessHistoryRepo
    participant Mapper as SuccessHistoryMapper
    participant Storage as StorageService

    Client->>Controller: GET /api/success-history/{agent-id}?...
    Controller->>SHService: getSuccessHistoryList(agentId, request)
    SHService->>MemberService: getMemberById(agentId)
    SHService->>SHService: verify member type == AGENT
    SHService->>Repo: findSuccessHistoryList(agentId, pageable)
    Repo-->>SHService: Slice<SuccessHistoryRow>
    loop map rows
        SHService->>Mapper: toSuccessHistoryResponse(row)
        Mapper->>Storage: getFilePublicUrl(storedPath)
        Storage-->>Mapper: publicUrl
        Mapper-->>SHService: SuccessHistoryResponse
    end
    SHService-->>Controller: Slice<SuccessHistoryResponse>
    Controller-->>Client: 200 OK (slice)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~55 minutes

Possibly related PRs

  • Test #645: ErrorCode enum 변경과 관련된 PR — 동일한 ErrorCode 파일을 수정합니다.
  • 20250616 #308 api 변경 이력 로그 기능 추가 #310: API 문서화(여기선 ApiChangeLogs/ApiChangeLog 사용) 관련 변경과 연관될 가능성이 높습니다.
  • Test #503: Flyway 및 마이그레이션 설정/의존성 추가와 관련 있어 이번 마이그레이션과 코드 레벨로 연결됩니다.

Poem

🐰 수락하면 폼이 휙, 이벤트가 톡,
성공내역 톡쏘듯 새로 생기네.
패키지 정리하고 길 닦으니,
에이전트가 조회해 반짝 웃음,
당근 한 입 축하 파티! 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 31.03% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 PR의 주요 변경사항을 명확하게 설명합니다. 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가라는 핵심 기능을 직관적으로 전달합니다.
✨ Finishing touches
  • 📝 Generate docstrings

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@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: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormService.java (1)

274-283: 심각한 로직 오류: 상태 체크가 상태 변경 후에 수행됩니다.

Line 276에서 상태를 ACCEPTED_FULFILLMENT_FORM으로 먼저 설정한 후, Line 279-282에서 상태가 ACCEPTED_FULFILLMENT_FORM인지 확인합니다. 이 로직은 항상 예외를 발생시켜 수락 기능이 완전히 동작하지 않습니다.

상태 검증은 상태 변경 이전에 수행되어야 합니다.

🔎 수정 제안
       case ACCEPTED_FULFILLMENT_FORM -> {
-        fulfillmentForm.setFulfillmentFormStatus(FulfillmentFormStatus.ACCEPTED_FULFILLMENT_FORM);
-        log.debug("의뢰인 성공양식 수락감지. 현재 상태 : {}", fulfillmentForm.getFulfillmentFormStatus());
-
         if (fulfillmentForm.getFulfillmentFormStatus() == ACCEPTED_FULFILLMENT_FORM) {
           log.error("이미 수락된 성공양식입니다.");
           throw new CustomException(ErrorCode.FULFILLMENT_FORM_ALREADY_ACCEPTED);
         }
+        
+        fulfillmentForm.setFulfillmentFormStatus(FulfillmentFormStatus.ACCEPTED_FULFILLMENT_FORM);
+        log.debug("의뢰인 성공양식 수락감지. 현재 상태 : {}", fulfillmentForm.getFulfillmentFormStatus());
       }
🧹 Nitpick comments (7)
ticketmate-successhistory/build.gradle (1)

25-27: 사소한 오타: "MapStructure" → "MapStruct"

주석에 오타가 있습니다.

🔎 수정 제안
-    // MapStructure
+    // MapStruct
ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql (2)

1-17: 조회 성능을 위한 인덱스 추가 고려

성공 내역 조회 시 created_date 기준 정렬 및 success_history_status 필터링이 예상됩니다. 페이지네이션 쿼리 성능 최적화를 위해 인덱스 추가를 고려해 주세요.

🔎 인덱스 추가 제안
-- 생성일 기준 정렬을 위한 인덱스
CREATE INDEX idx_success_history_created_date ON public.success_history(created_date DESC);

-- 상태 필터링을 위한 인덱스 (선택적)
CREATE INDEX idx_success_history_status ON public.success_history(success_history_status);

3-4: FK 컬럼명 개선 고려

fulfillment_form_fulfillment_form_id는 JPA 기본 명명 규칙으로 인해 다소 장황합니다. 엔티티에서 @JoinColumn(name = "fulfillment_form_id")를 명시적으로 지정하면 더 간결한 스키마를 가질 수 있습니다.

ticketmate-common/src/main/java/com/ticketmate/backend/common/core/event/fulfillmentform/FulfillmentFormEvent.java (1)

1-7: LGTM!

이벤트 레코드가 간결하고 목적에 맞게 설계되었습니다. common 모듈에 위치하여 fulfillmentformsuccesshistory 모듈 간의 의존성을 적절히 분리했습니다.

선택적으로, 이벤트가 언제 발행되는지 설명하는 Javadoc 주석을 추가하면 유지보수에 도움이 됩니다.

🔎 Javadoc 추가 제안
 package com.ticketmate.backend.common.core.event.fulfillmentform;
 
 import java.util.UUID;
 
+/**
+ * 성공양식이 수락되었을 때 발행되는 이벤트.
+ * SuccessHistoryEventHandler에서 처리하여 성공내역을 생성합니다.
+ */
 public record FulfillmentFormEvent(UUID fulfillmentFormId) {
 
 }
ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/service/SuccessHistoryEventHandler.java (1)

17-20: 이벤트 핸들러에 에러 처리 추가를 권장합니다.

AFTER_COMMIT 단계에서 예외가 발생하면 조용히 실패합니다. 성공내역 생성 실패 시 운영 가시성을 위해 로깅을 추가하는 것이 좋습니다.

🔎 수정 제안
   @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
   public void createSuccessHistoryForEvent(FulfillmentFormEvent event) {
-    successHistoryService.createSuccessHistory(event.fulfillmentFormId());
+    try {
+      successHistoryService.createSuccessHistory(event.fulfillmentFormId());
+    } catch (Exception e) {
+      log.error("성공내역 생성 실패. fulfillmentFormId: {}", event.fulfillmentFormId(), e);
+      // 성공내역 생성 실패가 메인 흐름에 영향을 주지 않도록 예외를 삼킴
+    }
+  }
ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/dto/request/SuccessHistoryFilteredRequest.java (1)

19-46: Builder 사용 시 기본값이 적용되지 않을 수 있음

@Builder@AllArgsConstructor를 함께 사용할 경우, Builder로 객체를 생성할 때 기본값이 적용되지 않습니다. 기본 생성자의 초기값은 new SuccessHistoryFilteredRequest()로 생성할 때만 적용됩니다.

🔎 Builder 기본값 적용 방법

@Builder.Default를 사용하여 Builder에서도 기본값이 적용되도록 수정하세요:

 @Getter
 @Setter
 @Builder
 @AllArgsConstructor
+@NoArgsConstructor
 public class SuccessHistoryFilteredRequest {

   @Min(value = 1)
   @MinErrorCode(ErrorCode.PAGE_NUMBER_TOO_SMALL)
   @Max(value = Integer.MAX_VALUE)
   @MaxErrorCode(ErrorCode.PAGE_NUMBER_TOO_LARGE)
+  @Builder.Default
-  private Integer pageNumber;
+  private Integer pageNumber = 1;

   @Min(PageableConstants.DEFAULT_PAGE_SIZE)
   @MinErrorCode(ErrorCode.CHAT_MESSAGE_PAGE_SIZE_TOO_SMALL)
   @Max(value = PageableConstants.MAX_PAGE_SIZE)
   @MaxErrorCode(ErrorCode.CHAT_MESSAGE_PAGE_SIZE_TOO_LARGE)
+  @Builder.Default
-  private Integer pageSize;
+  private Integer pageSize = PageableConstants.DEFAULT_PAGE_SIZE;

+  @Builder.Default
-  private SuccessHistorySortField sortField;
+  private SuccessHistorySortField sortField = SuccessHistorySortField.CREATED_DATE;

+  @Builder.Default
-  private Sort.Direction sortDirection;
+  private Sort.Direction sortDirection = Direction.DESC;

-  public SuccessHistoryFilteredRequest() {
-    this.pageNumber = 1;
-    this.pageSize = PageableConstants.DEFAULT_PAGE_SIZE;
-    this.sortField = SuccessHistorySortField.CREATED_DATE;
-    this.sortDirection = Direction.DESC;
-  }
ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java (1)

33-33: 경로 변수 선언에 슬래시 누락

@GetMapping 경로에 선행 슬래시가 없습니다. Spring에서는 동작하지만, 일관성을 위해 "/{agent-id}"로 수정하는 것을 권장합니다.

🔎 제안된 수정 사항
- @GetMapping("{agent-id}")
+ @GetMapping("/{agent-id}")
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 79cd454 and f5ebfe6.

📒 Files selected for processing (22)
  • settings.gradle
  • ticketmate-api/build.gradle
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryControllerDocs.java
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/schema/HibernateDdlGenerator.java
  • ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql
  • ticketmate-common/src/main/java/com/ticketmate/backend/common/application/exception/ErrorCode.java
  • ticketmate-common/src/main/java/com/ticketmate/backend/common/core/event/fulfillmentform/FulfillmentFormEvent.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormService.java
  • ticketmate-successhistory/build.gradle
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/dto/request/SuccessHistoryFilteredRequest.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/dto/response/SuccessHistoryResponse.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/mapper/SuccessHistoryMapper.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/mapper/SuccessHistoryMapperImpl.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/service/SuccessHistoryEventHandler.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/service/SuccessHistoryService.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/core/constants/SuccessHistorySortField.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/core/constants/SuccessHistoryStatus.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/infrastructure/entity/SuccessHistory.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/infrastructure/repository/SuccessHistoryRepository.java
  • ticketmate-successhistory/src/main/java/com/ticketmate/backend/infrastructure/repository/SuccessHistoryRow.java
  • ticketmate-successhistory/src/test/java/com/ticketmate/backend/TicketmateSuccesshistoryApplicationTests.java
🧰 Additional context used
🧬 Code graph analysis (2)
ticketmate-successhistory/src/main/java/com/ticketmate/backend/core/constants/SuccessHistorySortField.java (1)
ticketmate-common/src/main/java/com/ticketmate/backend/common/core/util/CommonUtil.java (1)
  • CommonUtil (17-163)
ticketmate-successhistory/src/test/java/com/ticketmate/backend/TicketmateSuccesshistoryApplicationTests.java (2)
ticketmate-api/src/test/java/com/ticketmate/backend/api/TicketmateApiApplicationTests.java (1)
  • TicketmateApiApplicationTests (6-13)
ticketmate-ai/src/test/java/com/ticketmate/backend/ai/TicketmateAiApplicationTests.java (1)
  • TicketmateAiApplicationTests (6-13)
⏰ 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). (4)
  • GitHub Check: CodeQL analysis (java)
  • GitHub Check: Agent
  • GitHub Check: schema-verify
  • GitHub Check: build
🔇 Additional comments (16)
ticketmate-successhistory/src/test/java/com/ticketmate/backend/TicketmateSuccesshistoryApplicationTests.java (1)

1-13: LGTM!

다른 모듈(ticketmate-ai, ticketmate-api)의 테스트 구조와 일관성 있게 작성되었습니다. Spring 컨텍스트 로드 테스트는 새 모듈의 기본 설정이 올바른지 확인하는 데 적합합니다.

ticketmate-api/build.gradle (1)

33-33: LGTM!

새 모듈 의존성이 기존 패턴과 일관되게 추가되었습니다.

ticketmate-successhistory/src/main/java/com/ticketmate/backend/infrastructure/repository/SuccessHistoryRow.java (1)

7-24: LGTM!

JPA 인터페이스 기반 프로젝션이 적절하게 구현되었습니다. nullable 필드에 대한 주석도 명확하고, wrapper 타입(UUID, Float)을 사용하여 null 값을 올바르게 처리할 수 있습니다.

ticketmate-common/src/main/java/com/ticketmate/backend/common/application/exception/ErrorCode.java (1)

518-525: LGTM!

새로운 에러 코드들이 기존 패턴과 일관되게 추가되었습니다. 성공 내역 페이지 크기 제한(최소 10개)도 명확하게 정의되어 있습니다.

settings.gradle (1)

29-29: LGTM!

새 모듈이 멀티 프로젝트 빌드 설정에 올바르게 추가되었습니다.

ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/mapper/SuccessHistoryMapper.java (1)

6-9: LGTM!

간결한 매퍼 인터페이스입니다. SuccessHistoryMapperImpl에서 Spring @Component로 구현되어 있어 수동 매핑 패턴을 따르고 있습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormService.java (1)

158-159: 이벤트 발행 패턴은 적절합니다.

FulfillmentFormEvent는 트랜잭션 내에서 발행되고, SuccessHistoryEventHandler에서 AFTER_COMMIT 단계로 수신됩니다. 위의 로직 버그가 수정되면 정상 동작할 것입니다.

ticketmate-api/src/main/java/com/ticketmate/backend/api/application/schema/HibernateDdlGenerator.java (1)

15-15: LGTM!

SuccessHistory 엔티티가 DDL 생성기에 올바르게 등록되었습니다. 기존 엔티티 등록 패턴을 따르고 있습니다.

Also applies to: 129-129

ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/dto/response/SuccessHistoryResponse.java (1)

12-27: LGTM!

깔끔한 DTO 구조입니다. reviewRatingFloat wrapper 타입을 사용하여 리뷰가 없는 경우 null 처리가 가능합니다.

ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/mapper/SuccessHistoryMapperImpl.java (2)

16-32: 매핑 로직이 명확합니다.

reviewId 존재 여부에 따른 상태 결정 로직과 빌더 패턴 사용이 적절합니다. null 처리 이슈 확인 후 문제없을 것으로 보입니다.


24-24: null 처리 확인 완료 - 현재 구현은 안전합니다.

storageService.generatePublicUrl() 메서드는 이미 null 입력을 안전하게 처리합니다. S3Service 구현체(line 106)에서 CommonUtil.nvl(storedPath, "")를 사용하여 null을 검사하고, 빈 값이면 경고 로그를 남긴 후 null을 반환합니다. 따라서 concertThumbnailStoredPath가 null이어도 NPE는 발생하지 않습니다.

Likely an incorrect or invalid review comment.

ticketmate-successhistory/src/main/java/com/ticketmate/backend/core/constants/SuccessHistoryStatus.java (1)

6-14: LGTM!

간결하고 명확한 enum 설계입니다. 두 가지 상태값과 설명이 적절합니다.

ticketmate-successhistory/src/main/java/com/ticketmate/backend/application/service/SuccessHistoryService.java (1)

32-40: LGTM! 멱등성 및 트랜잭션 처리가 적절합니다.

existsByFulfillmentForm_FulfillmentFormId로 중복 생성을 방지하고, REQUIRES_NEW propagation으로 이벤트 핸들러와 독립적인 트랜잭션을 보장합니다. getReference 사용은 이벤트 기반 컨텍스트에서 유효한 ID가 전달되므로 적절합니다.

ticketmate-successhistory/src/main/java/com/ticketmate/backend/core/constants/SuccessHistorySortField.java (1)

8-27: LGTM!

Enum 구현이 SortField 인터페이스를 올바르게 구현하고 있으며, @JsonCreator를 통한 역직렬화 지원과 CommonUtil.stringToSortField 활용이 기존 프로젝트 패턴과 일관성 있게 작성되었습니다.

ticketmate-successhistory/src/main/java/com/ticketmate/backend/infrastructure/entity/SuccessHistory.java (1)

23-48: LGTM!

Entity 설계가 적절합니다. @OneToOne 관계의 FetchType.LAZY 설정, GenerationType.UUID를 통한 UUID 생성, 그리고 create() 정적 팩토리 메서드를 통한 초기 상태 설정이 잘 구현되어 있습니다.

ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java (1)

35-39: 인증된 사용자 정보 미사용 및 권한 검증 부재

customOAuth2User가 주입되지만 사용되지 않습니다. 현재 구현에서는 인증된 모든 사용자가 임의의 agentId에 대한 성공내역을 조회할 수 있습니다.

API 문서에 "대리인/의뢰인 모두 사용 가능"이라고 명시되어 있으므로 의도된 동작일 수 있지만, 본인 또는 관련된 성공내역만 조회할 수 있도록 권한 검증이 필요한지 확인해주세요.

Comment on lines 14 to 23
dependencies {
implementation project(':ticketmate-common')
implementation project(':ticketmate-concert')
implementation project(':ticketmate-member')
implementation project(':ticketmate-notification')
implementation project(':ticketmate-storage')
implementation project(':ticketmate-chat')
implementation project(':ticketmate-applicationform')
implementation project(':ticketmate-fulfillmentform')
implementation project(':ticketmate-review')
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check which declared dependencies are actually used by examining imports

echo "=== ticketmate-successhistory 모듈의 의존성 사용 확인 ==="
echo ""

# 선언된 9개의 의존성 모듈 목록
declare -a modules=(
  "common"
  "concert"
  "member"
  "notification"
  "storage"
  "chat"
  "applicationform"
  "fulfillmentform"
  "review"
)

# 각 모듈별 import 사용 여부 확인
for module in "${modules[@]}"; do
  echo "--- ticketmate-$module 의존성 ---"
  count=$(rg "import com\.ticketmate\.backend\.$module" ticketmate-successhistory/src/main/java/ -c 2>/dev/null | tail -1)
  if [ -z "$count" ] || [ "$count" = "0" ]; then
    echo "❌ 사용되지 않음 (import 없음)"
  else
    echo "✓ 사용됨 ($count개 파일에서 import)"
    # 어느 파일에서 사용되는지 표시
    rg "import com\.ticketmate\.backend\.$module" ticketmate-successhistory/src/main/java/ -l 2>/dev/null | head -3
  fi
  echo ""
done

Repository: Team-TicketMate/ticketmate-server

Length of output: 2193


불필요한 의존성 제거 필요

9개의 선언된 의존성 중 4개가 코드에서 import되지 않고 있습니다: ticketmate-notification, ticketmate-chat, ticketmate-applicationform, ticketmate-review. 이 4개의 의존성을 build.gradle에서 제거하세요.

🤖 Prompt for AI Agents
In ticketmate-successhistory/build.gradle around lines 14 to 23, remove the four
unused project dependencies `:ticketmate-notification`, `:ticketmate-chat`,
`:ticketmate-applicationform`, and `:ticketmate-review` from the dependencies
block; after removing them, keep the remaining project implementations intact,
save the file, and run a quick build or IDE import to ensure no unresolved
imports remain.

Comment on lines +42 to +55
@Transactional(readOnly = true)
public Slice<SuccessHistoryResponse> getSuccessHistoryList(UUID agentId, SuccessHistoryFilteredRequest request) {
Member agent = memberService.findMemberById(agentId);

// 조회객체가 대리인이 정말 맞는지
memberService.validateMemberType(agent, MemberType.AGENT);

// 페이지네이션 객체 생성
Pageable pageable = request.toPageable();

return successHistoryRepository
.findSuccessHistoryList(agentId, pageable)
.map(mapper::toSuccessHistoryResponse);
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

rg -n -A 20 'getSuccessHistoryList' --type java -g '*Controller*.java'

Repository: Team-TicketMate/ticketmate-server

Length of output: 2299


🏁 Script executed:

rg -n -B 5 -A 10 'getSuccessHistoryList' --type java -g '*Service*.java'

Repository: Team-TicketMate/ticketmate-server

Length of output: 2522


🏁 Script executed:

fd -t f -name '*SuccessHistory*' --type f | head -20

Repository: Team-TicketMate/ticketmate-server

Length of output: 307


🏁 Script executed:

cat -n ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java

Repository: Team-TicketMate/ticketmate-server

Length of output: 2125


🏁 Script executed:

rg -B 10 'public ResponseEntity<Slice<SuccessHistoryResponse>> getSuccessHistoryList' ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java

Repository: Team-TicketMate/ticketmate-server

Length of output: 410


인증된 사용자와 대리인 검증이 필요합니다.

customOAuth2User 파라미터가 컨트롤러에서 주입되지만 서비스로 전달되지 않고 있습니다. 현재 로그인한 사용자의 ID가 요청한 agentId와 일치하는지 확인하는 권한 검증 로직을 추가하세요. 그렇지 않으면 모든 인증된 사용자가 임의의 대리인의 성공내역을 조회할 수 있게 됩니다.

Comment on lines +15 to +32
@Query("""
select
ff.fulfillmentFormId as fulfillmentId,
c.concertName as concertName,
c.concertThumbnailStoredPath as concertThumbnailStoredPath,
c.concertType as concertType,
sh.createdDate as createDate,
cl.nickname as clientNickname,
r.reviewId as reviewId,
r.rating as reviewRating
from SuccessHistory sh
join sh.fulfillmentForm ff
join ff.concert c
join ff.client cl
left join Review r on r.fulfillmentForm = ff
where ff.agent.memberId = :agentMemberId
""")
Slice<SuccessHistoryRow> findSuccessHistoryList(@Param("agentMemberId") UUID agentMemberId, Pageable pageable);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

쿼리에서 successHistoryStatus 필드 누락

API 문서에 따르면 응답에 successHistoryStatus 필드가 포함되어야 하지만, 현재 JPQL 쿼리에서 이 필드를 선택하지 않고 있습니다. SuccessHistoryRow projection에도 해당 필드가 필요합니다.

🔎 제안된 수정 사항
  @Query("""
      select
        ff.fulfillmentFormId as fulfillmentId,
        c.concertName as concertName,
        c.concertThumbnailStoredPath as concertThumbnailStoredPath,
        c.concertType as concertType,
        sh.createdDate as createDate,
+       sh.successHistoryStatus as successHistoryStatus,
        cl.nickname as clientNickname,
        r.reviewId as reviewId,
        r.rating as reviewRating
      from SuccessHistory sh
        join sh.fulfillmentForm ff
        join ff.concert c
        join ff.client cl
        left join Review r on r.fulfillmentForm = ff
      where ff.agent.memberId = :agentMemberId
    """)

또한 SuccessHistoryRow interface에도 getter를 추가해야 합니다:

SuccessHistoryStatus getSuccessHistoryStatus();
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@Query("""
select
ff.fulfillmentFormId as fulfillmentId,
c.concertName as concertName,
c.concertThumbnailStoredPath as concertThumbnailStoredPath,
c.concertType as concertType,
sh.createdDate as createDate,
cl.nickname as clientNickname,
r.reviewId as reviewId,
r.rating as reviewRating
from SuccessHistory sh
join sh.fulfillmentForm ff
join ff.concert c
join ff.client cl
left join Review r on r.fulfillmentForm = ff
where ff.agent.memberId = :agentMemberId
""")
Slice<SuccessHistoryRow> findSuccessHistoryList(@Param("agentMemberId") UUID agentMemberId, Pageable pageable);
@Query("""
select
ff.fulfillmentFormId as fulfillmentId,
c.concertName as concertName,
c.concertThumbnailStoredPath as concertThumbnailStoredPath,
c.concertType as concertType,
sh.createdDate as createDate,
sh.successHistoryStatus as successHistoryStatus,
cl.nickname as clientNickname,
r.reviewId as reviewId,
r.rating as reviewRating
from SuccessHistory sh
join sh.fulfillmentForm ff
join ff.concert c
join ff.client cl
left join Review r on r.fulfillmentForm = ff
where ff.agent.memberId = :agentMemberId
""")
Slice<SuccessHistoryRow> findSuccessHistoryList(@Param("agentMemberId") UUID agentMemberId, Pageable pageable);
🤖 Prompt for AI Agents
In
ticketmate-successhistory/src/main/java/com/ticketmate/backend/infrastructure/repository/SuccessHistoryRepository.java
around lines 15 to 32, the JPQL select list omits the
SuccessHistory.successHistoryStatus field required by the API and by the
SuccessHistoryRow projection; update the query to include
sh.successHistoryStatus (aliased to successHistoryStatus) in the select clause
and then add the corresponding getter to the SuccessHistoryRow projection
interface: SuccessHistoryStatus getSuccessHistoryStatus(); Ensure the alias
matches the projection method name.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds functionality to create and retrieve success history records when ticketing fulfillment forms are accepted by clients. A new module ticketmate-successhistory is introduced with event-driven architecture to automatically create success history entries.

Key Changes:

  • Introduces ticketmate-successhistory module with entities, services, and API endpoints for tracking successful ticketing transactions
  • Implements event-based success history creation triggered when fulfillment forms are accepted
  • Adds paginated query endpoint for retrieving agent success histories with review information

Reviewed changes

Copilot reviewed 22 out of 22 changed files in this pull request and generated 15 comments.

Show a summary per file
File Description
settings.gradle Adds ticketmate-successhistory module to the build
ticketmate-successhistory/build.gradle Configures dependencies for the new success history module
ticketmate-api/build.gradle Adds ticketmate-successhistory module dependency to API module
V20251220_114830__create_success_history_table.sql Creates success_history table with foreign key to fulfillment_form
SuccessHistory.java Defines entity for success history with status tracking
SuccessHistoryStatus.java Enum defining NOT_REVIEWED and REVIEWED states
SuccessHistorySortField.java Enum for sorting success history results by creation date
SuccessHistoryRepository.java Repository with custom query joining fulfillment forms, concerts, clients, and reviews
SuccessHistoryRow.java Projection interface for query results
SuccessHistoryService.java Service handling creation and retrieval with REQUIRES_NEW transaction propagation
SuccessHistoryEventHandler.java Event listener responding to fulfillment form acceptance events
SuccessHistoryMapper.java Interface for mapping database rows to response DTOs
SuccessHistoryMapperImpl.java Implementation that determines review status and generates storage URLs
SuccessHistoryFilteredRequest.java DTO for pagination and sorting parameters
SuccessHistoryResponse.java Response DTO containing success history details with review information
SuccessHistoryController.java REST controller exposing GET endpoint for retrieving success histories
SuccessHistoryControllerDocs.java Swagger documentation for the API endpoint
FulfillmentFormEvent.java Event record published when fulfillment forms are accepted
FulfillmentFormService.java Modified to publish events on acceptance and contains logic bug in validation
ErrorCode.java Adds error codes for success history page size validation
HibernateDdlGenerator.java Registers SuccessHistory entity and reformats code
TicketmateSuccesshistoryApplicationTests.java Basic Spring Boot test for module context loading

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 33 to 40
@GetMapping("{agent-id}")
@LogMonitoring
public ResponseEntity<Slice<SuccessHistoryResponse>> getSuccessHistoryList(
@AuthenticationPrincipal CustomOAuth2User customOAuth2User,
@PathVariable(value = "agent-id") UUID agentId,
@ParameterObject @Valid SuccessHistoryFilteredRequest request) {
return ResponseEntity.ok(successHistoryService.getSuccessHistoryList(agentId, request));
}
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

The method name "getSuccessHistoryList" follows the established naming convention in the codebase for retrieval endpoints that return collections. However, the endpoint path uses "{agent-id}" which makes the API semantically confusing - it appears to retrieve a single success history for an agent, but actually returns a list. Consider using a path like "/agent/{agent-id}" or a query parameter approach to make the intent clearer that this retrieves a list of success histories for the specified agent.

Copilot uses AI. Check for mistakes.
join ff.concert c
join ff.client cl
left join Review r on r.fulfillmentForm = ff
where ff.agent.memberId = :agentMemberId
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

The query does not include an ORDER BY clause in the JPQL. While the Pageable parameter provides sorting information, explicit ordering in JPQL is more reliable and clearer. Consider adding "order by sh.createdDate desc" to match the default sort behavior defined in SuccessHistoryFilteredRequest, or ensure that Spring Data JPA properly applies the Pageable sort to this custom query.

Suggested change
where ff.agent.memberId = :agentMemberId
where ff.agent.memberId = :agentMemberId
order by sh.createdDate desc

Copilot uses AI. Check for mistakes.
private final MemberService memberService;
private final SuccessHistoryMapper mapper;

@Transactional(propagation = Propagation.REQUIRES_NEW)
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

Using REQUIRES_NEW propagation can lead to subtle issues. If the parent transaction (that published the event) rolls back after this method commits, the success history will still exist in the database even though the fulfillment form acceptance was rolled back. Consider using the default REQUIRED propagation and relying on the existsByFulfillmentForm check for idempotency, or handle this scenario explicitly in your business logic.

Copilot uses AI. Check for mistakes.
return;
}

FulfillmentForm fulfillmentForm = entityManager.getReference(FulfillmentForm.class, fulfillmentFormId);
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

Using EntityManager.getReference creates a lazy proxy without database validation. If the fulfillmentFormId doesn't exist, the error won't occur until the entity is accessed, not during save. Since there's already an existsByFulfillmentForm check preventing duplicates, consider whether you need explicit validation that the FulfillmentForm exists, or if relying on foreign key constraints is sufficient for your use case.

Suggested change
FulfillmentForm fulfillmentForm = entityManager.getReference(FulfillmentForm.class, fulfillmentFormId);
FulfillmentForm fulfillmentForm = entityManager.find(FulfillmentForm.class, fulfillmentFormId);
if (fulfillmentForm == null) {
log.warn("FulfillmentForm not found for id: {}", fulfillmentFormId);
return;
}

Copilot uses AI. Check for mistakes.
@@ -152,6 +155,8 @@ public void acceptFulfillmentForm(Member member, UUID fulfillmentFormId) {

validateFulfillmentFormMember(member, fulfillmentForm, MemberType.CLIENT);

eventPublisher.publishEvent(new FulfillmentFormEvent(fulfillmentFormId));
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

Potential race condition with AFTER_COMMIT event handling. The event is published at line 158 before the transaction commits. If two concurrent requests try to accept the same fulfillment form, both might pass validation, publish events, and the event handler could attempt to create success histories twice. While there's an existence check in createSuccessHistory, consider whether the event should be published AFTER the status change is persisted, or add a unique constraint on the database level for fulfillment_form_fulfillment_form_id.

Copilot uses AI. Check for mistakes.
Comment on lines +3 to +4
fulfillment_form_fulfillment_form_id UUID NOT NULL REFERENCES fulfillment_form
CONSTRAINT uk_success_history_fulfillment_form UNIQUE,
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

The unique constraint on fulfillment_form_fulfillment_form_id is defined correctly and will prevent duplicate success history records at the database level. However, this constraint is labeled as "uk_success_history_fulfillment_form" but the actual constraint name created will likely be different. Consider explicitly naming the constraint with CONSTRAINT in the UNIQUE clause rather than inline to ensure consistency across environments.

Copilot uses AI. Check for mistakes.
Comment on lines +35 to +40
public ResponseEntity<Slice<SuccessHistoryResponse>> getSuccessHistoryList(
@AuthenticationPrincipal CustomOAuth2User customOAuth2User,
@PathVariable(value = "agent-id") UUID agentId,
@ParameterObject @Valid SuccessHistoryFilteredRequest request) {
return ResponseEntity.ok(successHistoryService.getSuccessHistoryList(agentId, request));
}
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

Missing authorization check for the authenticated user. The endpoint accepts an agentId path parameter but doesn't verify that the authenticated user (customOAuth2User) has permission to view this agent's success history. Any authenticated user can view any agent's success history by providing their ID. Add a check to ensure the authenticated user is either the agent themselves, an admin, or has appropriate permissions.

Copilot uses AI. Check for mistakes.
- **successHistoryStatus** : 성공내역 상태 [NOT_REVIEWED,REVIEWED]
- **reviewId** : 리뷰의 ID
- **reviewRating** : 리뷰의 평점
- **clientNickname** : 의뢰인의 ID
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

Inconsistent naming in the field comment. The comment says "의뢰인의 ID" (client's ID) but the field is named "clientNickname" and returns a String nickname, not a UUID ID. The comment should be "의뢰인의 닉네임" (client's nickname) to match the field name and type.

Suggested change
- **clientNickname** : 의뢰인의 ID
- **clientNickname** : 의뢰인의 닉네임

Copilot uses AI. Check for mistakes.
private final SuccessHistoryService successHistoryService;

@Override
@GetMapping("{agent-id}")
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

Path variable naming is inconsistent with the established codebase convention. Throughout the codebase, path variables use kebab-case consistently (e.g., "concert-id", "fulfillment-form-id", "chat-room-id"). However, this endpoint uses "agent-id" which follows the convention. The GetMapping path should be "/{agent-id}" instead of "{agent-id}" (missing leading slash) for consistency with other endpoints.

Suggested change
@GetMapping("{agent-id}")
@GetMapping("/{agent-id}")

Copilot uses AI. Check for mistakes.
Copy link
Contributor

Choose a reason for hiding this comment

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

@mr6208 이거 확인 부탁드려용

Comment on lines 19 to 56
description = "대리인 성공내역 조회 기능 개발",
issueUrl = "https://github.com/Team-TicketMate/ticketmate-server/issues/646"
)
})
@Operation(
summary = "성공내역 조회",
description = """
인증된 사용자 한정 자유롭게 성공내역을 조회하는 기능입니다.
### 요청 파라미터
- **agent-id (String)** : 조회할 대리인 ID [필수]
- [SuccessHistoryFilteredRequest]
- **pageNumber (int)** : 요청할 페이지 번호 [필수X]
- **pageSize (int)** : 요청할 페이지 사이즈 [필수X]
- **sortField (String)** : 정렬 필드 [필수X]
- **sortDirection (String)** : 정렬 방향 [필수X]
### 요청값
- `rejectedMemo`(String) : 거절사유[필수X]
### 반환값 [LIST]
- **fulfillmentId** : 성공한 성공양식 ID
- **concertName** : 성공한 콘서트명
- **concertThumbnailUrl** : 콘서트 썸네일 이미지
- **concertType** : 공연 타입
- **createDate** : 생성 시간(성공한 시간이라고 봐도 됩니다)
- **successHistoryStatus** : 성공내역 상태 [NOT_REVIEWED,REVIEWED]
- **reviewId** : 리뷰의 ID
- **reviewRating** : 리뷰의 평점
- **clientNickname** : 의뢰인의 ID
### 유의 사항
- 성공내역 조회는 대리인/의뢰인 모두 사용 가능합니다.
- 성공내역은 성공양식 수락시 자동으로 생성됩니다.
- 성공내역의 상태는 [NOT_REVIEWED, REVIEWED] 두가지 입니다.
- NOT_REVIEWED 상태일시 리뷰 ID값 및 리뷰 평점은 모두 null값을 반환합니다. 반대로 REVIEWED 상태일시 모두 정상적으로 반환합니다.
"""
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

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

Documentation contains incorrect information. The description states "대리인 성공내역 조회 기능" (agent success history retrieval) and line 52 says "성공내역 조회는 대리인/의뢰인 모두 사용 가능합니다" (both agents and clients can use this), but the actual implementation at SuccessHistoryService.java line 47 validates that the query object must be an AGENT. Either the documentation should be corrected to state this is agent-only, or the implementation should support both member types.

Copilot uses AI. Check for mistakes.
Copy link
Contributor

@Yooonjeong Yooonjeong left a comment

Choose a reason for hiding this comment

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

고생하셨습니다 !~

private final SuccessHistoryService successHistoryService;

@Override
@GetMapping("{agent-id}")
Copy link
Contributor

Choose a reason for hiding this comment

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

@mr6208 이거 확인 부탁드려용

join ff.concert c
join ff.client cl
left join Review r on r.fulfillmentForm = ff
where ff.agent.memberId = :agentMemberId
Copy link
Contributor

Choose a reason for hiding this comment

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

이 부분 QueryDSL 말고 JPQL로 짜신 이유 있으신가용 ??

Copy link
Contributor Author

Choose a reason for hiding this comment

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

동적조건문이 거의 없고 쿼리 자체가 단순해서 JPQL로 설계했습니당

@@ -152,6 +155,8 @@ public void acceptFulfillmentForm(Member member, UUID fulfillmentFormId) {

validateFulfillmentFormMember(member, fulfillmentForm, MemberType.CLIENT);

eventPublisher.publishEvent(new FulfillmentFormEvent(fulfillmentFormId));
Copy link
Contributor

Choose a reason for hiding this comment

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

이벤트리스너랑 REQUIRES_NEW로 트랜잭션을 분리했을 때 성공양식은 성공하고 성공내역은 실패하는 경우가 극히 드물 것 같아서 지금 설계도 좋지만
화면에서 성공내역으로 조회하고 리뷰도 그 페이지에 연결되다 보니 불일치 발생 가능성 없게 한 트랜잭션으로 묶는 것도 괜찮아 보이긴 하네요..!!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

말씀해주신게 더 괜찮아보이네용

Copy link

@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: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormImgService.java (1)

177-182: 잘못된 에러 코드 사용

성공양식 이미지 개수 검증에서 INVALID_PORTFOLIO_IMG_COUNT 에러 코드를 사용하고 있습니다. Line 170에서 사용하는 INVALID_FULFILLMENT_FORM_IMG_COUNT가 올바른 에러 코드입니다.

🔎 에러 코드 수정
   private void validateFulfillmentFormImgCount(List<MultipartFile> imgList) {
     if (imgList.size() > FULFILLMENT_IMG_MAX_COUNT) {
       log.error("성공양식 이미지 첨부파일은 최대 6개까지 등록 가능합니다. 요청개수: {}", imgList.size());
-      throw new CustomException(ErrorCode.INVALID_PORTFOLIO_IMG_COUNT);
+      throw new CustomException(ErrorCode.INVALID_FULFILLMENT_FORM_IMG_COUNT);
     }
   }
♻️ Duplicate comments (4)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java (2)

32-40: REQUIRES_NEW 트랜잭션과 getReference 사용에 대한 검토 필요

이전 리뷰에서 지적된 사항들이 있습니다:

  1. REQUIRES_NEW를 사용하면 부모 트랜잭션이 롤백되어도 성공내역이 남을 수 있습니다.
  2. getReference는 지연 프록시를 생성하여 존재하지 않는 ID에 대한 오류가 즉시 발생하지 않습니다.

현재 구현에서 existsBy 체크가 멱등성을 보장하지만, 이벤트 기반 아키텍처에서 부모 트랜잭션 롤백 시나리오를 명시적으로 처리하는 것이 좋습니다.


42-55: 인증된 사용자와 요청 대상 검증이 필요합니다.

현재 로직에서는 agentId 파라미터로 전달받은 대리인의 성공내역을 조회하지만, 인증된 사용자(customOAuth2User)가 해당 대리인 본인인지 또는 접근 권한이 있는지 검증하지 않습니다. 이로 인해 모든 인증된 사용자가 임의의 대리인 성공내역을 조회할 수 있는 보안 취약점이 있습니다.

ReviewService의 패턴을 참고하여 권한 검증 로직을 추가하세요.

ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java (1)

35-40: 인증 정보가 서비스로 전달되지 않습니다.

customOAuth2User가 주입되지만 서비스 메서드로 전달되지 않아, 인증된 사용자가 요청한 agentId에 대한 접근 권한이 있는지 검증할 수 없습니다. 이는 IDOR(Insecure Direct Object Reference) 취약점으로 이어질 수 있습니다.

FulfillmentFormController의 패턴을 참고하여 인증 정보를 서비스에 전달하세요:

🔎 권장 수정안
  public ResponseEntity<Slice<SuccessHistoryResponse>> getSuccessHistoryList(
    @AuthenticationPrincipal CustomOAuth2User customOAuth2User,
    @PathVariable(value = "agent-id") UUID agentId,
    @ParameterObject @Valid SuccessHistoryFilteredRequest request) {
-   return ResponseEntity.ok(successHistoryService.getSuccessHistoryList(agentId, request));
+   return ResponseEntity.ok(successHistoryService.getSuccessHistoryList(customOAuth2User.getMember(), agentId, request));
  }
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java (1)

158-159: 이벤트 발행 타이밍에 대한 기존 논의 확인 필요.

이전 리뷰에서 이벤트 발행 시점과 트랜잭션 분리에 대한 논의가 있었습니다. 현재 구현에서는 트랜잭션 커밋 전에 이벤트가 발행되며, SuccessHistory 생성이 별도 트랜잭션(REQUIRES_NEW)으로 처리될 경우 데이터 불일치 가능성이 있습니다. SuccessHistory 엔티티의 fulfillmentForm 필드에 유니크 제약조건을 추가하면 DB 레벨에서 중복 생성을 방지할 수 있습니다.

🧹 Nitpick comments (2)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRepository.java (1)

15-32: 쿼리에 명시적 ORDER BY 절 추가를 권장합니다.

Pageable의 정렬 정보가 커스텀 JPQL 쿼리에 자동으로 적용되지만, 명시적인 ORDER BY 절을 추가하면 의도가 더 명확해지고 쿼리의 동작을 더 직관적으로 파악할 수 있습니다. 현재는 기본값으로 createdDate DESC로 정렬되고 있습니다.

또한, SuccessHistoryStatusSuccessHistoryMapperImpl에서 reviewId 존재 여부를 통해 도출되는 것으로 확인되었으므로 (reviewed = reviewId != null일 때 REVIEWED, 아니면 NOT_REVIEWED), 쿼리 프로젝션에 포함시킬 필요가 없습니다. 이 설계는 의도된 것이 맞습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/SuccessHistory.java (1)

34-36: fulfillmentForm 필드에 유니크 제약조건 추가를 권장합니다.

OneToOne 관계이므로 FulfillmentForm당 하나의 SuccessHistory만 존재해야 합니다. 데이터베이스 수준에서 중복 방지를 위해 @JoinColumnunique = true를 추가하는 것이 좋습니다. 이전 리뷰에서 언급된 동시성 이슈에 대한 추가적인 안전장치가 됩니다.

🔎 제안 수정
  @OneToOne(fetch = FetchType.LAZY, optional = false)
- @JoinColumn(nullable = false)
+ @JoinColumn(nullable = false, unique = true)
  private FulfillmentForm fulfillmentForm;
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f5ebfe6 and 49d8cb0.

📒 Files selected for processing (33)
  • settings.gradle
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormController.java
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormControllerDocs.java
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryControllerDocs.java
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/schema/HibernateDdlGenerator.java
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/service/EnterChatRoomService.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormInfoRequest.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormRejectRequest.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormUpdateRequest.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormImgResponse.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormInfoResponse.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/request/SuccessHistoryFilteredRequest.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/response/SuccessHistoryResponse.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapper.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapperImpl.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapper.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapperImpl.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormImgService.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryEventHandler.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/fulfillmentform/FulfillmentFormStatus.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistorySortField.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistoryStatus.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/constant/FulfillmentFormConstants.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/FulfillmentForm.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/SuccessHistory.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormImgRepository.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormRepository.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRepository.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRow.java
  • ticketmate-review/src/main/java/com/ticketmate/backend/review/application/service/ReviewService.java
✅ Files skipped from review due to trivial changes (2)
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormControllerDocs.java
  • settings.gradle
🚧 Files skipped from review as they are similar to previous changes (2)
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryControllerDocs.java
  • ticketmate-api/src/main/java/com/ticketmate/backend/api/application/schema/HibernateDdlGenerator.java
🧰 Additional context used
🧬 Code graph analysis (5)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java (1)
ticketmate-review/src/main/java/com/ticketmate/backend/review/application/service/ReviewService.java (1)
  • Slf4j (44-300)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistoryStatus.java (1)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/response/SuccessHistoryResponse.java (1)
  • Getter (12-27)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/SuccessHistory.java (3)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/FulfillmentForm.java (1)
  • Entity (35-107)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/request/SuccessHistoryFilteredRequest.java (1)
  • Getter (19-57)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/response/SuccessHistoryResponse.java (1)
  • Getter (12-27)
ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java (1)
ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormController.java (1)
  • RestController (26-91)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapperImpl.java (1)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapperImpl.java (1)
  • Component (15-45)
⏰ 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). (2)
  • GitHub Check: schema-verify
  • GitHub Check: build
🔇 Additional comments (26)
ticketmate-api/src/main/java/com/ticketmate/backend/api/application/service/EnterChatRoomService.java (1)

13-13: FulfillmentFormRepository import 경로 올바르게 업데이트됨

패키지 재구성에 따른 import 경로 변경이 올바르게 적용되었습니다. 새로운 패키지 구조(com.ticketmate.backend.fulfillmentform.infrastructure.repository.fulfillmentform.FulfillmentFormRepository)로 일관되게 업데이트되었으며, 이전 import 경로는 codebase에서 완전히 제거되었습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormImgResponse.java (1)

1-1: 패키지 이동 확인 완료

패키지 구조 개선으로 DTO를 더 명확한 계층 구조로 재구성했습니다. 검증 결과 코드베이스의 모든 import가 새 패키지 경로로 올바르게 업데이트되었습니다:

  • 구 패키지 경로 import: 없음 ✓
  • FulfillmentFormMapperImpl.java: 새 경로로 올바르게 import ✓
  • FulfillmentFormInfoResponse.java: 동일 패키지 내 위치하여 명시적 import 불필요 ✓

패키지 리팩토링이 완벽하게 완료되었습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormRepository.java (1)

1-1: 패키지 구조 개선 확인됨

fulfillmentform 하위 패키지로의 리팩토링이 적절하게 수행되었습니다. 인터페이스 정의 및 메서드 시그니처는 변경되지 않았으며, 네임스페이스 변경만 이루어졌습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormUpdateRequest.java (1)

1-1: 패키지 재구성 완료

DTO가 fulfillmentform.request 하위 패키지로 적절히 이동되었습니다. 클래스 본문 및 필드 정의는 변경되지 않았습니다.

ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormController.java (1)

5-9: 임포트 경로 업데이트 확인

FulfillmentForm 관련 DTO와 서비스의 임포트 경로가 새로운 패키지 구조에 맞게 정확히 업데이트되었습니다. 컨트롤러 로직 및 엔드포인트는 변경되지 않았습니다.

ticketmate-review/src/main/java/com/ticketmate/backend/review/application/service/ReviewService.java (1)

9-10: 의존성 임포트 경로 업데이트 완료

FulfillmentFormService와 FulfillmentFormStatus의 임포트 경로가 새로운 패키지 구조에 맞게 올바르게 업데이트되었습니다. 서비스 로직에는 변경사항이 없습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/FulfillmentForm.java (1)

10-10: 엔티티 임포트 업데이트 확인

FulfillmentFormStatus 임포트가 새로운 패키지 경로로 정확히 업데이트되었습니다. 엔티티 정의 및 로직은 변경되지 않았습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/fulfillmentform/FulfillmentFormStatus.java (1)

1-1: 상수 클래스 패키지 이동 완료

FulfillmentFormStatus enum이 fulfillmentform 하위 패키지로 적절히 이동되었습니다. enum 정의와 값은 변경되지 않았습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/constant/FulfillmentFormConstants.java (1)

3-3: 상수 클래스 임포트 업데이트 확인

FulfillmentFormStatus 임포트가 새로운 패키지 구조에 맞게 업데이트되었습니다. 상수 정의는 변경되지 않았습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormRejectRequest.java (2)

1-1: DTO 패키지 재구성 완료

FulfillmentFormRejectRequest가 fulfillmentform.request 하위 패키지로 적절히 이동되었습니다. 클래스 정의는 변경되지 않았습니다.


1-26: 패키지 리팩토링 검증 완료

코드베이스 전체에서 이전 패키지 경로에 대한 참조가 없습니다. 패키지 리팩토링이 일관되게 완료되었습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormInfoRequest.java (1)

1-40: 패키지 구조 개선 확인

이행양식 관련 DTO를 fulfillmentform 하위 패키지로 재구성한 것은 모듈 구조를 명확히 하는 좋은 변경입니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormImgService.java (1)

1-1: 패키지 구조 개선 확인

서비스 클래스를 fulfillmentform 하위 패키지로 이동한 것은 적절합니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapper.java (1)

1-11: 패키지 구조 개선 확인

매퍼 인터페이스의 패키지 재구성이 올바르게 적용되었습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormInfoResponse.java (1)

1-24: 패키지 구조 개선 확인

응답 DTO의 패키지 재구성 및 import 경로 업데이트가 적절합니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistoryStatus.java (1)

1-14: 성공내역 상태 Enum 구현 확인

리뷰 작성 여부를 나타내는 두 가지 상태를 명확하게 정의했습니다. 간결하고 명확한 구현입니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapperImpl.java (1)

1-33: 성공내역 매퍼 구현 확인

기존 FulfillmentFormMapperImpl과 일관된 패턴으로 구현되었습니다. StorageService를 활용한 공개 URL 생성과 리뷰 존재 여부에 따른 상태 결정 로직이 명확합니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormImgRepository.java (1)

1-9: 패키지 구조 개선 확인

Repository 인터페이스의 패키지 재구성이 올바르게 적용되었습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapper.java (1)

7-10: LGTM!

매퍼 인터페이스가 깔끔하게 정의되어 있습니다. SuccessHistoryRow에서 SuccessHistoryResponse로의 변환을 위한 단일 메서드 시그니처가 적절합니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRow.java (1)

7-24: LGTM!

프로젝션 인터페이스가 JPQL 쿼리 결과를 적절하게 매핑합니다. reviewIdreviewRating의 nullable 처리가 주석으로 잘 문서화되어 있습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistorySortField.java (1)

8-28: LGTM!

정렬 필드 열거형이 SortField 인터페이스를 올바르게 구현하고 있으며, @JsonCreator를 통한 유연한 역직렬화를 지원합니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/response/SuccessHistoryResponse.java (1)

12-27: LGTM!

DTO 구조가 적절하며, Lombok 어노테이션을 활용하여 보일러플레이트 코드를 최소화했습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/request/SuccessHistoryFilteredRequest.java (1)

19-57: LGTM!

페이지네이션 및 정렬 요청 DTO가 잘 구성되어 있습니다. 기본 생성자에서 합리적인 기본값을 설정하고, 유효성 검사 어노테이션과 커스텀 에러 코드가 적절하게 적용되어 있습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapperImpl.java (1)

1-45: 패키지 재구성 및 매퍼 구현이 적절합니다.

패키지 경로 변경과 import 업데이트가 일관되게 적용되었습니다. toFulfillmentFormImgList 메서드에서 null/empty 체크 및 빈 경로 필터링 로직이 적절하게 구현되어 있습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/SuccessHistory.java (1)

42-47: 정적 팩토리 메서드 구현이 적절합니다.

create 메서드가 NOT_REVIEWED 상태를 기본값으로 설정하여 일관된 초기 상태를 보장합니다. 빌더 패턴과 정적 팩토리 메서드의 조합이 잘 적용되었습니다.

ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java (1)

60-60: 이벤트 발행자 의존성 추가가 적절합니다.

ApplicationEventPublisher를 통한 도메인 이벤트 발행 패턴은 성공양식 수락과 성공내역 생성 간의 결합도를 낮추는 좋은 접근입니다.

Comment on lines 17 to 20
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void createSuccessHistoryForEvent(FulfillmentFormEvent event) {
successHistoryService.createSuccessHistory(event.fulfillmentFormId());
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

이벤트 핸들러에 에러 처리 및 로깅 추가 필요

AFTER_COMMIT 단계에서 실행되는 이벤트 리스너에 에러 처리가 없습니다. createSuccessHistory가 실패하면:

  • 이미 커밋된 이행양식 수락은 롤백되지 않음
  • 성공내역 생성 실패에 대한 로그가 없어 추적 불가
  • 데이터 일관성 문제 발생 가능
🔎 에러 처리 및 로깅 추가
   @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
   public void createSuccessHistoryForEvent(FulfillmentFormEvent event) {
-    successHistoryService.createSuccessHistory(event.fulfillmentFormId());
+    try {
+      successHistoryService.createSuccessHistory(event.fulfillmentFormId());
+      log.info("성공내역 생성 완료 - fulfillmentFormId: {}", event.fulfillmentFormId());
+    } catch (Exception e) {
+      log.error("성공내역 생성 실패 - fulfillmentFormId: {}, error: {}", 
+        event.fulfillmentFormId(), e.getMessage(), e);
+      // 필요시 재시도 로직 또는 별도 알림 처리
+    }
   }
🤖 Prompt for AI Agents
In
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryEventHandler.java
around lines 17 to 20, the AFTER_COMMIT event listener calls
successHistoryService.createSuccessHistory(...) without any error handling or
logging; wrap the call in a try-catch that catches Exception, log an error with
context (including fulfillmentFormId and exception stack/ message) and
return/handle gracefully (do not rethrow to avoid impacting already committed
transaction); optionally record a metric or enqueue a retry/fallback task when
creation fails to ensure eventual consistency.

Copy link
Member

@Chuseok22 Chuseok22 left a comment

Choose a reason for hiding this comment

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

모듈 병합하시느라 고생많으셨습니당~~

import java.time.LocalDateTime;
import java.util.UUID;

public interface SuccessHistoryRow {
Copy link
Member

Choose a reason for hiding this comment

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

SuccessHistoryRow 역할이 뭐에요??

Copy link
Contributor Author

Choose a reason for hiding this comment

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

성공내역 리스트업 조회전용 DTO? 라고 보시면 될 것 같습니다.
화면에 보여줄 필드값만 JOIN 해서 한번에 가져오려고 설계했습니당 리뷰의 경우 있을수도, 없을수도 있는 필드를 좀 깔끔하게 처리하려고(N+1방지 및 쿼리 최소화) 설계했어용

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createSuccessHistory(UUID fulfillmentFormId) {
if (successHistoryRepository.existsByFulfillmentForm_FulfillmentFormId(fulfillmentFormId)) {
return;
Copy link
Member

Choose a reason for hiding this comment

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

이미 존재한다는 로그 한줄 찍으면 좋을 듯 합니다

Copy link

@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: 1

Fix all issues with AI Agents 🤖
In
@ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java:
- Around line 31-39: The createSuccessHistory method uses
entityManager.getReference(…) which defers validation and will cause
FK/constraint failures later; replace the use of
entityManager.getReference(FulfillmentForm.class, fulfillmentFormId) with
entityManager.find(FulfillmentForm.class, fulfillmentFormId) (or repository
lookup) and explicitly handle the null case (throw a clear exception or return)
before calling SuccessHistory.create(...) and
successHistoryRepository.save(...), so the existence of the FulfillmentForm is
validated immediately.
♻️ Duplicate comments (1)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java (1)

41-54: 인증된 사용자와 agentId 간의 권한 검증이 필요합니다.

현재 컨트롤러에서 customOAuth2User가 주입되지만 서비스로 전달되지 않고, agentId 파라미터가 현재 로그인한 사용자의 것인지 검증하지 않습니다. 이로 인해 인증된 모든 사용자가 임의의 대리인 성공내역을 조회할 수 있는 보안 취약점이 있습니다.

🔎 수정 제안
  @Transactional(readOnly = true)
- public Slice<SuccessHistoryResponse> getSuccessHistoryList(UUID agentId, SuccessHistoryFilteredRequest request) {
+ public Slice<SuccessHistoryResponse> getSuccessHistoryList(Member authenticatedMember, SuccessHistoryFilteredRequest request) {
+   UUID agentId = authenticatedMember.getMemberId();
    Member agent = memberService.findMemberById(agentId);

    // 조회객체가 대리인이 정말 맞는지
    memberService.validateMemberType(agent, MemberType.AGENT);
🧹 Nitpick comments (1)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java (1)

154-159: 이벤트 발행 시점과 트랜잭션 일관성 검토가 필요합니다.

현재 FulfillmentFormEvent가 트랜잭션 커밋 전에 발행됩니다. 이벤트 핸들러가 별도 트랜잭션(REQUIRES_NEW)에서 성공내역을 생성하면, 부모 트랜잭션이 롤백되더라도 성공내역은 DB에 남게 됩니다.

이전 리뷰에서 논의된 대로 같은 트랜잭션으로 묶는 것이 더 안전할 수 있습니다. 만약 현재 설계를 유지한다면, TransactionSynchronization.afterCommit()에서 이벤트를 발행하는 것을 고려해주세요.

🔎 afterCommit 방식 예시
-   eventPublisher.publishEvent(new FulfillmentFormEvent(fulfillmentFormId));
-
    // TODO 성공양식이 수락됐다는 알림 발송 로직 추가해야될듯

    try {
      // 대리인 통계 업데이트
      agentPerformanceService.addRecentSuccessStats(fulfillmentForm.getAgent());
    } catch (Exception e) {
      log.error("성공양식 수락 후 대리인 통계 업데이트에 실패했습니다. {}", e.getMessage(), e);
    }

    // 트렌젝션 커밋 이후에만 호출되도록 보장 (채팅 발송은 채팅 메시지 서비스에서 수행)
    TransactionSynchronizationManager.registerSynchronization(
      new TransactionSynchronization() {
        @Override
        public void afterCommit() {
+         eventPublisher.publishEvent(new FulfillmentFormEvent(fulfillmentFormId));
          chatMessageService.sendFulfillmentFormAcceptMessage(fulfillmentForm.getChatRoomId(), fulfillmentFormId, member);
        }
      });
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 49d8cb0 and 2610731.

📒 Files selected for processing (3)
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryEventHandler.java
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryEventHandler.java
🧰 Additional context used
🧬 Code graph analysis (1)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java (1)
ticketmate-common/src/main/java/com/ticketmate/backend/common/core/util/CommonUtil.java (1)
  • CommonUtil (17-163)
⏰ 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: schema-verify
🔇 Additional comments (2)
ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java (2)

1-1: 패키지 재구성이 잘 정리되었습니다.

fulfillmentform 관련 클래스들이 하위 패키지로 적절히 분리되어 모듈 구조가 개선되었습니다.

Also applies to: 4-7, 17-26


276-282: 수락 상태 검증 로직이 올바르게 수정되었습니다.

이전 리뷰에서 지적된 치명적 버그가 수정되었습니다. 이제 상태를 설정하기 전에 먼저 이미 수락된 상태인지 확인하여, 중복 수락 시도를 정상적으로 차단합니다. 거절 케이스(lines 285-294)와 동일한 패턴으로 일관성 있게 구현되었습니다.

Comment on lines +31 to +39
public void createSuccessHistory(UUID fulfillmentFormId) {
if (successHistoryRepository.existsByFulfillmentForm_FulfillmentFormId(fulfillmentFormId)) {
log.debug("성공내역이 이미 존재합니다.");
return;
}

FulfillmentForm fulfillmentForm = entityManager.getReference(FulfillmentForm.class, fulfillmentFormId);
successHistoryRepository.save(SuccessHistory.create(fulfillmentForm));
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

find . -type f -name "*EventHandler*.java" | grep -i successhistory

Repository: Team-TicketMate/ticketmate-server

Length of output: 225


🏁 Script executed:

rg -n "SuccessHistoryEventHandler" --type java -B 2 -A 15

Repository: Team-TicketMate/ticketmate-server

Length of output: 2087


🏁 Script executed:

rg -n "createSuccessHistory" --type java -B 3 -A 3

Repository: Team-TicketMate/ticketmate-server

Length of output: 2729


entityManager.getReference()를 사용할 경우 유효성 검사가 지연됩니다.

이 메서드는 entityManager.getReference()로 프록시 객체를 생성한 후 repository.save()를 호출합니다. fulfillmentFormId가 실제로 존재하지 않을 경우, save() 시점에서 FK 제약조건 위반으로 오류가 발생하게 됩니다. 즉시 검증이 필요한 경우 entityManager.find() 사용을 고려하세요.

참고: 이 메서드는 @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)로 표시된 이벤트 리스너에서 호출되므로, 외부 트랜잭션 컨텍스트 내에서 실행됩니다. 따라서 메서드 자체의 @Transactional 어노테이션은 의도된 설계입니다.

🤖 Prompt for AI Agents
In
@ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java
around lines 31-39, The createSuccessHistory method uses
entityManager.getReference(…) which defers validation and will cause
FK/constraint failures later; replace the use of
entityManager.getReference(FulfillmentForm.class, fulfillmentFormId) with
entityManager.find(FulfillmentForm.class, fulfillmentFormId) (or repository
lookup) and explicitly handle the null case (throw a clear exception or return)
before calling SuccessHistory.create(...) and
successHistoryRepository.save(...), so the existence of the FulfillmentForm is
validated immediately.

@mr6208 mr6208 merged commit 3989140 into test Jan 5, 2026
3 checks passed
mr6208 added a commit that referenced this pull request Jan 5, 2026
* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>
mr6208 added a commit that referenced this pull request Jan 5, 2026
* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

---------

Co-authored-by: Baek Jihoon <[email protected]>
@coderabbitai coderabbitai bot mentioned this pull request Jan 5, 2026
2 tasks
mr6208 added a commit that referenced this pull request Jan 9, 2026
* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700) (#710)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

* Test (#712)

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {기존 스크립트 삭제(왜있는거지)} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>
mr6208 added a commit that referenced this pull request Jan 9, 2026
* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#714)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700) (#710)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

* Test (#712)

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {기존 스크립트 삭제(왜있는거지)} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* hotfix: 과거 스크립트 또 삭제

---------

Co-authored-by: Baek Jihoon <[email protected]>
mr6208 added a commit that referenced this pull request Jan 9, 2026
* Test (#716)

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#714)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700) (#710)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

* Test (#712)

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {기존 스크립트 삭제(왜있는거지)} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* hotfix: 과거 스크립트 또 삭제

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 채팅방_응답데이터_리팩토링 : feat : {요구사항 반영}

---------

Co-authored-by: Baek Jihoon <[email protected]>
mr6208 added a commit that referenced this pull request Jan 9, 2026
* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#714)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700) (#710)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

* Test (#712)

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {기존 스크립트 삭제(왜있는거지)} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* hotfix: 과거 스크립트 또 삭제

* Mr6208/20260109 채팅방 응답데이터 리팩토링 (#717)

* Test (#716)

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#714)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700) (#710)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

* Test (#712)

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711)

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} #646

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {기존 스크립트 삭제(왜있는거지)} #646

---------

Co-authored-by: Baek Jihoon <[email protected]>

* hotfix: 과거 스크립트 또 삭제

---------

Co-authored-by: Baek Jihoon <[email protected]>

* 채팅방_응답데이터_리팩토링 : feat : {요구사항 반영}

---------

Co-authored-by: Baek Jihoon <[email protected]>

---------

Co-authored-by: Baek Jihoon <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 새로운 기능 추가 (Feature)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants