224. 안티 코럽션 레이어 (ACL, Anti-Corruption Layer) - 충돌 방지 계층 도메인 주도 설계 레거시 시스템 통합 번역기 파사드 패턴 어댑터

핵심 인사이트: (223번 컨텍스트 매핑 심화) 우리 회사가 최신 클린 아키텍처로 삐까뻔쩍한 [신규 결제 시스템]을 만들었다. 근데 회사 지하 창고에는 20년 전에 짠 썩은 냄새가 진동하는 [구형 레거시 회원 시스템(상류)]이 돌아가고 있다. 신규 결제 시스템이 썩은 회원 시스템에서 데이터를 가져와야 한다. 만약 구형 엑셀 포맷을 내 최신 코드에 그대로 직빵으로 꽂아 넣으면? 썩은 데이터의 악취가 내 최신 코드 1만 줄을 감염시켜 다 같이 썩어 들어간다(데이터 오염). "야! 미쳤냐? 절대 썩은 똥물(레거시 데이터)을 우리 새집에 바로 붓지 마! 두 시스템 국경선 한가운데에 거대한 '방독면 번역기(ACL)' 1대를 무조건 세워!! 구형 시스템이 뱉어낸 썩은 데이터를 저 번역기가 낚아채서, 우리 최신 시스템에 딱 맞는 깨끗한 최신 데이터 포맷으로 100% 세탁(변환)한 다음에 들여보내라!!" 내 순결한 도메인을 똥물로부터 방어하는 절대 격벽, ACL이다.

Ⅰ. 레거시(Legacy)의 역습과 도메인 오염

  • 시스템을 새로 짤 때, 100% 모든 걸 다 새로 짤 수는 없습니다. 필연적으로 옛날부터 돌아가고 있던 '구형 똥통 시스템(레거시)'과 랜선을 엮어서 데이터를 받아와야 합니다.
  • 오염(Corruption)의 발생: 레거시 시스템은 사용자 이름을 user_nm_str_01 같은 끔찍한 구형 변수명으로 씁니다. 이걸 내 최신 자바 코드 안으로 그대로 끌고 들어와서 이리저리 쓰다 보면, 내 아름다운 최신 도메인 코드 전체가 저 끔찍한 구형 변수명으로 도배되어 버립니다(오염 됨).

Ⅱ. 안티 코럽션 레이어 (ACL)의 개념 🌟

  • Anti (방지) + Corruption (부패/오염) + Layer (계층)
  • 개념: 서로 다른 두 바운디드 컨텍스트(특히 최신 시스템과 구형 레거시 시스템)를 연동할 때, 하류(내 최신 시스템) 측의 경계선 앞에 '중간 번역/세탁 계층(ACL)'을 두어, 상류(레거시)의 낡은 데이터 모델과 API 규격이 내 깨끗한 도메인 모델 안으로 침투하여 부패시키는 것을 완벽하게 막아내는 방어 아키텍처 패턴입니다.

Ⅲ. ACL 방독면의 3대 핵심 역할 🌟 핵심 기출 🌟

1. 완벽한 데이터 통역사 (번역과 변환)

  • 구형 레거시가 {"id": 1, "nm": "홍길동", "dt": "20240101"} 이라는 썩은 JSON을 던집니다.
  • ACL 번역기가 중간에서 이걸 낚아채어 껍데기를 다 찢어버립니다.
  • 그리고 내 시스템에 완벽하게 호환되는 순수한 자바 객체 Member(id=1, name="홍길동", date="2024-01-01") 로 예쁘게 세탁(Mapping/Translation)해서 안쪽 도메인으로 넘겨줍니다.

2. 양방향 파사드 (Facade) 패턴의 적용

  • 상류 레거시 시스템은 API 호출 방법도 드럽게 복잡합니다. (로그인하고, 세션 따고, 쿼리 날리고...)
  • ACL 계층이 이 복잡한 호출 헛짓거리를 다 혼자서 처리해 줍니다(파사드 패턴).
  • 내 최신 도메인 코드는 ACL에게 "야, 홍길동 정보 가져와!"라고 단 1줄의 깔끔한 명령만 내리면 끝납니다. 레거시가 얼마나 복잡하게 생겨 먹었는지 내 코드는 1%도 알 필요가 없습니다. (완벽한 은닉)

3. 점진적 시스템 이주 (Strangler Fig Pattern)의 교두보

  • ACL을 세워두면, 나중에 썩은 레거시 시스템을 부수고 새로운 시스템으로 갈아치워도 꿀입니다.
  • 내 최신 로직은 1줄도 건드릴 필요 없이, 국경선에 서 있던 ACL 번역기의 '번역 공식'만 살짝 고쳐주면 되니까 시스템 대공사(마이그레이션)의 리스크가 바닥으로 떨어집니다. (216번 헥사고날 어댑터의 역할과 일맥상통합니다.)

Ⅳ. 언제 ACL을 쳐야 하는가? (트레이드오프)

  • 번역기(ACL)를 거치려면 CPU가 일을 한 번 더 해야 하므로 미세한 속도 저하(오버헤드)가 발생하고, 번역기 코드를 짜는 개발자의 피땀(비용)이 들어갑니다.
  • 하지만 "상류 팀(레거시)이 나랑 협력해 줄 생각이 아예 없는 막가파(독재자)일 때", 내 순결한 도메인 코드가 저 똥물에 침식되어 썩어 들어가는 끔찍한 미래를 막기 위해, 아무리 비싸도 무조건 국경선에 ACL 방탄유리를 세우는 것이 장기적인 유지보수의 절대 정답입니다.

📢 섹션 요약 비유: **ACL(충돌 방지 계층)**은 1급 청정 구역인 반도체 클린룸(내 최신 도메인) 입구에 설치된 **'초강력 에어 샤워 멸균실'**입니다. 클린룸 안에서 작업하려면 밖에 있는 더러운 창고(구형 레거시 시스템)에서 부품을 가져와야 합니다. 만약 작업자가 창고의 먼지(구형 썩은 데이터 규격)를 잔뜩 뒤집어쓴 채로 클린룸 문을 덜컥 열고 들어오면, 클린룸 내부 전체가 먼지로 오염되어 반도체(최신 시스템)가 전량 불량 처리됩니다(도메인 부패). 이를 막기 위해 입구에 멸균실(ACL)을 설치합니다. 작업자가 창고에서 부품을 가져오면, 멸균실 안에서 먼지를 100% 털어내고, 부품을 깨끗한 새 캡슐에 포장(데이터 모델 번역 및 세탁)한 뒤에야 비로소 클린룸 안으로 넣어줍니다. 밖의 세상이 쓰레기장이든 똥밭이든 상관없이, 이 멸균실 번역기 하나만 튼튼하게 버티고 있으면 내 방(최신 도메인 로직) 안쪽은 영원히 순백의 깨끗한 상태(클린 아키텍처)를 유지할 수 있는 궁극의 방패술입니다.