Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

외래키 제거 #388

Closed
Tracked by #387
limehee opened this issue Jun 22, 2024 · 0 comments · Fixed by #391
Closed
Tracked by #387

외래키 제거 #388

limehee opened this issue Jun 22, 2024 · 0 comments · Fixed by #391
Assignees
Labels
🔨 Refactor 코드 수정 및 개선

Comments

@limehee
Copy link
Collaborator

limehee commented Jun 22, 2024

Describe

엔티티 간 직접적인 참조를 제거하고 ID를 통한 간접 참조로 전환합니다. 이 작업은 헥사고날 아키텍처의 외부-내부 의존성 역전을 준수함과 동시에, 성능 및 운영적인 측면에서의 문제를 해결하기 위함입니다.

외래키의 애플리케이션 성능 및 운영 측면의 단점

1. 성능 문제

  • 외래키는 데이터베이스에서 참조 무결성을 보장하지만, 대규모 테이블 간의 조인 연산은 성능 저하를 유발할 수 있습니다. 특히, 대량의 데이터가 있는 테이블에서 조인 시 I/O 부하와 쿼리 성능 저하가 발생할 수 있습니다.

2. 운영 복잡도

  • 데이터베이스의 외래키 제약 조건은 이식성과 운영의 유연성을 제한할 수 있습니다.
  • 외래키로 연결된 테이블을 수정하거나 삭제할 때, 종속된 데이터들까지 고려해야 하므로 즉각적인 핫픽스가 어렵습니다. 이는 운영상의 긴급 조치를 지연시킬 수 있습니다.

3. 스키마 변경의 어려움

  • 외래키를 사용하는 스키마는 변경 시 의존 관계를 고려해야 하므로, 구조 변경이 어렵고 유지보수가 복잡해질 수 있습니다.
  • 외래키로 인해 테이블 간의 강한 결합이 발생하여, 테이블 구조 변경 시 종속된 모든 테이블을 수정해야 하며, 이는 유지보수와 확장성 측면에서 어려움을 초래합니다.

정합성 문제 보완 방안

1. 애플리케이션 단에서 무결성 검사

  • 데이터베이스 대신 애플리케이션 레이어에서 무결성을 검사합니다. 엔티티를 조회할 때 ID의 유효성을 확인하고, 엔티티 간의 관계를 애플리케이션 로직으로 처리하여 정합성을 유지합니다.
  • 서비스 레이어에서 ID를 통한 조회 시, 존재하지 않는 ID에 대한 적절한 예외 처리를 구현하여 데이터의 유효성을 보장합니다.

2. 트랜잭션 관리

  • 여러 엔티티 간의 조작이 필요한 경우, 트랜잭션을 사용하여 원자성을 보장합니다.
  • 트랜잭션이 완료되기 전까지는 데이터베이스 변경을 커밋하지 않고, 트랜잭션 실패 시 롤백하여 데이터 정합성을 유지합니다.

3. 데이터 유효성 체크

  • ID를 통한 조회 시, 해당 ID가 유효한지 확인하고 유효하지 않을 경우 예외를 발생시켜 무결성을 보장합니다.
  • 서비스 계층에서 데이터 유효성을 체크하는 로직을 포함하여 데이터의 일관성을 유지합니다.

4. 도메인 이벤트 사용

  • 데이터 변경 시 도메인 이벤트를 사용하여 변경 사항을 다른 도메인 모델에 알리고, 정합성을 유지할 수 있는 처리를 수행합니다.
  • 이벤트 핸들러를 통해 데이터 변경을 모니터링하고, 필요한 후속 조치를 자동으로 수행하여 데이터 정합성을 유지합니다.
@limehee limehee added the 🔨 Refactor 코드 수정 및 개선 label Jun 22, 2024
@limehee limehee self-assigned this Jun 22, 2024
@limehee limehee linked a pull request Jun 26, 2024 that will close this issue
@limehee limehee removed a link to a pull request Jun 26, 2024
@limehee limehee linked a pull request Jun 26, 2024 that will close this issue
@limehee limehee closed this as completed Jun 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🔨 Refactor 코드 수정 및 개선
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant