TroubleShooting & Study/Architecture & Design Pattern 4

[RabbitMQ] RabbitMQ를 사용한 분산 서버 간 데이터 동기화

현재 우리 회사의 서비스는 Untitled와 Titled 두 개가 존재한다. 이 서비스들에서 통합 계정을 사용하기 위해서는 인증/인가를 담당할 Auth 서버가 필요해서 총 세 개의 분산된 서버를 운용하게 된다. 문제는 이 서버들이 사용하는 DB 또한 다르기 때문에, 분산된 서버들에서 공통적으로 사용되는 유저 데이터가 동기화될 필요가 있다는 것이다. 이번 글에서는 내가 어떤 식으로 분산 서비스간 데이터 동기화를 구상했는지 알아보겠다      현재 상황 및 방법 선택에 있어서의 기준 정의   먼저, 여러 방법들 중에 우리 서비스에 적용할 방식을 고르기 위해 내가 중요하게 생각했던 기준은 다음과 같다문제를 효율적으로 해결할 수 있어야 한다: 당연하겠지만, 분산 서비스간 데이터를 실시간으로 동기화 할 수 있어야..

[Architecture] Layered Architecture 탈출기 (feat. Hexagonal, Test Code)

개발을 시작하며 기본적인 MVC 패턴과 Layered 아키텍처를 공부한 이후 줄곧 Layered로 백엔드 패키지 구조를 설계했었다. 내가 지금까지 진행했던 프로젝트들은 대부분 데드라인이 있어서 일정 기간 안에 빠르게 끝내야 했고, 내 실력도 많이 부족했기에 테스트코드나 패키지 구조, 고도화 등은 생각조차 하지 못했다. 그러다 최근에 여유가 좀 생기면서 실제로 서비스를 운영해보고 싶다는 생각이 들었고, 좀 더 견고한 서버를 운영하기 위해 테스트코드 작성에 관심이 생겼다. 열심히 여기저기 구글링을 해보고 깃허브도 뒤져가며 테스트 코드를 작성하려 했지만, 내가 진행하던 프로젝트에서는 테스트 코드가 볼륨이 너무 크고 코드 작성 자체가 너무 어려웠다. 아주 작은 기능 하나를 테스트하려면, 서비스 하나에 묶여있는 ..

[Template Method, Strategy, Callback Pattern] 템플릿 메서드 패턴, 전략 패턴, 콜백 패턴

개발을 하다보면 여러 클래스에서 공통적으로 사용되는 코드와 각 클래스마다 다른 구현 사항이 섞여있는 경우를 종종 볼 수 있다. 이 경우 중복되는 코드가 발생하고, 유지∙보수가 힘들어진다. 따라서 문제점을 해결하기 위해 우리는 변하는 코드와 변하지 않는 코드를 분리 할 필요가 있다. 문제는 변하는 코드가 변하지 않는 코드 중간에 섞여있다면 단순히 메서드로 추출하는 것이 어려운 경우가 있는데, 다음의 패턴들을 통해 해결할 수 있다.      Template Method Pattern    템플릿 메서드 패턴은 공통으로 사용되는(변하지 않는) 메서드를 상위 클래스에서 구현하여 템플릿화 하고, 세부 동작은(변하는 코드) 이를 사용하는 하위 클래스에서 각각 다르게 구현하는 패턴이다   AbstractTemplat..

[Proxy Pattern] 프록시 패턴

Proxy  영어로 Proxy는 '대리', '대리인' 이라는 뜻을 가지고 있다. 뜻 그대로 프록시 패턴이란, 원본 객체에 직접적으로 접근 하는 것이 아니라 어떤 '대리자'를 통해서 간접적으로 원본 객체를 사용하는 것을 말한다.  그림을 통해 자세히 알아보자 인터페이스를 구현한 'Origin Object'와 'Proxy Object'가 있다. 'Proxy Object'는 'Origin Object'를 컴포지션하여 멤버 변수로 사용하고있다. 이때 Client에서 요청이 온다면 다음처럼 작동 할 것이다.Client에서 Request를 보냄Controller를 거친 뒤, 'Origin Object'가 아닌 'Proxy Object'를 호출'Proxy Object'는 method A를 구현하고, 기타 작업을 수행..