전체276 야놀자 이준영님, 한기영님과 이야기하며 느낀점 두 분다 실제로 뵌 적은 사실 단 한번도 없습니다. 오직 동영상 속에서만 대화했습니다.(당연히.. 속으로요.) 우연인지, 필연인지 알 수 없지만 이준영님의 Wanted 동영상과 유튜브 채널의 EO 에서 한기영님 관련 동영상을 볼 수 있었습니다. 이준영님의 Wanted 동영상 40대 중반이 돼서야 깨닫고 실천할 수 있게 된 것 - 한기용 1부 이 두 개의 동영상을 보면서 많은 생각을 하게 되더라구요. 비슷한 커리어를 가지셨고, 인생 전반에 대한 진솔한 성찰 듣고 있노라면, 대기업에서 작은 스타트업으로 오면서 했던 저의 고민이 비슷하게 겹쳤습니다. 제가 겪었던 고민과 이준영님과 한기용님 동영상에서 이야기하고 싶은 내용을 비교하며 이야기 하고 싶었습니다. 두 분다 산전수전 많은 경험을 했습니다. 그 산전수전의.. 2022. 7. 24. 안전하게 코드 리팩토링하기 - 1 안전하게 리팩토링하기 SOLID 원칙 중 DIP가 있다. 어떻게 하면 쉽게 리팩토링 할 수 있는지 간단하면서도 강력한 방법을 이야기해볼까 한다. 이것을 아래와 같이 변경한다고 해보자. public class LotteriesFactory { private final RandomNumberGenerator randomNumberGenerator; public LotteriesFactory(RandomNumberGenerator randomNumberGenerator) { this.randomNumberGenerator = randomNumberGenerator; } // 만약 많은 곳에서 해당 코드를 사용하고 있다면 어찌하겠는가 ???????? public String createNumber(){ retu.. 2022. 7. 24. 적절한 마이크로서비스를 도입하는 시기는 언제일까? 지난 해 9월 트레바리 테크유닛으로 이직을 결정하게 된 주요 이유 중 하나는 마이크로서비스를 직접 구축 할 수 있는 기회에 있었습니다.. 이 후 약 8개월이 지난 이 시점에 '적절한 마이크로서비스를 도입하는 시기는 언제 일까?' 을 고민하는 것은 뒷북일 수 있지만, 이제는 이 부분에 대해서 어느정도 답을 할 수 있는 시점이 아닐까? 싶어 고민하게 되었습니다. 1. 다우기술에 근무할 적 약 90만 라인이 자바 코드가 모듈형 모놀리스 아키텍쳐로서 운영되는 프로젝트를 약 2년 넘게 관리했었습니다. 이 방대한 코드 속에서 마이크로서비스가 말하는 모놀리스 아키텍쳐의 단점을 운이 좋게도 모두다 겪어볼 수 있었습니다. 약 2주에 한 번씩 배포 빈도를 가집니다. 코드가 심각하게 방대해, 도메인에 집중할 수 없어 스파게.. 2022. 7. 9. 이벤트 스토어(?) 이벤트 소싱(?) 를 활용한 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. 이전 1 2 3 4 5 6 7 ··· 14 다음 more