HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/강의 내용 정리/우아한 형제들 특강/
[아키텍처] 우아한 형제들 개발실장 조영호님

[아키텍처] 우아한 형제들 개발실장 조영호님

https://www.youtube.com/watch?v=26S4VFUWlJM&t=823s https://www.youtube.com/watch?v=dJ5C4qRqAgA
Dependency
  • 어떻게 의존성을 관리하느냐. 의존성에 따라서 설계가 어떻게 바뀌는지를 통해 의존성을 어떻게 관리하는지
  • 변경에 의한 영향을 받느냐
  • 클래스 사이의 Dependency
    • Association (연관관계) A가 B를 아예 필드로 갖는 것
    • Dependency(의존 관계) 메서드나 파라미터로 잠시 나오는 것
    • Inheritance (상속 관계) - 구현 바뀌는 것에 영향
    • Realization(실체화 관계) - 시그니처 바뀌는 것에 영향
  • 패키지 사이의 Dependency
    • 패키지 B에 있는 클래스가 다른 패키지 안에 있는 클래스에 의존성이(위의 4가지 중 아무거나) 있으면 의존성이 있다라고 함
지시
  • 양방향 의존성을 피하라
    • 굉장히 신경쓸 것이 많음
    • 성능 상 이슈도 있음
  • 다중성이 적은 방향을 선택하라
    • OneToMany보다 ManyToOne쪽이 더 나음
    • A가 B의 list를 가지는 것보다 B가 A 하나를 가지는게 좋음
  • 의존성이 필요없다면 제거하라
  • 패키지 사이의 의존성 사이클을 제거하라(양방향 x, 단방향으로)
 

레이어 아키텍처 중 Domain 부분

notion image
  • db는 방향성이 없지만, 객체는 방향성이 있음. 방향성 결정하는게 굉장히 중요하다
  • 관계의 방향 = 협력의 방향 = 의존성의 방향

연관관계

  • 객체 협력을 위해 필요한 영구적인 탐색 구조
    • 빈번하게 참조를 한다면 연관관계로 잡기
    • Order에서 OrderLineItem으로 탐색가능(연관관계 = 탐색가능성 navigability)
  • 구현 방법
    • 가장 대표적인 방법 중 하나 : 객체 참조
notion image
  • 의존관계 : 협력을 위해 일시적으로 필요한 의존성
    • (파라미터, 리턴타입, 지연변수)
  • 이 둘 중 어떤것을 선택하느냐가 중요하기 보다는 방향성이 중요함
  • 코드를 짜고나서 dependency를 다 그려보기
    • 설계를 어떻게 개선해야 할지에 대해 그림이 보이게 됨

두 가지 문제

객체 참조로 인한 결합도 상승

notion image
notion image

객체 참조로 구현한 연관관계의 문제점

  • 협력을 위해 필요하지만 두 객체 사이의 결합이 강해짐. 결합도가 가장 높은 의존성임 ⇒ 필요한 경우에는 객체 참조 끊기
  • 객체 참조를 다 하고 있으니 트랜잭션 경계를 어디까지 할꺼냐
    • 비즈니스 로직이 추가될수록 상태를 바꿔줘야 할 객체들이 더 추가되고 transaction이 점점 더 길어지게 됨
notion image
  • 트랜잭션으로 묶이는 3개의 도메인의 변경빈도가 달라지고
  • 트랜잭션 경합으로 인해 성능이 저하됨
Repository를 통한 탐색(약한 결합도)
public class Order { @Column(name="SHOP_ID") private Long shopId; } Shop shop = shopRepository.findById(order.getShopId());
  • 비즈니스 로직은 단방향이 조금 쉬운데
  • 조회 로직은 양방향이 막 들어가게 됨

어떤 객체들을 묶고 어떤 객체들을 분리할 것인가? (aggregate 묶는 방법)

  • 함께 생성되고 함께 삭제되는 객체들을 함께 묶어라 → 그렇지 않다면 끊어버려라
  • 도메인 제약사항을 공유하는 객체들을 함께 묶어라
    • 얘가 바뀔 때 굳이 얘가 안 바뀌어도 돼 면 끊기
  • 가능하면 분리하라
  • 비즈니스 룰에 따라 분리가 결정이 됨
notion image
  • 경계 안의 객체는 참조를 이용해 접근
  • aggregate 그룹 사이에는 id로 참조하기
notion image
  • 경계 끼리는 같이 읽고 다른 경계면 다른 Transaction으로
  • 그룹은 트랜잭션/조회/비즈니스 제약의 단위 (하나의 단위로 저장)
 

id로 조회시 발생하는 컴파일 에러

validate할 때,