전체273 이벤트 스토어(?) 이벤트 소싱(?) 를 활용한 View 를 반복적으로 만들고 부수면서 느낀 점 결론부터 말씀드리면 '이벤트스토어를 활용해 내가 원하는 View 를 만들어 내기란 여전히 턱없이 내공이 부족하다.' 입니다. 먼저 이벤트스토어에 대한 이야기부터 해보려 합니다. 그 다음 반복적으로 만들고 부수면서 느낀 점 이야기 해볼까 합니다. 이벤트 스토어란 무엇일까? 이벤트 스토어가 없던 시절의 우리는 데이터베이스에 어떤 행위의 결과값만 포함시켜왔습니다. Actor에 의해 만들어진 어떤 결과물을 의미합니다. 그렇다면 이벤트란 무엇일까요? 사내에서 이벤트라는 용어를 비개발자분들에게 설명하기 위해 사용된 장표를 가져왔습니다. 이벤트는 특정시점에 발생한 어떤 사건을 의미합니다. 그러므로, 이벤트 스토어는 특정시점에 발생한 사건을 저장하는 것을 의미합니다. 이것이 가져다는 주는 이점은 무엇일까요? 1. 바로.. 2022. 7. 3. Message Relay 를 PollingPublisher 방식으로 구현하기 이벤트 소싱을 하기 위해서는 트랜잭션 아웃박스 패턴을 구현해야 합니다. 당연히 트랜잭션 아웃박스 패턴에 대한 이해가 있어야 합니다. 다만, 해당 포스트에서는 자세한 트랜잭션 아웃박스 패턴을 다루지 않을 계획입니다. 다시 트랜잭션 아웃박스 패턴를 표현하는 위 그림에서 네모난 부분이 바로 메세지릴레이를 수행하는 곳입니다. 데이터베이스에 특정 데이터가 Insert 되면, 변경분에 대해서 MessageRelay 는 특정 데이터를 읽어 Message Broker 에게 전달한다. 이 때 MessageRelay 의 구현방식은 2가지가 있습니다. 1. Polling publisher 2. Transaction log tailing 1. Polling publisher 는 일정 주기마다 변경분을 조회해서 메세지를 전달하.. 2022. 6. 19. 패턴, 가치, 원칙에 대해서 켄트백의 구현패턴 책에서 나오는 내용을 읽으며, 일부 발췌한 내용이 포함됩니다. 프로그래밍은 무엇일까?왜 개발을 하는 걸까? 분명 처음에는 어떤 성취감에 의해서 분명 접근했었지만, 약 3년이 지난 시점에서 나에게 개발을 하는 이유를 묻는 다면 커뮤니케이션을 잘하기 위해서, 라는 말이 먼저 나오는 것 같다. 그렇다면 (개발 > 커뮤니케이션) 일까? 개발은 생업으로 하다보니 (과거 토이프로젝트 하던 때와는 달리) 내가 혼자 할 수 있는 것은 거의 없더라. 누군가와 협업을 해야만하고 기한내 목표를 달성하는 것 만이 유일한 목표가 되곤한다. '켄트백의 구현패턴' 책은 이런 부분을 마치 처음부터 알고 있듯이 이야기한다.결국 이 책 전체는 커뮤니케이션을 돕는 프로그래밍 기법에 초점을 두고 있다.코드를 통한 커뮤니케.. 2022. 6. 13. 정규표현식에서 알지 못했던 capture group 과 non- capture group val groupMD = """((?:\+|\+-)?[.\d]+)([*/])((?:\+|\+-)?[.\d]+)""".toRegex() fun foldGroup(v: String): Double = groupMD.findAll(v).fold(0.0) { acc, curr -> val (_, left, op, right) = curr.groupValues val leftValue = left.replace("+", "").toDouble() val rightValue = right.replace("+", "").toDouble() val result = when (op) { "*" -> leftValue * rightValue "/" -> leftValue / rightValue else -> throw T.. 2022. 6. 6. REST API 에서 URL은 무슨 의미인지 살짝 맛 본 썰!! 이번에 멤버십 환불/해지 고도화 프로젝트를 하면서 API 에 대한 피드백이 있었습니다. 아래 "/v1/membership" 에 대한 API 는 무엇을 의미하는 걸까요? 잠시 숨을 고르고 천천히 코드를 살펴봅니다. @GetMapping(value = {"/v1/membership"}) public String member(@RequestParam(value = "clubId") String clubId, @RequestParam(value = "userId") String userId, @RequestParam(value = "state") String state) { Member member = membershipGetUseCase.member(UserId.of(userId), ClubId.of(club.. 2022. 5. 19. '멤버십 환불/해지' 프로젝트를 마치며. '멤버십 해지/환불' 고도화 프로젝트를 마치며 [TOC] 이 포스트를 통해 무엇을 말하고 싶은지? 왜 이것을 하게 되었는가? 스스로 생각하길 잘하지 못한 부분 스스로 생각하길 잘한 부분 왜 이것을 하게 되었는가? 트레바리는 오프라인 서비스이다. 대다수의 많은 유저는 약 4번의 오프라인 서비스 이용을 위해 20만원 이상의 금액을 낸다. 20만원 이상의 금액을 사용하는 하는 유저에게는 클럽에 참여할 수 있는 권한. 즉 멤버십 이 생겨난다. 만약, 해당 유저가 '더 이상 모임에 참여를 원하지 않는 경우에는?' 어떻게 되는가? 유저에게는 모임에 참여할 수 없도록 멤버십이 해지되고, 결제한 금액에서 수수료를 제외한 일부 금액을 환불받게 된다. 대부분이 '더 이상 모임에 참여를 원하지 않는 경우' 에 멤버십 해지와.. 2022. 5. 16. 헥사고날 아키텍처(Hexagonal Architecture) 코드로 이해 해보기 EventsJdbcEntityRecordPublishedEventService 이 부분은 '만들면서 배우는 클린 아키텍쳐' 의 책을 보고 배운점과 느낌점을 설명합니다. 헥사고날 아키텍쳐란 무엇인까요? 헥사고날 아키텍쳐는 레이어드 아키텍처(Layered Architecture)의 단점을 해결하기 위해 나왔습니다. 어떻게 해결했는가? 바로 의존성의 역전법칙입니다. 우리가 흔히 아는 레이어드 아키텍쳐는 위에서 아래로 의존성을 가진 형태를 의미합니다. 여기서 만약 의존성 역전 법칙을 활용하면 아래와 같은 아키텍쳐로 변경되어집니다. 이런 형태를 각 계층마다 적용하다 보니, 핵사고날 아키텍쳐의 형태를 띄게 됩니다. 육각형 안에는 도메인 엔티티와 상호작용하는 유즈케이스가 있고, 모든 의존성을 엔티티를 향해 있습니다... 2022. 4. 29. Springboot 에서 react.js 연동시 모든 view 맵핑을 index.html으로 forwarding 하는 방법은? [문제] SpringBoot 에서 thymeleaf 대신, React.js 를 ViewTemplate 로 사용하려 한다. 기존의 thymeleaf 는 html 별로 View을 맵핑하고 있었기 때문에, 하나의 html 에서 URL에 따른 여러 화면으로 라우팅되는 SPA Application 에서는 ViewName 맵핑이 정상적으로 동작되지 않는다. ( 참고자료 ) 예를 들어, product/list 라는 View 이름으로 맵핑을 시도한다고 가정해본다면, 프로젝트에서는 /WEB-INF/templates/product/list.html 와 같은 형태로 ViewTemplate 을 맵핑하기 위한 html 이 존재해야 합니다.(꼭, html 일 필요는 없음) 그러므로, 하나의 html 에서 원하는 URL로 라우팅시.. 2022. 4. 26. Postgresql 에서 epoch time 을 읽을 수 있는 timestamp 변환하는 방법은? 우리가 다루는 시간 중에는 epochtime 이라는게 존재합니다. // epochtime 1970년 1월 1일 00:00:00 UTC 부터 지금까지의 경과 시간을 초로 환산하여 정수로 나타낸 것을 말한다. DB 를 다루다보면, Application 에서 DB 에 데이터를 삽입할 때, application의 date 타입을 Timestamp 로 변환해서 넣는 것이 문제가 되는 경우가 더러 있습니다. 한번만 사용되어지는 DB 라면 더욱더 해당되는데, 종종 ViewTable을 만들기 위한 용도로 만들 경우 약간의 트릭으로 Timestamp 에 넣어야 할 값을 Bigint 타입으로 CREATE Table 한 뒤, 어플리케이션에서 epochtime 으로 값을 삽입합니다. 아래 epochtime 으로 값을 넣을 경.. 2022. 4. 26. [언카피어블] 책을 읽고 이 책은 조용히 묵직하게 메시지를 던진다. 느낀바는 2가지다. '문제를 발견하고 끈질기게 해결한다.'와 '안주함'이다. 책에서 '혁신전략쌓기'를 논리적으로 설명하는데, 논리적이지 않는 나에게 혁신전략쌓기는 이런것 같다. 문제가 있고, 그 문제를 풀기 위한 온 신경을 그곳에 집중한다. 어떻게든 수단과 방법을 가리지 않고 해결하려 한다. 그 문제를 해결하고자 하면 또다른 문제를 발견하게 된다. 그러다 또다시 끈질기게 해결하려고 하다보면 또다른 문제를 발견한다. 이것이 반복적으로 동작됨으로써 아무도 범접할 수 없는 혁신을 만들어 낼 수 있다. 내멋대로 해석해보면, 머릿속에 든 단어는 '존버' 였다. 왜일까? 내가 몸담고 있는 생태계는 가만히 있으면 도태되니까, 내가 해결해야될 문제를 해결하기 위해서는 어떻게든.. 2022. 4. 22. TestContainer의 docker-compose 활용했지만, 테스트가 통과하지 않았다면? - 활용 이전 글 - TestContainer 를 통해 테스트 용이성 높이기 - 입문 TestContainer 를 통해 테스트 용이성 높이기 - 입문 TestContainer TestContainers 라는 라이브러리는 테스트 코드에서 손쉽게 원하는 모듈을 테스트용도로 띄우고 내릴 수 있습니다. // add in build.gradle testImplementation 'org.testcontainers:testcontainers.. happy-coding-day.tistory.com 실제로 TestContainer 를 사용하다보면 예기치 않게 동작되는 경우가 있습니다. docker-compose 를 통해 잘되는 것을 확인하고 난 뒤, 이를 TestContainer 를 활용해 컨테이너를 띄울 경우 이슈가 발생합니.. 2022. 4. 17. TestContainer 를 통해 테스트 용이성 높이기 - 입문 TestContainer TestContainers 라는 라이브러리는 테스트 코드에서 손쉽게 원하는 모듈을 테스트용도로 띄우고 내릴 수 있습니다. // add in build.gradle testImplementation 'org.testcontainers:testcontainers:1.16.3' 그 외에도 아래 모듈을 테스트에서 테스트만을 위한 모듈을 실행할 수 있습니다. 왜? 이 TestContainers 를 잘 알아야 하는가요? 우리가 운영하는 서비스는 많은 MicroSerivce로 이루어져 있습니다. 그리고, 여러 모듈은 각각의 의존성을 갖게됩니다. 구체적인 예시를 살펴볼게요. 위 아키텍쳐에서는 SERVICE-DISCOVERY와 CONFIGURATION-SERVER 를 활용하고 있다고 가정합니다... 2022. 4. 17. Layered Architecture 의 단점이 무엇이라고 생각하는가? 두번째 이야기 첫번째 이야기 ( https://happy-coding-day.tistory.com/189 ) Layered Architecture 의 단점이 무엇이라고 생각하는가? 들어가기 이전 포스팅의 내용이였던 DDD-Lite 동영상 시청 리뷰 의 내용을 정리하다가 문득 궁금증이 생겼습니다. 정명주 강사님께서 `Layered Architecture 의 단점으로 인해, Hexagonal(Onion) Architecture.. happy-coding-day.tistory.com 요즘에는 만들면서 배우는 클린 아키텍쳐라는 책을 읽고 있습니다. 이 책에서는 Layered Architecture 에 대한 단점을 언급하는 부분이 있어, 이 부분 또한 2탄으로 정리할 필요가 있겠다 라는 생각을 가졌습니다. 첫번째 이야기는 20.. 2022. 4. 13. 나쁜 냄새가 드는 한마디 "잠깐만요 코드좀 볼게요." "잠깐만요 코드좀 볼게요" 우리는 언제 이런말을 해봤을까요? 개발 업무를 하며 한번쯤은 우리가 말해봤거나, 반대로 누군가에 의해 들었던 말인데요. 오늘은 이 말이 의미하는 바에 대해서 이야기해보려 합니다. 근무하는 트레바리 테크유닛의 PE셀에서는 간단하면서도 도전적인 첼린지를 했습니다. 플랫폼 관련 업무만 하다 보니 프론트엔드 업무는 해본 적이 없었습니다. 그러다, 우연히 해볼 수 있는 기회가 생겨 약 3명의 개발자가 쿽하게 개발해볼 수 있는 기회가 생겼습니다. next.js 프레임워크에서 간단히 UI Form 이 변경되는 것이 이번 프로젝트의 목적이였습니다. 단, UI Form 이 보여지게 될 때 변경 전/변경 후 UI 가 특정 비지니스 로직에 따라 다르게 보여야만 했습니다. 특정 비지니스 로직? 이번.. 2022. 3. 6. 개발자는 '다형성을 활용한 리팩토링'을 수련해야 한다. 앞선 포스터에서 Interface Segregation Principle (인터페이스 분리 원칙) 에 대해서 이야기했다. 이제 본격적으로 인터페이스 분리 원칙을 함으로써 얻을 수 있는 실용적인 이익에 대해서 이야기해보려 한다. 또한, 인터페이스 분리 원칙과 테스트 코드를 함께 작성함으로써 다형성을 활용할 수 있는 냄새를 맡을 수 있었다. 같이 한번 살펴보자. 아래 테스트 코드에서는 메소드 하나가 너무 많은 역할을 한다는 냄새를 맡을 수 있다. @Test void execute_with_single_notificationTarget() { given(targetProvider.getTargets()).willReturn(List.of(target1)); given(factory.findBy(any()))... 2022. 2. 27. 개발자는 '추상화 이해하기'를 수련해야 한다. 객체지향 프로그래밍에서 객체지향프로그래밍에서 말하는 중요한 원칙이 있습니다. 바로 SOLID 이다. 여기서도 'I' 에 해당하는 Interface Segregation Principle (인터페이스 분리 원칙) 에 대해서 먼저 알아보려 합니다. Interface Segregation Principle(인터페이스 분리 원칙) 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다. User1, User2, User3 가 Ops 클래스에 op1, op2, op3 를 사용하고 있다고 가정합니다. User1 입장에서는 op2, op3 를 사용하고 있지 않음에도 불구하고, 사용할 수 있는 환경입니다. User2 입장에서도 op1.. 2022. 2. 22. [The Nature of Software Development] 을 읽고나서 🔖 이 책을 읽게된 이유는 트레바리 테크유닛으로 이직을 한 뒤로 풀리지 않던 고민이 하나 있었기 때문이다. 코딩은 코딩이다. 개발은 개발이다. 명시적이고, 부담감이 느껴지지 않는다. 그러나 '개발 업무는 개발 업무이다.' 라고 말하는 것에 스스로 부담감을 느꼈던 적이 더러 있었다. 그 이유는 간단했다. '한 가지 개발 업무를 빨리 처리한다.' 라는 개념으로 다가가기에는 기민하게 움직여야 하는 트레바리 테크유닛에서는 쉽게 적용될수 있는 것이 아니기 때문이다. '이 일정까지 동작하는 소프트웨어를 보여주세요.' 라고 말한다. 적당히 일을 쪼갰고, 그 일을 하면 된다. 그런데 문제가 있다. 이 일정까지 동작하는 코드를 단순히 동작되게만 하면 되는걸까? 아니다. 일정한 속도로 테스트 할 수 있는 환경과 기반 그리고 .. 2022. 2. 20. 트레바리 Notifier 프로젝트 회고하기 [Index] 나는 무엇을 개선했는가? 어떤 비지니스 이펙트를 일으켰는가? 새롭게 배울 수 있었던 것은 무엇인가? 아쉬웠던 부분은 어떤 부분인가? 다음 프로젝트에 개선해야될 것은 무엇인가? ✅ 나는 무엇을 개선했는가? 📃 문제점 1. 경직된 소프트웨어 다른 규칙의 SMS 규칙은 불가하다. 문자 발송시기 조정이 불가하다. 일시적으로 SMS 규칙을 중지하기 원한다. 2. 불명확한 시스템 Google Sheet 에서 문자 템플릿을 관리하고 있지만, Fresh 한 상태가 아니다. 이또한 코드로 연결되어 있지 않다. 매번 Senders 웹페이지에 접속하여 발신 내역을 조회하고 / 인증문자을 전송을 확인한다. 3. 잦은 버그 AWS에 의존적인 부분에 대해서 전체 테스트가 불가능하기 때문에 배포하고 나서 기도한다. .. 2022. 2. 20. 개발자는 '지독한 단축키 활용'을 수련해야 한다. 이미 IntelliJ 의 혜택을 받고 있지만, 개발의 리듬을 타기 위해서는 지독한 단축키 활용을 수련해야 한다. 단축키 활용에 있어서 크게 2가지 문맥이 있다고 본다. Index 1. 자주 사용하지만 단축키를 사용하지 않는 경우 2. 단축키를 알지 못해서 사용하지 못하는 경우 2.1 Code Editor 밖에서 2.2 Code Editor 안에서 1. 자주 사용하지만 단축키를 사용하지 않는 경우 자신의 IntelliJ 설치된 Key Promoter X 를 살펴보자. (없으면 설치...) Key Promoter X 에서 단축키 활용 통계를 보면 자주 사용하지만 단축키를 사용하지 않는 경우를 찾을 수 있다. 나의 Key Promoter X 활용 통계는 아래와 같다. 무엇을 알 수 있는가? 자주 사용하지만 단.. 2022. 2. 11. 개발자는 '빨리 나아가지 않는 방법'을 수련해야 한다. 아래는 개발하며 무의식적으로 성급함이 드러난 코드입니다. // NotificationExecutorTest.class; @Test void execute_single() { NotificatorFactory factory = mock(NotificatorFactory.class); Notificator notificator = mock(Notificator.class); envelopeNotification = EnvelopeNotification.of(ANY_ID, NotificationType.SMS, NotificationFactory.create(ANY_SUBJECT, ANY_CONTENTS, ANY_DESTINATION, ANY_SOURCE)); given(factory.findBy(Notifi.. 2022. 2. 9. 이전 1 2 3 4 5 6 7 ··· 14 다음