이쯤 되면 어지간히 이슈가 되는 글은 대충 보게 되는 것 같다. (사실 트위터를 해야 완벽하지만 거긴 내 삶을 바쳐야할 것 같은 느낌이라…)
이 수많은 글을 다 읽는 건 아니고,
내가 관심이 가는 주제만 읽고 링크를 저장하는 수준이라서 매우 편향적이고 그 조차도 일부만 여기에 옮겨 놓으려고 한다.
저장 폴더에 몇달 째 쌓여만 있는 글도 허다하다.
그러니 제대로된 기술 뉴스를 접하시려거든 위에 언급한 방법을 쓰시는 게 적당하다는 생각이다.
이전 회사에서 글을 공유할 때는 회사 문화를 바꾸는 데 도움이 되는 글이나, 회사 기술과 더 밀접한 글을 올리기도 했고, 내 글을 열심히 읽는다고 피드백 해주는 사람들이 좋아할 만한 글을 고르기도 했다. 그러니까 나만 좋아하는 글은 공유 안 했다는 말이다. (그…랬겠지?)
이제 내 개인 블로그니까 내가 재밌었고 내가 기억하고 싶은 글만 남겨봐야겠다.
사실 이렇게 기술 공유 글을 어딘가에 저장해 놓으면 내가 다시 찾아보기도 편해서 에버노트에도 꾸준히 백업해 놨었더랬다.
1장에 소스가 들어와서 안될 것은 없지만, DDD 입문서인데 DDD에 대한 정의는 없다는 게 의외다.
중간에 이 책의 대상 독자를 다시 찾아봤다. 요컨대 Spring/JPA는 눈에 익고 DDD를 들어는 봤으나 이해가 안되는 3~4년차 개발자라고 보면 되겠다.
또 하나. AGGREGATE를 동사형으로 애그리게이트라고 발음하면 안되고, 명사형은 [ǽgriget](애그리겥)으로 발음 한다면서 애그리거트라고 부르겠다니 완전 황당했다. 애그리거트라는 글자만 보면 자꾸 신경쓰여 찾아보니 책의 발음기호가 잘못 적힌 것이었다. 실제 발음기호는 [ǽgrigət].
어쨌든.
DDD를 아주 기초만 이해한 상태로 정리를 해보면,
클린코드나 객체지향 원칙을 따르면서 역할을 분리해 나가는 것과 크게 다르지 않다고 본다.
마침 ‘The Clean Architecture’의 번역글을 읽게 됐는데, 여기서도 비슷한 이야기를 하고 있는 것이다.
위 아키텍처의 세세한 부분은 모두 다르지만 매우 비슷하기도 하다. 이들은 모두 같은 목적을 갖고 있는데 바로 관심사의 분리다. 소프트웨어를 계층으로 나눔으로써 관심사를 분리한다. 그리고 모두 비즈니스 규칙을 위한 최소 하나 이상의 계층과 인터페이스를 위한 또 다른 계층을 두고 있다.
그러니까 저 다르면서 비슷한 아키텍처는 다들 고통속에 몸부림치다 이제 그만 열반에 들고자 만들어 낸 사리 쯤으로 봐야하는 건가.
나도 회사에서 (가능하면) 역할별로 클래스를 나누고 컨트롤러에서는 도메인 로직을 제거해나가고 있었는데, DDD에서는 그 역할을 보다 더 분명하게 분리해놨다.
표현 - 응용 - 도메인 - 리포지터리
(곧 떠날) 회사에 만들어 놓은(💩) 코드는 표현만 분리했지 나머지를 뭉뚱그려 놓은 모습이다. 책을 읽다보니 이렇게 네가지로 분리하는 것도 괜찮겠다는 생각이 든다. 애그리거트로 도메인 모델을 묶고, 애그리거트는 응용서비스에서 조합하며, 한 애그리거트에서 다루기 어려운 경우 도메인 서비스를 구성한다.
흠…대충 이런 느낌.
그런데 리포지터리와 모델 매핑 쪽이 이해가 잘 안된다.
리포지터리와 관련된 설명에는 (굳이 프레임웍 의존성을 피하지 않아도 된다면서) JPA를 예를 드는데, 어디까지 DDD와 관련있는지 잘 모르겠다.
그리고 PHP에서는 혹은 엘로퀀트에서는 저 예제를 어떻게 구현하게 될지 전혀 감이 안오는 상태. (JPA도 엘로퀀트도 잘 모르겠어서…)
그리고 현실적으로 단일 애그리거트만 다룰 일은 적을 것이고 수도 없는 bounded context간 통신을 해야한다. 그 더러운 꼴을 보자면 DDD로 개발한다고 뭐 더 좋아진다고 볼 수 만도 없겠지. 그냥 잘하는 사람이 DDD로 개발하면 결과가 좋고 잘하는 사람은 DDD로 안 해도 결과가 좋다는 염세적인 결론이 도출되기도 하지만, 다음 유행이 돌아 또 시스템을 갈아엎기 전까지 어떻게든 제품을 만들고 유지해야 입에 풀칠이라도 하고 살지 않겠는가.
아직 ACL, OHS가 나오는 도표라던가, PHP에서 AOP는 다들 얼마나 쓰고 있는지 궁금한 게 계속 꼬리를 문다.
응용서비스와 도메인서비스의 차이 중에 애그리거트 수정이 발생하면 도메인 서비스에 위치시킨다 정도는 기억해둘만 하다.(아니 겨우 이거 하나 기억했다는 말인가!)
가장 큰 질문은 이거다.
그러니까 이 책을 보고 DDD 감을 익힐 수 있단 말인가? 그 감은 내가 익힌 감이랑 같은 감인가?
그런데 DDD가 뭐더라?
(검색하다 깜짝 놀람. EXID의 노래 ‘덜덜덜’이라니…그러면서 나는 김혜림이란 이름도 기억하고 있다니…)
if (isset($method)) $this->assertEquals($method, $result['method']); if (isset($uri)) $this->assertEquals($uri, $result['uri']); if (isset($version)) $this->assertEquals($version, $result['version']); }
publicfunctionbadStartLines() { return [ [''], ['haha'], ['GET 둘 셋'], ['POST 둘 셋'], ['HEAD 둘 셋'], ['HEAD / 셋'], ['HEAD /index 셋'], ]; }
요청 메시지에서, HTTP는 URI(Uniform Resource Identifier)를 표현하는데 RFC3986표준을 사용한다.
그런데 이 표준을 보고 올바른 URI인지 판별할 생각은 없으므로 상식으로만 알아두자
이정도를 기본 문법으로 정의하고, 이외의 문법으로 요청이 들어오면 서버가 이해하지 못한다는 의미로 400 Bad Request로 응답한다.
이를 기초로 기능을 간단히 정리해보면
CRLF로 문자열을 나눈다 - 첫 요소를 시작줄로 - 이후 빈 문자열이 들어올 때까지 헤더로 - 그 다음 요소가 존재하면 본문으로 인식한다 - 각 요소를 저장할 땐 trim 시작줄은 공백으로 3파트로 나뉘어야 한다 - 메소드 - URI - HTTP 버전 이 파싱 기준을 조금이라도 벗어나면 가차없이 400!!
parseMessage() 메소드 추가
파싱을 시작하라고 요청하는 메소드는 parseMessage()라는 이름이 적당할 것 같고, 이제 테스트를 만들어 나갈 타이밍인데 바로 고민이 생긴다.
토비 이일민 님이 추천하신 책 밀가루 물 소금 이스트라는 책을 읽고 진짜로 한번 해봐야겠다는 생각이 들어 장비를 구입하기 시작.
책이 정말 정말 좋다. 처음에 너무 몰라서 ‘클린 소프트웨어’처럼 느껴지던 책이, (아직 기본빵까지 읽었지만) 두번 세번 읽으니 잘 이해가 된다. 이러다보니 내가 어렵다고 생각했던 책도 두 세번 읽으면 이해가 잘 되었을텐데 왜 그렇게 지쳤었나 모르겠다. 스터디라서 (어쩔 수 없이) 이해하려고 몇번이나 읽었던 책은 확실히 이해도가 높았는데…좋은 책 몇 권 골라서 다시 읽어야 할 듯.
자, 이제 주물 냄비 시즈닝도 마치고, 금요일 첫 베이킹을 앞두고 머릿속으로 쉐도우 복싱 중이다. 유럽식 빵과 우유 식빵 두가지 도전하기로…
유럽식 빵은 밀가루 물 소금 이스트의 레시피를 보고 만들 생각이고
식빵은 후암동 식빵의 레시피를 참고할 것이다.
둘 다 사전 발표를 충분히 해서 만드는 게 공통점이나, 역시 설명은 밀가루 물 소금 이스트만 한 게 없다.
이제 우리 집은 주말엔 빵이 주식이다! (단호)
₩163,500
재료 소개를 하자면, 일부는 방산 시장에서 건져오고, 인터넷으로 산 건 오늘의 로켓 배송으로 모두 도착했다. 진짜 최소한으로 필요한 것만 샀다.
라바 주물 냄비(24cm)는 쿠팡에 87,000원에 뜬 걸 보고 얼른 구매했고, 요리용 온도계와 저울은 드레텍 사의 것으로 각각 12,000원, 21,000원. 오븐용 온도계 8,000원. 1/8까지 있는 계량스푼 4,400원. 실리콘패드 11,250원. 사프인스턴트 드라이이스트 125g 1,900원. 큐원 강력 밀가루 1kg 1,550원 3개, 프랑스 밀가루 T55, T65 각각 1kg 2,500원, 2,900원 2개씩.
총 163,500원. 선방했다. 밀가루 하나는 덧가루용으로 쓰고, 저 6kg 안에서 제대로 하나라도 맛있게 구우면 성공이라고 생각.
(애드센스로 돈 벌 생각 하느니 주위에 빵을 만들어 파는 게 더 빠르겠다)
₩204,600
글을 올리자 마자 혹시나 하고 찾아본 Cambro RFSCW12 모델. 책에서 추천해준 바로 그 반죽통을 아마존보다 싸게 파는 곳이 있는 게 아닌가!