본문 바로가기

이슈와해결28

마이크로서비스 아키텍처에서 하나의 도메인 서비스에 다른 도메인이 필요하다면 ? 이 글의 탄생 배경 회사에서 작은 회의를 하다가 패키지 구조에 대한 이야기를 한 적이 있다. 패키지 구조 설정에 있어서 "도메인 위주로 할 것이냐 레이어 위주로 할 것이냐"에 대한 논의였다. 그 중, 한 프로젝트 내에서 다른 도메인으로 구분되는 경우, 각 도메인들은 어떻게 통신을 해야하느냐 부분에서 열띤 토론을 한 경험이 있다. 회사의 아키텍처는 마이크로서비스 아키텍처 기반의 사가 패턴이 기본 기조이다. 따라서 서비스는 크게 도메인 서비스와 오케스트레이션 서비스로 나뉘어 움직인다. 이 말인 즉슨... 핵심이 되는 도메인 별로 서비스가 개별 프로젝트로 나뉘고 따라서 도메인 서비스는 일반적으로 패키지 구조가 하나의 응집력 있는 계층 구조를 형성한다. 그렇기 때문에 도메인 서비스에 다른 도메인이 있다? 조금 .. 2023. 12. 13.
자동화 경험 공유 - 코드 생성 도구 JavaPoet을 이용한 클래스 복사, 커스터마이징, 컴파일, 로딩 0. 개요 이 글에서는 자동 코드 생성을 위해 사용해 본 JavaPoet 라이브러리 활용 경험을 공유한다. 이 라이브러리를 사용하여 공통 모델 클래스를 특정 도메인에서 복제하고 자동화 한 과정을 설명한다. 자바 포엣 라이브러리의 기본적인 소개와 간단한 사용 방법에 대해서도 다룬다. 예시 코드는 실제 코드가 아닌 컨셉 코드로 대체하였습니다. 1. 목차 개요 목차 배경 복사 자동화하기 JavaPoet 소개 사용방법 및 예제 코드 구현 결과 컴파일 자동화하기 컴파일과 로딩 과정 효과 및 고려사항 결론 2. 배경 사내에서 개발 프로세스 개선을 위한 자동화 툴을 개발하면서 두가지 추가 요구사항이 발생했다. 첫째, 기존에 A 도메인에서 사용되던 프로세스 검증 자동화 Tool이 B 도메인에서도 활용될 수 있도록 확장.. 2023. 12. 13.
리팩토링 회고 - 검증이라는 관심사의 분리와 복잡성 해결을 위한 노력 0. 개요 한 프로젝트의 취약점을 분석하고 Hotfix를 해야하는 상황이 있었습니다. 그 프로젝트의 코드의 복잡도가 너무 심하다고 느껴 잘못 건드렸다가 더 큰 오류를 낼 것 같을 정도로 고칠 엄두가 나지 않았는데요. 여러 부분에서 리팩토링이 필요했습니다. 본 글에서는 여러 리팩토링 방식 중 검증 방식을 분리하여 단순화하는 내용을 다룹니다. 개선점을 도출하고 이를 해결하는 방안으로서 시도한 과정 및 결과를 소개합니다. 예시 코드는 실제 코드가 아닌 컨셉 코드로 대체하였고 기타 네이밍도 추상화하여 작성하였습니다. 1. 목차 개요 목차 배경 기존 코드 개선점 도출 해결 아이디어 1차 변경 → 애노테이션 방식 2차 변경 → Optional을 이용한 방식 결론 2. 배경 데이터 처리 서비스의 DataHandler.. 2023. 12. 12.
리팩토링 회고 - 복잡한 코드, 중복 코드, 비효율적 코드 개선 경험 0. 개요 본 글은 사내 자동화 툴의 사용성 확장에 대비하여 코드를 개선한 리팩토링 내용을 다룹니다. 처음 설계에서는 특정 도메인만을 대상으로 하였는데 요구사항이 확대되어 다른 도메인에서도 사용하게 된 경우입니다. 이와 같은 비즈니스 요구사항에 대한 대응으로 코드 레벨의 복잡성을 개선한 경험을 공유하고자 합니다. 예시 코드는 실제 코드가 아닌 컨셉 코드로 대체하였습니다. 1. 목차 개요 목차 1차 리팩토링 - Deserializer를 일반화하여 41개의 중복 클래스를 통합하기 문제 정의 목표 설정 리팩토링 전략 결과 및 평가 2차 리팩토링 - enum의 제거와 대안 문제 정의 목표 설정 리팩토링 전략 결과 및 평가 결론 2. 1차 리팩토링 2.1 문제 정의 문제 상황 기존의 Deserializer 구현은.. 2023. 12. 12.
고도화 회고 - 유효성 검증 로직에서 최소한의 변화로 리턴 타입 변경하기 0. 목차 개요 문제점 첫 시도 첫 시도의 문제점 두 번째 시도 두 번째 시도의 문제점 최종 해결 방식 결론 1. 개요 이번 글에서는 유효성 검증 로직에서 변화를 최소화하면서 고도화하는 내용을 다룹니다. 기존 boolean 값만을 리턴하는 로직을 변경해 실패 상세 detail 메시지를 전달하는 것이 목표였습니다. 이를 달성하는 과정에서 시도한 여러가지 방법과 최종적으로 채택한 방식에 대해 소개합니다. 예시 코드는 실제 코드가 아닌 컨셉 코드로 대체하였습니다. 2. 문제점 기존 시스템에서는 다음과 같이 boolean 값을 체크하고 이에 대한 결과를 리턴했습니다. public abstract class Payload { public boolean isInValid() { return !isValid(); }.. 2023. 12. 12.