신뢰성 향상을 위한 SLO/SLI 도입 3편 - 서비스 적용 사례
SLI/SLO를 서비스 관점에서 정의하고 운영에 적용하는 방법을 정리했습니다. 오류 예산과 대시보드를 활용해 신뢰성과 개발 리소스 균형을 맞추는 사례를 소개했습니다.

SLI/SLO를 서비스 관점에서 정의하고 운영에 적용하는 방법을 정리했습니다. 오류 예산과 대시보드를 활용해 신뢰성과 개발 리소스 균형을 맞추는 사례를 소개했습니다.

도메인에 의존하지 않는 채팅 플랫폼 MessagingHub의 설계와 연동 구조를 소개했습니다. 웹 기반 공통 클라이언트와 정책 분리로 확장성과 이식성을 높였습니다.

LINE은 여러 명과의 대화와 그룹을 ‘그룹 대화’로 통합했습니다. 기능 차이를 줄이고 마이그레이션과 힌트 제공으로 사용자 편의성과 리소스 효율을 높였습니다.

상속 가능한 불변 클래스는 자식 클래스에서 불변성을 깨뜨릴 수 있어 주의가 필요했습니다. 불변성을 보장하려면 상속을 막고 읽기 전용 공통 타입을 사용하는 방식이 안전했습니다.

의존성 주입은 모든 곳에 적용할수록 좋은 것이 아니라 목적이 분명할 때만 쓰는 것이 중요하다고 설명했습니다. 단순 유틸리티나 모델은 내부 생성으로 단순화하고, 주입은 라이프사이클 관리나 구현 전환에 한정할 것을 제안했습니다.

사용자 세그먼트 기반으로 A/B 테스트 그룹을 나누는 동적 분할 시스템을 소개했습니다. 타겟팅·할당·로그 수집 흐름과 실제 활용 사례도 함께 정리했습니다.

LY Corporation이 Central Dogma를 컨트롤 플레인으로 삼아 이기종 환경의 서비스 메시를 연결한 사례를 소개했습니다. 사이드카 없이 Armeria를 데이터 플레인으로 활용해 운영 복잡도를 줄인 점도 다뤘습니다.

테마처럼 값만 다른 경우에는 상속보다 값 객체로 표현하는 편이 더 간결하다고 정리했습니다. Kotlin의 비상속 클래스 특성을 활용해 동적 변경 가능성과 불필요한 로직을 줄이는 방법을 제안했습니다.

LINE 메신저의 대량 푸시 알림을 안정적으로 보내기 위해 Pushsphere를 설계하고 도입했습니다. 재시도, 할당량, 엔드포인트 상태를 함께 고려해 도달률과 운영 안정성을 높였습니다.

준비되지 않은 인스턴스를 잘못 사용하는 문제를 다뤘습니다. 초기화 시 준비, 지연 준비, 타입 분리를 통해 안전한 API 설계를 제안했습니다.

오버라이딩 가능한 범위를 최대한 제한해야 한다는 점을 설명했습니다. 공통 흐름은 부모가 고정하고 자식은 필요한 부분만 구현하도록 분리하는 것이 좋습니다.

중첩 루프를 단순 추출하면 가독성이 크게 좋아지지 않을 수 있음을 설명했습니다. 코드의 의미 단위를 기준으로 재구성해 흐름을 단순하게 만드는 리팩토링을 제안했습니다.

DDD로 Merchant 시스템의 핵심 도메인과 책임 경계를 정리한 구축 사례를 소개했습니다. 클린 아키텍처, 비동기 모듈 구성, ADR과 팀 분리를 통해 확장성과 협업 구조를 설계했습니다.

빌더 패턴은 편리하지만 필수 인수 누락을 런타임에 드러내기 쉬워 더 견고한 대안이 필요했습니다. 특별한 이유가 없다면 생성자나 팩토리 함수로 대체하는 방식을 제안했습니다.

널 객체 패턴은 호출부를 단순하게 만들 수 있지만, 오류 값과 정상 값을 구분해야 할 때는 부적합했습니다. 타입으로 구분 가능한 경우에는 Optional이나 null 같은 정적 표현을 우선 고려해야 했습니다.

책임을 분리하면 코드가 더 깔끔해질 것 같지만, 제약 조건과 의존성이 오히려 흩어질 수 있었습니다. 클래스 분할뿐 아니라 호출자 부담과 결합도까지 함께 살펴야 했습니다.

두 상속 트리의 암묵적 대응 관계가 타입 안전성 문제를 만들 수 있음을 설명했습니다. 상속 대신 컴포지션을 쓰거나 제네릭으로 반환 타입을 명시하는 방법을 제안했습니다.

가변 속성을 개별적으로 바꾸면 이전 값이 남아 버그가 생길 수 있었습니다. 정책 객체로 묶어 상태 갱신 시점과 조합을 제한하는 방식이 더 안전했습니다.
