차세대 클라우드 웹 서비스�보일러 플레이트 개발기
차세대 클라우드 팀 백승주(Becker)
오늘 이야기할 내용
0. 차세대 클라우드 파트에서 하고 있는 일
1. 보일러 플레이트 프로젝트를 시작한 이유
2. 단일 책임을 지키게 하기 위한 노력들
3. 미들웨어를 활용한 횡단 관심사 분리
4. DB Session의 생명주기를 관리하는 코드를 서비스코드 외부에서 관리하는 방법
0. 차세대 클라우드에서 하고 있는 일은?
오픈스택 감싸서 G클라우드 만들기
오픈스택을 통해 G클라우드를 만드는 팀
오픈스택을 통해 G클라우드를 만드는 팀
차세대 클라우드 서비스 아키텍처
1. 보일러 플레이트 프로젝트를 하는 이유?
차세대 클라우드는 춘추전국시대
차세대 클라우드 현황
차세대 클라우드 현황
보일러 플레이트가 필요하다
보일러 플레이트 프로젝트를 통해 기대하는 점
보일러 플레이트 프로젝트를 통해 기대하는 점
로직을 작성하며 마주할 수 있는 기술적인 상황에 대해 공유하고 참고할 수 있는 코드베이스를 만드는 것이 목표
2. 단일 책임을 지키게 하기 위한 노력
의존성 분리/주입 방식을 어떻게 구현했는지
단일 책임이 지켜지기 힘든 상황
단일 책임이 지켜지기 힘든 상황
단일 책임을 지키게 하기 위한 노력
보일러 플레이트에서 하고싶은 내용
단일 책임이 지켜지기 힘든 상황
이전 Layered 구조
Router
Service
Repository
OpenStack Client
OpenStack
Database
단일 책임이 지켜지기 힘든 상황
이전 Layered 구조
Router
Service
Repository
OpenStack Client
OpenStack
Database
단일 책임이 지켜지기 힘든 상황
이전 Layered 구조
Router
Service
Repository
OpenStack Client
OpenStack
Database
단일 책임이 지켜지기 힘든 상황
이전 Layered 구조
Router
Service
Repository
OpenStack Client
OpenStack
Database
단일 책임이 지켜지기 힘든 상황
이전 Layered 구조
Router
Service
Repository
OpenStack Client
OpenStack
Database
단일 책임이 지켜지기 힘든 상황
이전 Layered 구조
Router
Service
Repository
OpenStack Client
OpenStack
Database
단일 책임이 지켜지기 힘든 상황
보일러 플레이트 제안 Layered 구조
Router
Facade
Repository
OpenStack Client
OpenStack
Database
Validation
Service
Service
단일 책임이 지켜지기 힘든 상황
보일러 플레이트 제안 Layered 구조
Router
Facade
Repository
OpenStack Client
OpenStack
Database
Validation
Service
Service
단일 책임이 지켜지기 힘든 상황
보일러 플레이트 제안 Layered 구조
Router
Facade
Repository
OpenStack Client
OpenStack
Database
Validation
Service
Service
단일 책임이 지켜지기 힘든 상황
보일러 플레이트 제안 Layered 구조
Router
Facade
Repository
OpenStack Client
OpenStack
Database
Validation
Service
Service
레이어 분리 적용 예시
단일 책임을 지키게 하기 위한 노력
의존성 주입 메커니즘에 의존하는 클래스
단일 책임을 지키게 하기 위한 노력
의존성 주입 메커니즘에 의존하는 클래스
단일 책임을 지키게 하기 위한 노력
의존성 주입 메커니즘에 의존하는 클래스
단일 책임을 지키게 하기 위한 노력
의존관계를 파악하기 힘들다
Dependency.py
단일 책임을 지키게 하기 위한 노력
의존관계를 파악하기 힘들다
Dependency.py
단일 책임을 지키게 하기 위한 노력
의존관계를 파악하기 힘들다
Dependency.py
단일 책임을 지키게 하기 위한 노력
Dependency.py
의존관계를 파악하기 힘들다
순수한 Python Class를 만들지 못함…
모든 클래스에 Depends 명시
Depends
Depends
Depends...
단일 책임을 지키게 하기 위한 노력
Dependency Injector 를 사용해 의존성 관리하기
dependency.py -> container.py 로 변경
Factory, Singleton, Object, Callable …
단일 책임을 지키게 하기 위한 노력
Dependency Injector 도입 - Container
단일 책임을 지키게 하기 위한 노력
Dependency Injector 도입 - Container
단일 책임을 지키게 하기 위한 노력
Dependency Injector 도입 - Container
단일 책임을 지키게 하기 위한 노력
Dependency Injector 도입 – 의존성 외부 주입
의존성 주입 관련된 코드가 제거됨
단일 책임을 지키게 하기 위한 노력
Dependency Injector 도입 – 의존성 외부 주입
Router 함수 에서만 의존성 주입 관련 코드가 존재
3. 미들웨어로 횡단 관심사 분리
모든 서비스 함수에 적용된 코드를 미들웨어로 보내려면?
서비스 API 횡단 관심사
차세대 클라우드 횡단 관심사
서비스 API 횡단 관심사
차세대 클라우드 횡단 관심사
인증 관련 체크 로직, 이벤트 로그 관련 로직이 모든 코드에 적용
미들웨어로 분리되지 않은 코드
인가 관련 코드
미들웨어로 분리되지 않은 코드
인가 관련 코드
미들웨어로 분리되지 않은 코드
인가 관련 코드
미들웨어로 분리되지 않은 코드
이벤트 로그 관련 코드
- 네트워크 생성 시
- 네트워크 수정 시
- 네트워크 삭제 시
미들웨어로 분리되지 않은 코드
Service 레이어에서 횡단 관심사를 분리하기 위해 적용했던 시도
미들웨어와 Context Var를 사용한다면???
미들웨어로 분리되지 않은 코드
미들웨어와 컨텍스트 변수(Context Var) 적용 방안
미들웨어로 분리되지 않은 코드
미들웨어와 컨텍스트 변수(Context Var) 적용 방안
미들웨어에서 Context Var에 값을 저장/불러오는 방식을 사용해서 서비스 로직에서 횡단 관심사를 분리할 수 있다!
미들웨어로 분리되지 않은 코드
미들웨어 적용 방안
XRequestIdMiddleware
요청 식별자 채번
미들웨어로 분리되지 않은 코드
미들웨어 적용 방안
EventLogMiddleware
이벤트 로그를 발신하는 미들웨어
미들웨어로 분리되지 않은 코드
미들웨어 적용 예시
비지니스 로직
미들웨어로 분리되지 않은 코드
미들웨어 적용 예시
비지니스 로직
미들웨어로 분리되지 않은 코드
미들웨어 적용 예시
비지니스 로직
미들웨어로 분리되지 않은 코드
미들웨어 적용 예시
비지니스 로직
미들웨어로 분리되지 않은 코드
미들웨어 적용 예시
비지니스 로직
보일러 플레이트를 만들면서 들었던 생각들
프레임워크에 대한 필요성?
-> 처음 : 프레임워크가 없는 것에 대한. 아쉬움
-> 지금 : 우리가 만들어가는 느낌, 맨땅에서 배우는 것도 많음
처음 프로젝트를 시작할 때 구조 설계에 충분한 시간이 필요
-> 난개발이 될 수 밖에 없음
-> 설계에 많은 시간이 필요한게 아님
-> 나중에 유지보수하는데 더 많은 비용이 든다고 생각
개선 아이디어를 계속 적용해봐야함
-> 중간 중간 개선 시도가 없었으면, 시도 조차 못해봤을 내용들
-> 팀원들과 소통하고 아이디어를 적용하면서 반영
못다한 이야기…
질문
다른 질문 있으면!🙋♂️