패스트 캠퍼스 (The Red: 4천만 MAU를 지탱하는 서비스 설계와 데이터 처리 기술 by 카카오페이지 기술전략이사 윤진석) 필기록입니다.
코드레벨에서의 확장성에 대해 알아보자.
프로그래밍 패러다임
절차적 프로그래밍 -> 구조적 프로그래밍 -> 객체지향 프로그래밍
디자인 패턴이란?
베스트 프랙티스(best practice, 모범사례)의 일반화된 디자인 유형
문제를 푸는 것을 패턴화했다고 할 수 있다.
객체 지향 프로그래밍 이후의 점점 복잡해지는 소프트웨어를 해결하기 위해 등장.
Object Composition
객 체 합성 구조를 통해 확장성 획득
"Client"는 동기화 서비스인 SyncService 인터페이스만 바라보도록 한다.
환경이나 요구사항에 동기화 메커니즘을 결정할 수 있도록 구체 클래스를 가지고 있는 형태
이와 같은 Composition의 보조도구로서 Dependency Injection을 들 수 있다.
public class MyThread { SyncService syncService;
Public void setSyncService(SyncService syncService) { this.syncService = syncService;
}
Public boolean syncWithOthers() {
syncService.startSync(); }
.. }
MyThread worker = new MyThread();
SyncService syncService = new RedisSyncService();
worker.setSyncService(syncService); // Dependency Injection
MyThread는 구체적인 클래스의 정체를 알지 못하지만 SyncService를 구현했기 때문에 문제 없이 RedisSyncService를 사용할 수 있다.
이러한 예시가 잘 드러나는 사례가 간편 결제 서비스이다.
이때 코드를 if 분기문으로 설정하였다면 간편결제를 추가 도입시 힘들어질 수 있다.
이를 Object Composition을 이용하면 다음과 같이 설계할 수 있다.
클라이언트는 Payservice를 보고 그 구현체들을 나눈다. PayService만 보더라도 구체클래스들을 알게된다.
함수형 언어
함수형 언어에 대해 살펴보자
앞의 패러다임과는 다른 별개의 진화 과정을 거쳐왔다.
수학의 표기방식과 비슷한 함수형으로 호출할 수 있는 프로그래밍 모델
특히 멀티스레딩, 동시성 이슈 등을 강조하며 동시성 병렬 프로그래밍에 적합성을 증명하면서 등장.
- 이해하기 쉽다
- 디버깅이 쉽다
- 내결함성(fault tolerance)이 높다
- 스레드 안정성이 높다
함수형 프로그래밍에도 디자인 패턴이 필요한가?
-> 객체 지향 프로그래밍과 같은 디자인 패턴은 아니지만 함수형 프로그래밍 디자인 패턴이 있다.
커링 패턴 (Function Composition)
고차함수: 함수를 인자로 받거나 결과로 반환하는 함수
인자값으로 X, Y가 들어가서 X+Y의 결과값을 리턴하는 것이 일반적일텐데
커링 패턴을 사용하면 인자값으로 Function X가 들어감
이를 테면 다음과 같다.
var sum = function sum(x) {
return function (y) {
return x+y;
};
};
자바 8부터 등장한 콜백 패턴 같은 것들이 커링 패턴의 일정이다.
즉 함수의 조합으로 재사용하면서 논리를 표현하는 것
클릭 이벤트를 예로 들어보자.
과거에는 각각 클릭 이벤트들을 구현해야 했지만 함수를 재활용할 수 있는 방식으로 변경되었다.
요약
코드 유지보수성, 재사용성, 그리고 확장성을 위해서 디자인 패턴을 공부하자
'Lecture' 카테고리의 다른 글
대규모 서비스에서 발생하는 데이터 처리, 백엔드 엔지니어링의 역할과 범위 (0) | 2023.07.04 |
---|---|
데이터 모델과 트랙잭션 디자인 / 개별 프로세스 운영 관리 및 배포 시스템 디자인 (0) | 2023.07.03 |
대규모 서비스에서 알고리즘과 자료구조의 중요성 (0) | 2023.07.02 |
확장성과 안정성 있는 서비스 시스템 설계 패턴 (0) | 2023.07.02 |
대규모 서비스에서 발생하는 기술적 이슈 및 장애 사례 (0) | 2023.07.02 |