LinkedIn

Clean Architecture와 Spring MVC - 1. 클린 아키텍처

2020. 11. 1. 00:53 | 자바 개발자되기

발단

  • Clean Architecture의 경우 현재 재직중인 회사에 입사 후 처음 알게 됨
  • 이론을 약간 변형한 형태로 사용하고 있으나 핵심인 '쉽게 이해하고, 개발하고, 배포할 수 있는 서비스 개발' 준수하려고 함

갑자기 Spring MVC?

  • 현재 Python Back-end 개발자로 일을 하고 있지만 Java Back-end 개발자로 커리어를 전환하기 위해 최근 Spring Framework 학습 시작

정리하고자 하는 내용은?

  • Clean Architecture에서 이야기하는 설계와 Spring을 공부하며 느낀 차이점을 정리

Clean Architecture

SOLID

  • 클린 아키텍처에 대하여 이야기 할 때 가장 중요한 원칙으로 나오는 'SOLID'
  • SOLID에 대한 자세한 설명은 다른 블로그에 이미 많으니 생략.
    다만 SOLID 원칙의 목적 역시도 '쉽게 이해하고, 개발하고, 배포할 수 있는 서비스'를 만들기 위함

구조

Clean Architecture

Request -> Controller -> Use Case -> Entity(Repository)

Controller

Presentation Layer

  • 사용자로부터 요청이 들어왔을 때 처리를 위한 서비스를 선택하여 호출하는 역할
  • 대부분 HTTP 통신 요청을 처리하는 서비스를 개발하기에 추상화는 하지 않으며 상속의 개념도 일반적으로는 사용하지 않음
  • Controller의 역할은
    1) 요청 데이터 검증 및 직렬화
    2) 서비스(Use Case) 호출
    3) 응답 데이터 Return

Use Case

Domain Layer

  •  실제 요청에 대한 처리 로직을 담고 있는 부분으로 Controller가 Trigger 할 수 있는 하나의 실행 Main Function을 갖고 있음
    • ex) process(), run() ...
  • 서비스마다 중복되는 코드를 줄이는 것이 가장 중요하며 비지니스 로직에 대한 테스트 코드도 디테일하게 작성
    • 중복 코드를 줄이는 가장 쉬운 방법은 함수로 추출하거나 상속을 사용
  • 해당 코드만 봐도 '아~! 이런 처리를 하는 비지니스 로직이구나' 라고 느낄 수 있게 가독성있는 코드를 작성
  • 비지니스 로직을 처리하며 발생 할 수 있는 모든 문제 상황은 Exception Case 작성
    • 테스트 코드 작성 시 Success case 뿐만아니라 특히 Exception case 에 대한 테스트 코드 작성이 중요
  • Use Case는 요청이 들어온 채널이 어느 것인지 알지 못해도 상관없을 정도의 의존성 분리 필요
    • 마찬가지로 어떤 소스로부터 데이터를 얻어왔는지에 상관없을 정도로 Persistence layer 와 분리

Repository

Persistence Layer

  • 데이터 소스로 접근할 수 있는 인터페이스(JDBC, Sqlalchemy ...)를 통하여 데이터 처리 코드를 담고 있는 부분
  • 추상화를 통하여 Dependency inversion을 이끌어내야함
    • Use Case와의 의존성 분리를 위함
  • Python에서는 Abstract Class로 인터페이스 역할을 할 수 있는 클래스를 생성
    • Dependency Injection을 통하여 실제 구현 객체 주입
  • Java에서는 Interface 사용
  • Sqlalchemy와 같은 ORM 방식을 사용 할 때 Data Loading Strategy 고려
    • 실제 업무 진행 시 이 부분을 고려하지 않아 의도치 않은 성능 저하 발생한 적 있음
    • Data Loading 종류는 추후 정리 후 포스팅
  • Raw Query를 작성하지 않는 상황이 많기 때문에 실제 동작되는 Query의 Execute plan을 꼭 확인하여 DB 부하를 줄여야함

의문

Controller 가 Use Case 호출 할 때의 데이터 아규먼트 타입과 리턴 데이터 타입을 어떻게 하는 것이 좋을까?


Request 객체를 전달하게 되면 의존성이 생기므로 전송 데이터 객체(DTO)와 같은 형태로 Wrapping하여 전달.
Return type의 경우 최종 응답 데이터 뿐만 아니라 다양한 정보(Meta data)들을 담아야 하는 상황이 발생할 수 있으므로 Usecase Response 객체를 생성하여 사용

'자바 개발자되기' 카테고리의 다른 글

추상 클래스와 인터페이스  (0) 2020.11.04
Java - Class Loader System과 Static Variables  (0) 2020.11.04
Database CASCADE와 OOP  (0) 2020.11.03
DTO vs VO  (0) 2020.11.01
Clean Architecture와 Spring MVC - 2. Spring MVC  (0) 2020.11.01