#acl +All:read = StrongCenter = ''주니어 개발자들을 위한 패턴 언어 - 시스템의 정체성과 안정성을 결정하는 핵심을 먼저 구축하는 법'' <> == The Story 1: The Infrastructure vs. The Bidding (Programming) == 두 명의 개발자, 민수와 하나가 '경매 시스템'을 만들고 있다. '''민수의 접근 (The Infrastructure First):''' 민수는 꼼꼼하다. "시스템은 튼튼해야 해." 그는 1주 차에 로그인과 회원가입을, 2주 차에 로그 기록과 에러 핸들링 프레임워크를, 3주 차에 DB 보안 설정을 마쳤다. 3주가 지났지만, 정작 이 시스템의 본질인 '입찰(Bidding)' 기능은 코드 한 줄도 없다. 민수는 주변부를 튼튼히 하느라 에너지를 다 썼고, 정작 가장 중요한 로직을 짤 때는 지쳐버렸다. '''하나의 접근 (The Strong Center):''' 하나는 본질에 집중한다. "경매 시스템의 핵심은 입찰 경쟁이야." 그녀는 1일 차에 로그인도 DB도 없이 오직 '입찰' 로직만 짰다. "더 높은 가격이 들어오면 낙찰자를 바꾼다." 이 핵심 로직을 중심으로 주문과 결제 기능이 나중에 붙었다. 하나는 시스템의 '''강한 중심(Strong Center)'''을 먼저 세웠고, 주변부는 이 중심을 감싸듯이 추가되었다. == The Story 2: The Hearth of the Home (Ordinary Life) == 민수와 하나는 자신들이 꿈꾸는 '집'을 설계하고 있다. '''민수의 설계 (The Wall First):''' 민수는 집의 외벽과 담장, 그리고 대문의 디자인부터 고민했다. "튼튼하고 멋진 대문이 있어야 안전한 집이지." 민수는 담장을 쌓고 마당을 꾸미는 데 모든 예산을 썼다. 하지만 정작 집 안으로 들어갔을 때, 가족들이 모여 쉴 거실과 주방은 비좁고 어두웠다. 겉모습은 화려하지만 정작 그곳에 사는 사람의 삶이 담길 공간(중심)이 부실한 집이 되었다. '''하나의 설계 (The Living Room First):''' 하나는 가족들이 가장 많은 시간을 보낼 '벽난로가 있는 거실'을 설계의 시작점으로 잡았다. "이 거실이 우리 집의 심장이야." 거실의 크기와 창문의 위치를 가장 먼저 정하고, 그 거실을 중심으로 침실과 욕실을 배치했다. 담장과 대문은 가장 마지막에 거실의 모양에 맞춰 세워졌다. 집의 본질적인 기능(중심)이 확고했기에, 집 전체가 조화롭고 아늑한 공간이 되었다. 진정한 아키텍처는 가장 가치 있는 중심에서 시작됨을 하나는 알고 있었다. == Context == [[OrganicGrowth]]를 시작하려고 한다. 무엇부터 만들어야 할지 고민 중이다. 코딩뿐만 아니라 무언가 복잡한 구조물을 설계해야 하는 모든 상황에 해당한다. 일상적인 상황: * 프로젝트를 시작할 때 로그인, 설정 파일, 유틸리티 함수부터 만든다. * 인프라 설정(Docker, CI/CD, DB migration)에 며칠을 보낸다. * 정작 중요한 비즈니스 로직은 프로젝트 후반부로 밀린다. * 주변부는 화려한데, 핵심 기능이 부실하거나 나중에 전체 구조와 충돌한다. 당신은 지금 집을 지으려는데, 거실과 방(핵심)을 생각하지 않고 담장과 대문(주변)부터 만들고 있다. == Problem == '''핵심 가치를 담은 "중심"이 없으면, 주변부 기능들은 방향을 잃고 비대해진다.''' Christopher Alexander는 "모든 살아있는 구조는 중심(Center)들로 구성되며, 그중 가장 지배적인 강한 중심이 전체의 통일성을 만든다"고 했습니다. * '''본질의 상실:''' 인프라나 부가 기능에 집착하다 보면, 진짜 해결해야 할 문제의 본질적 복잡성(Essential Complexity)을 놓치게 됩니다. * '''중력의 부재:''' 강한 중심이 없으면 다른 기능들이 어디에 어떻게 붙어야 할지 결정하기 어렵습니다. 설계가 표류하게 됩니다. * '''피드백 지연:''' 가장 중요한 비즈니스 로직에 대한 검증을 가장 늦게 받게 되어, 나중에 근본적인 구조를 뒤엎어야 할 위험이 커집니다. == Solution == '''시스템이 제공하는 가장 본질적인 가치, 즉 "강한 중심"을 가장 먼저, 가장 단단하게 구축하라.''' 인프라와 도구는 중심을 돕기 위해 존재하는 조연일 뿐입니다. === Principle 1: Find the Essential Complexity (본질적 복잡성 찾기) === 이 시스템에서 "이 기능이 없으면 존재 의미가 없다"는 것이 무엇인지 찾으십시오. * 쇼핑몰이라면 '결제와 주문'입니다. 메신저라면 '메시지 전달'입니다. 이것이 당신의 '''강한 중심'''입니다. 로그인은 중심이 아닙니다. === Principle 2: Logic-First Construction (로직 우선 구축) === DB, 네트워크, 프레임워크에 의존하지 않는 순수한 비즈니스 로직으로 중심을 먼저 만드십시오. * [[CleanIsolation]]을 사용하여 핵심 로직을 주변 환경으로부터 격리하십시오. 이 중심은 가장 많이 테스트되고, 가장 정교하게 다듬어져야 합니다. === Principle 3: Radiating Growth (방사형 성장) === 중심이 서면, 그 주변으로 필요한 기능들을 하나씩 붙여 나갑니다. * 중심이 강하면(Stable), 주변 기능들은 중심이 제공하는 규칙(Rule)을 따르게 됩니다. * 인프라는 중심의 요구사항에 맞춰서 결정되어야 합니다. 중심이 DB를 선택해야지, DB가 중심을 제약해서는 안 됩니다. == Real Examples == === Example 1: Git === Git의 강한 중심은 '파일의 스냅샷을 관리하는 데이터 구조'입니다. 리누스 토발즈는 처음 며칠 동안 네트워크나 화려한 CLI 대신 오직 객체를 저장하고 읽는 핵심 로직만 만들었습니다. === Example 2: Spreadsheet === 스프레드시트의 중심은 '셀 간의 관계와 자동 계산 엔진'입니다. 화면 UI나 파일 저장 기능보다 이 핵심 중심이 먼저 세워졌을 때 전체 아키텍처가 결정되었습니다. == Common Pitfalls == === "But we need login to start!" === 착각입니다. 로그인 없이도 핵심 기능을 만들 수 있습니다. 하드코딩된 정보를 사용하거나 함수 인자로 넘기십시오. 로그인은 나중에 붙여도 되는 "세부 사항"일 뿐입니다. === The Infrastructure Trap (인프라의 덫) === 특정 프레임워크의 폴더 구조나 설정에 에너지를 다 쓰는 것. 구조는 중심이 성장하면서 자연스럽게 나타나야 합니다. 처음부터 완벽한 틀을 만들려 하지 마십시오. == Connection to Other Patterns == * '''[[OrganicGrowth]]''' - 유기적 성장은 강한 중심에서 시작하여 바깥으로 펼쳐져야(Unfolding) 합니다. ''성장의 닻'' * '''[[CleanIsolation]]''' - 중심을 주변의 소음으로부터 격리하여 순수성을 유지할 때 중심은 더욱 강력해집니다. ''보호막'' * '''[[TwoWorlds]]''' - 문제 공간에서 가장 가치 있는 것을 찾아내어 중심으로 삼으십시오. ''전략적 선택'' * '''[[DataAsFoundation]]''' - 강한 중심은 대개 잘 설계된 데이터 구조라는 단단한 땅 위에 세워집니다. ''기반'' == Signs of Success == * 프로젝트 초기에 가장 어렵고 가치 있는 비즈니스 로직이 이미 해결되어 있다. * 인프라(DB, 프레임워크)를 교체해도 핵심 로직은 거의 변하지 않는다. * 코드를 읽을 때 "이 시스템이 무엇을 하는지"가 첫 화면에서 바로 보인다. * 다른 기능들이 핵심 로직의 인터페이스를 중심으로 자연스럽게 정렬된다. == The Ultimate Insight == '''중심이 서면 전체가 선다. 중심이 흔들리면 모든 것이 흔들린다.''' 주변부의 화려함에 현혹되지 마십시오. 당신이 해결하려는 문제의 가장 깊은 곳, 그 강한 중심을 먼저 정복하십시오. 나머지는 그 중심의 중력에 이끌려 제 자리를 찾게 될 것입니다. ---- CategoryPatternLanguage CategoryProgramming CategoryArchitecture CategoryDesign