Skip to content
New issue

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

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

Already on GitHub? # to your account

[TSK-52] refactor: CQRS 분리 및 osiv false 적용 #90

Merged
merged 54 commits into from
Nov 22, 2024
Merged

Conversation

Hoya324
Copy link
Member

@Hoya324 Hoya324 commented Nov 21, 2024

✅ 작업 내용

cqrs를 적용한 것과 osiv 비활성화를 하나의 작업으로 묶었는데, 생각보다 file 변경이 많아 커밋을 세분화했음. (죄송합니다..🥹)

1. OSIV 비활성화

  • OSIV 옵션을 false로 설정하여 영속성 컨텍스트가 트랜잭션 범위 내에서만 유지되도록 변경했습니다.
  • 해당 작업을 통해 데이터베이스 커넥션 점유 시간을 최소화하고 Lazy Loading 문제를 해결했습니다.
  • Commit: chore: OSIV 옵션 FALSE (d7434f5)

2. CQRS 패턴 도입

  • 기존의 QuestionService를 Command와 Query로 분리하여 역할을 명확히 했습니다.
  • 각 기능별로 Create, Update, Find와 같은 이름으로 분리하여 유지보수성을 높였습니다.
  • Commit:

3. RAG 답변 트랜잭션 분리

  • RAG 서버 호출과 데이터 저장 과정을 명확히 분리했습니다.
    • RAG 서버 호출: @Transactional(propagation = Propagation.NOT_SUPPORTED)
    • 데이터 저장: @Transactional(propagation = Propagation.REQUIRES_NEW)
  • 이를 통해 RAG 서버 호출 중 트랜잭션을 점유하지 않고, 독립적인 데이터 저장이 가능하도록 최적화했습니다.
  • Commit:
    • refactor: RAG 답변 저장에 대한 transaction 전파범위 REQUIRES_NEW로 설정 (f19c875, efcb437)
    • test: RAG 답변 저장에 대한 transaction 전파범위 REQUIRES_NEW로 설정 (d125509, 3985c88)
    • refactor: RAG Answer 호출과 저장 분리 (a1fadf2)

4. 로그 추가

  • 트랜잭션 및 데이터베이스 동작 확인을 위해 디버그 로그를 추가했습니다.
  • 주요 로그:
    • 트랜잭션 시작/종료 시점
    • RAG 서버 호출 시점
    • 데이터베이스 쿼리 실행 및 커밋
  • Commit:
    • chore: transaction logging (f1ca940)
    • test: transaction logging (관련 테스트 포함)

5. 폴더 구조 개선

  • CQRS 패턴에 맞게 서비스와 관련된 기능을 Command와 Query로 재구성하여 폴더 구조를 명확히 정리했습니다.
  • Commit: refactor: 폴더 구조 개선 (36a517b)

🤔 고민 했던 부분

1. RAG 서버 호출과 트랜잭션 분리

  • 고민: RAG 호출 중 트랜잭션을 유지하면 불필요한 커넥션 점유로 인해 성능 저하가 발생할 수 있음. 하지만 호출 중 예외 발생 시 데이터 정합성 유지 문제가 우려됨.
  • 결론: Propagation.NOT_SUPPORTED를 적용하여 호출 시 트랜잭션을 일시 중단하고, 예외 처리 로직으로 데이터 정합성을 유지.

2. 트랜잭션 전파 범위

  • 고민: REQUIRES_NEW 설정이 적합한지, NESTED와 같은 다른 전파 범위가 적합할지 검토.
  • 결론: 하위 트랜잭션에서 상위 트랜잭션과 독립적으로 동작하도록 하기 위해 REQUIRES_NEW를 선택.

3. CQRS 패턴 적용

  • 고민: 기존 QuestionService의 단일 책임 원칙 위반 문제를 해결하기 위해 CQRS 패턴 도입.
  • 결론: 각 기능을 Command와 Query로 명확히 분리하여 역할을 구분.

4. DB커넥션 시간 단축

  • 고민: OSIV를 비활성화하고, 트랜잭션을 분리한 것이 최선의 선택이었는지 확인 필요
  • 결론: 커넥션 풀을 증가하는 등의 작업도 가능하겠지만, 근본적으로 트랜잭션을 불필요하게 잡고 있는 문제를 명확한 Command와 Query를 구분하여 폴더 구조 개선으로 해결하는 것은 적합하다고 생각하며, 이로 인한 운영이 수월해진 장점까지 가질 수 있음.

🔊 도움이 필요한 부분

1. RAG 호출 에러 처리 전략

  • RAG 서버 호출 실패 시 재시도 또는 데이터 저장 여부에 대한 팀원들의 의견이 필요합니다.
    • 현재는 호출 실패 시 데이터 저장을 중단하고, 클라이언트에 에러 메시지를 반환.
    • 재시도 로직을 추가할지, 또는 실패한 데이터를 로그에 기록 후 비동기 처리할지 검토 필요.

2. CQRS 패턴 확장

  • 현재 QuestionService에서 적용된 CQRS 패턴을 AnswerService로도 확장하는 것이 적합한지 논의 필요.

@Hoya324 Hoya324 added 🎯리팩토링 기존의 기능을 디벨롭한 pr입니다. 🧪테스트 test를 추가한 pr입니다. 📄문서화 블로그에 정리한 pr입니다. labels Nov 21, 2024
@Hoya324 Hoya324 self-assigned this Nov 21, 2024
Copy link

Copy link

github-actions bot commented Nov 21, 2024

Unit Test Results

130 tests   130 ✔️  19s ⏱️
  38 suites      0 💤
  38 files        0

Results for commit f01567d.

♻️ This comment has been updated with latest results.

@Hoya324 Hoya324 merged commit 7a31578 into develop Nov 22, 2024
2 checks passed
@Hoya324 Hoya324 deleted the refactor/cqrs branch November 22, 2024 12:20
@swgvenghy
Copy link
Member

swgvenghy commented Nov 26, 2024

🔊 도움이 필요한 부분

1. RAG 호출 에러 처리 전략

  • RAG 서버 호출 실패 시 재시도 또는 데이터 저장 여부에 대한 팀원들의 의견이 필요합니다.

    • 현재는 호출 실패 시 데이터 저장을 중단하고, 클라이언트에 에러 메시지를 반환.
    • 재시도 로직을 추가할지, 또는 실패한 데이터를 로그에 기록 후 비동기 처리할지 검토 필요.

실패한 데이터 로그화 시켜두는건 좋은 거 같음 그러것들 모아서 백오피스단에서 질문-답변 정의로 처리할 수 있으니까! @Hoya324

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
🎯리팩토링 기존의 기능을 디벨롭한 pr입니다. 📄문서화 블로그에 정리한 pr입니다. 🧪테스트 test를 추가한 pr입니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants