Skip to content

Refactor: 생성 로직 보상트랜잭션 도입 및 서비스 분리#180

Merged
lunarbae628 merged 59 commits into
devfrom
staging
Feb 28, 2026
Merged

Refactor: 생성 로직 보상트랜잭션 도입 및 서비스 분리#180
lunarbae628 merged 59 commits into
devfrom
staging

Conversation

@lunarbae628
Copy link
Copy Markdown
Collaborator

@lunarbae628 lunarbae628 commented Feb 15, 2026

🛰️ Issue Number

🪐 작업 내용

변경 내용

생성 로직에 보상트랜잭션 도입

Doc의 예

[DocService]
    │
    ▼
[DocCreateOrchestrator]  ── (1) SaveContent 저장 (Mongo)
    │
    ▼
[DocCreateMySqlTxService] ── (2) Doc/Branch/Save 저장 (MySQL)
    │
    ├─ 성공 → 응답 반환
    │
    └─ 실패 → [MongoDeleteRetryService] (3) 보상 삭제 (Mongo, Retry/Recover)

Command / Query 책임 분리

  • Repository에 접근하는 메소드를 QueryService로 분리 -> 추후 ValidationService 추가분리 검토 중
  • Service에서 타 도메인의 Repository 직접 접근 제거(Doc/Branch/Commit/Save/Edge)

이어서 작업하기 버그 수정

  • 이름 중복 처리
    새 브랜치 생성 시점에 이름 중복이 DB까지 가서 DataIntegrityViolationException로 터질 수 있었음.
    createNewBranch == true 경로에서 먼저 checkDuplicatedWithBranchName 수행해서 BRANCH_NAME_DUPLICATED로 처리.
  • leaf 커밋에서의 분기
    기존로직은 isLeaf == true면 요청 이름과 무관하게 기존 브랜치 save 생성 경로로 감 -> save있는데 save또 생성하려해서 saves.branch_id 유니크 제약 위반(500) 발생
        if (isLeaf) {
            Save save = createSave(fromBranch, fromCommit.getCommitMongoId()
image 스크린샷 2026-02-24 오전 6 27 04

(펑)

image image

(펑)

image

(안터져용~)

createNewBranch = !isLeaf || !sameName || (isLeaf && isRoot && hasSave)로 분기.
변경 초기에는 (isLeaf && isRoot && hasSave)는 없었으나 Leaf이면서 Root이면서 Save가 있으면서 이름이 같으면 createNewBranch가 false가 되어 이름중복 예외가 터지지않고 DataIntegrityViolationException가 또 터져서 조건을 늘렸습니다.(너무 복잡 간략화 필요)

  • fromCommit ManyToOne으로 변경
스크린샷 2026-02-24 오전 6 37 18 이런 게 가능한 게 자연스러운 것 같아서 바꿔 봤는데 아직 문제를 찾진 못했습니다. DB 마이그레이션 예정

그 외

  • 프로파일별 CORS 허용 도메인 분리
  • MongoDeleteRetryService 벌크 삭제 방식으로 개선
  • 의미가 애매한 메소드명 클래스명 변수명 변경
  • 책임 도메인으로 메소드 이동
  • BranchCreateRequest.fromCommitId에 @NotNull 적용

테스트

  1. 신규 테스트 추가
  • BranchCreateOrSaveIntegrationTest
    • leaf=root+save 존재+같은 이름 요청 시 BRANCH_NAME_DUPLICATED
    • leaf=root+save 존재+다른 이름 요청 시 새 branch/save 생성
    • leaf=root+save 없음+같은 이름 요청 시 기존 branch에 save 생성
    • 새 브랜치 생성 경로에서 이름 중복 시 BRANCH_NAME_DUPLICATED
  • CommitCreateOrchestratorTest
    • Mongo 성공 + MySQL 성공 시 보상 삭제 미호출
    • Mongo 성공 + MySQL 실패 시 보상 삭제 호출 및 예외 전파
  • DocCreateOrchestratorTest
    • Mongo 성공 + MySQL 성공 시 보상 삭제 미호출
    • Mongo 성공 + MySQL 실패 시 보상 삭제 호출 및 예외 전파
  1. 기존 테스트 보강/수정
  • BranchServiceTest
    • 이어서 작업 분기(이름 중복/새 브랜치 생성 경로) 단위 검증 강화
  • CommitServiceMockTest
    • createCommit 경로를 Orchestrator 기반으로 재검증
    • base commit 선택(leaf/from/null) 분기 검증
    • merge 검증(동일 브랜치 요청, 권한 검증 실패) 케이스 추가
  • CreateCommitIntegrationTest
    • 중복 요청 시 커밋 2건 생성(멱등키 미적용 현상) 검증
    • invalid blockOrders 실패 검증
    • MySQL 실패 시 Mongo 보상 삭제 검증
    • MySQL 실패 + 보상 삭제 실패(3회) 경로 검증
  • DocServiceIntegrationTests
    • MySQL 실패 시 SaveContent 보상 삭제 검증
    • MySQL 실패 + 보상 삭제 3회 실패 시 MongoDeleteFailure 저장 검증
  • DocServiceUnitTests
    • CQRS 분리 반영(조회/중복검사 위임) 검증
    • 제목 중복 시 Orchestrator 미호출 검증
  • DeleteCommitIntegrationTest
    • 하드코딩 기대값을 delta(count 전후 비교) 검증으로 보강
  • GetCommitMockTest / DocControllerUnitTests / DocGraphIntegrationTest / DocTestUtils
    • QueryService 분리 및 DTO/메서드명 변경 반영
  • MongoDeleteRetryServiceTest
    • 테스트 간 데이터 오염 방지 cleanup(@AfterEach) 추가
  • application-test.yml
    • test 프로필 CORS 설정 항목 추가

참고사항

  • Service와 QueryService(repository로 직접 전근하는 레이어)로 분리하는 과정 및 충동적 수정으로 인해 코드의 변경사항이 너무 많아졌습니다.
  • 프론트에서 백엔드에서 내려주는 예외 메시지가 아닌 다른 메시지를 출력하는게 늘 짜증났는데 이번기회에 수정했습니다. 프론트 수정사항은 https://github.com/lunarbae628/Docsa_FE/tree/staging 여기서 확인가능합니다.
  • https://staging.docsa-4hh.pages.dev/ 에서 staging 테스트를 할 수 있습니다.

📚 Reference

  • 코드의 변경사항이 많아질 것으로 예상되기에 pr을 선제적으로 게시하여 진행사항 공유드리도록 하겠습니다.
  • 주기적으로 변경사항을 staging브랜치에 머지해가며 진행하겠습니다.

✅ Check List

  • 코드가 정상적으로 컴파일되나요?
  • 테스트 코드를 통과했나요?
  • merge할 브랜치의 위치를 확인했나요?
  • Label을 지정했나요?

Refactor: 문서 생성 보상트랜잭션 도입 / 명령-조회 서비스 책임분리 / 외 잔잔한 코드수정
@lunarbae628 lunarbae628 self-assigned this Feb 15, 2026
@lunarbae628 lunarbae628 requested review from 2ternal, ky1nonly and sleepyhoon and removed request for 2ternal and ky1nonly February 15, 2026 11:29
@sleepyhoon
Copy link
Copy Markdown
Collaborator

안녕하세요 문성님, 리뷰는 진행이 모두 끝나고 하면 될까요?

@lunarbae628
Copy link
Copy Markdown
Collaborator Author

안녕하세요 문성님, 리뷰는 진행이 모두 끝나고 하면 될까요?

전체 작업이 끝난 뒤에 한 번에 PR을 올리면 변경 범위가 커져서 파악이 어려울 것 같아, 미리 올려두었습니다.

리뷰는 편하실 때 언제든지 진행해주셔도 괜찮습니다!

- CommitServiceMockTest에 merge 동일 브랜치(COMMIT_BAD_REQUEST) 검증 케이스 추가

- CommitServiceMockTest에 merge 권한 검증(base/target 중 하나 실패) 케이스 추가

- CommitService 의존성 변경에 맞춰 GetCommitMockTest를 CommitQueryService 기준으로 보정

- DocCreateOrchestrator 의존성 변경에 맞춰 DocCreateOrchestratorTest를 SaveService 기준으로 보정
- createBranchOrSave 흐름을 BranchCreateOrchestrator + Mongo/MySQL TxService로 분리
- BranchQueryService를 도입해 branch repository 접근/검증 로직을 이관
- BranchService는 검증/흐름 조립 중심으로 정리
- Doc/Commit 경로의 branch 조회·검증 호출을 BranchQueryService로 전환
- CommitService 의존성 변경(BranchService -> BranchQueryService)에 맞춰 mock/verify 호출부 정리
- create/merge 검증 테스트의 branch 권한 체크 대상 동기화
- createNewBranch 분기를 도입해 leaf 상태에서도 새 브랜치 생성 의도를 반영
- save가 있는 브랜치에서 새 브랜치 생성 시 기존 브랜치 save 추가로 잘못 분기되던 문제를 수정
- 새 브랜치 생성 경로에서 브랜치 이름 중복 검증을 수행하도록 보정
- 같은 브랜치 이어서작업 시 기존 save 재사용으로 saves(branch_id) 중복 insert 방지
- BranchCreateRequest.fromCommitId를 @NotNull 검증
- leaf + 동일 브랜치명 재요청 시 기존 save 재사용 검증 추가
- leaf + 다른 브랜치명에서 이름 중복이면 BRANCH_NAME_DUPLICATED 검증 추가
- fromBranch에 save가 있어도 새 브랜치 생성 경로가 정상 동작하는지 검증 추가
- BranchService 리팩토링 의존성(BranchQueryService, BranchCreateOrchestrator)에 맞춰 BranchServiceTest 수정
- BranchCreateOrSaveIntegrationTest 추가
- leafCommit=rootCommit + save 존재 + 같은 이름 요청 시 BRANCH_NAME_DUPLICATED 검증
- leafCommit=rootCommit + save 존재 + 다른 이름 요청 시 새 브랜치/새 save 생성 검증
- leafCommit=rootCommit + save 없음 + 같은 이름 요청 시 기존 브랜치에 save 생성 검증
- 새 브랜치 생성 경로에서 이름 중복 시 BRANCH_NAME_DUPLICATED 검증
- BranchServiceTest를 현재 분기 로직에 수정
- SaveService의 저장소 직접 의존 제거
- Doc/Branch/Commit MySQL Tx 서비스의 SaveService 의존을 SaveQueryService로 변경
- SaveErrorCode.FAIL_TO_SAVE 추가 및 updateSave Mongo 저장 실패 매핑 정리
@lunarbae628 lunarbae628 changed the title Refactor: 생성 로직 보상트랜잭션 도입 및 서비스 분리(CQRS) - 진행중 Refactor: 생성 로직 보상트랜잭션 도입 및 서비스 분리 - 진행중 Feb 25, 2026
- BranchQueryService 의존성 변경에 따른 테스트 변경
- GraphBranchDto 네이밍 변경 -> BranchGraphDto
- CommitQueryService#getCommitGraphList 추가
- CommitRepository#findCommitsByDocId -> getCommitGraphList 네이밍 정리
- DocService 그래프 조회에서 CommitQueryService 경유로 전환
- EdgeRepository projection DTO 경로(EdgeDto) 반영
@lunarbae628 lunarbae628 changed the title Refactor: 생성 로직 보상트랜잭션 도입 및 서비스 분리 - 진행중 Refactor: 생성 로직 보상트랜잭션 도입 및 서비스 분리 Feb 27, 2026
Copy link
Copy Markdown
Collaborator

@sleepyhoon sleepyhoon left a comment

Choose a reason for hiding this comment

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

고생하셨습니다

@lunarbae628 lunarbae628 merged commit 71fa30f into dev Feb 28, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants