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

[#85] 프로젝트 구조 개선 #87

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from

Conversation

yanggwangseong
Copy link
Collaborator

@yanggwangseong yanggwangseong commented Jan 30, 2025

구현 기능 명세

🎁 주목할 점

  • 프로젝트 전체 구조와 pr리뷰 변경사항을 적용 하였습니다.

질문사항

노션 질문 정리 링크

  • 질문 ) 하나의 API에서 다른 repository를 호출 할 때 어떤 방법이 더 좋은 방법 일까요?
    • 방법 1) 서비스에서 여러 repository를 호출하는 방식
    • 방법 2) (서비스간 호출) 다른 도메인의 repository 직접 호출 막기
      • 서비스 A -> 서비스 A의 Repository
      • 서비스 A -> 서비스 B -> 서비스 B의 Repository
    • 방법3) (컨트롤러에서 서비스 호출) 다른 도메인의 repository 직접 호출 막기
      • 컨트롤러 A -> 서비스 A -> 서비스 A의 Repository
      • 컨트롤러 A -> 서비스 B -> 서비스 B의 Repository
  • 제 생각 ) 현재 구현된 방식은 방법1번으로 구현되어 있는데 방법2번 방식이 좀 더 좋은 방법 같습니다.
    • 각각의 도메인 모듈별로 독립적으로 동작하게 구성 하여서 독립성을 보장하여 유지보수성을 증가할 수 있을것 같습니다.
    • 하나의 Repository를 여러 서비스에서 호출하게 되면 같은 메서드를 호출하게 되었을때 중복된 비지니스 로직 코드가 생겨날것 같습니다.

😭 어려웠던 점

🌄 스크린샷

@yanggwangseong yanggwangseong added Assignee 양광성 feat 구현·개선 사항에 관련된 내용입니다. labels Jan 30, 2025
@yanggwangseong yanggwangseong self-assigned this Jan 30, 2025
Copy link

Quality Gate Failed Quality Gate failed

Failed conditions
1 Security Hotspot

See analysis details on SonarQube Cloud

Base automatically changed from feature/81-article-like-improve to develop January 30, 2025 11:09
@@ -39,7 +39,7 @@ export const TypeOrmModuleOptions: TypeOrmModuleAsyncOptions = {
enableKeepAlive: true,
keepAliveInitialDelay: 10000,
idleTimeout: 240000,
} as PoolOptions,
} satisfies PoolOptions,
Copy link
Collaborator

Choose a reason for hiding this comment

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

👍

@f-lab-jayce
Copy link
Collaborator

제가 생각하기엔 Domain = Table Entity 이렇게 생각하고 계신 것 같다는 느낌이 들긴 하네요. 보통 묶여 있긴 하지만 반드시 그런 건 아닌 것 같습니다. 예를 들어서 user 테이블이 user 도메인에서만 사용되지 않을 수 있는 거잖아요?

그래서 원래는 도메인마다 Repository 코드를 가지고 있게 되는 경우가 많은 것 같아요. 예를 들어서 서비스들 중 User Service가 분리되어 있고 Account가 분리 되어 있으면 각각이 user 테이블에 접근하는 패턴이 다를 거잖아요? 그리고 서비스도 분리되어 있으니 다른 Repository 코드를 사용할 겁니다.

이게 근데 중복된 코드를 만들 수 있는 거 아닐까? -> 맞습니다. 그래서 저는 서비스가 나눠지지 않은 그냥 모놀리스 서비스에서는 Common 영역에 Repository 코드를 넣습니다. 코드 복잡도가 높아지지 않게 하는 게 더 좋아서요 저는.

다만 여러 팀이 각자 도메인을 맡아 개발하고 있다면 Common보다는 분리하는 걸 선택했을 것 같습니다. 중복되는 로직이 있더라도 각자가 관리한다면 사실 상관 없는 문제잖아요? 그리고 공통 모듈은 개발에서 병목의 원인이 되기도 해서요.

좋은 코드, 아키텍처는 사실 상황마다 다르다고 생각합니다. 항상 맞는 구조라는 건 없다고 생각하는데, 일반적으로 ~~해서 ~~문제를 해결했다는 형태로 아키텍처들이 소개되고 특히 복잡한 코드 구조에서 복잡도를 낮추는 방향으로 가는 거라서 명확히 구분되는 코드 구조가 항상 좋은 것처럼 생각되곤 하는데, 현실에서는 꼭 그렇지 않다고 생각해요. 물론, '엔지니어 관점'에서는 늘 확장성이 뛰어난 코드 구조가 뭔가 생각하는 게 좋은 방향같긴 합니다.


쓰다보니까 떠올랐는데, 보통 중복되어서 생기는 문제를 막기 위해서 특정 도메인에서 접근해야 하는 패턴을 해당 도메인의 서비스로직을 사용하도록 합니다. 그리고 그 부분을 쓰는 거죠. 만약 서비스가 갈라져있는 상황이라면 gRPC, HTTP 엔드포인트 하나 뚫어서 다른 팀에서 요구하는 도메인 로직을 수행할 수 있게 합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Assignee 양광성 feat 구현·개선 사항에 관련된 내용입니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants