본문 바로가기

전체264

[언카피어블] 책을 읽고 이 책은 조용히 묵직하게 메시지를 던진다. 느낀바는 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.
싱글톤(Singleton) 패턴 이해하기 인스턴스를 오직 한개만 제공하는 클래스 1. 간단한 싱글톤 구현 package me.likelen.study.singleton; public class Settings1 { private static Settings1 instance; private Settings1() { } public static Settings1 getInstance() { if (instance == null) { instance = new Settings1(); } return instance; } } 질문 1. 생성자를 private 으로 만든 이유는 무엇인가요? 오직 한 개의 인스턴스에만 접근하기 위해 생성자의 노출을 막기 위해서입니다. 2. getInstance() 메소드를 static으로 선언한 이유는 무엇인가요? 글로.. 2022. 2. 6.
gradle 에서 apply from: xxx 은 무슨 의미이지? apply from: xxx 을 이해하기 위해서는 gradle 의 Plugin 을 알아야 합니다. Gradle 의 Plugin 은 무엇을 하는 걸까요? 프로젝트에 플러그인을 적용하면 플러그인이 프로젝트의 기능을 확장할 수 있습니다. 다음과 같은 작업을 수행할 수 있습니다. - Gradle 모델 확장(예: 구성할 수 있는 새 DSL 요소 추가) - 규칙에 따라 프로젝트 구성(예: 새 작업 추가 또는 합리적인 기본값 구성) - 특정 구성 적용(예: 조직 리포지토리 추가 또는 표준 적용) 프로젝트 빌드 스크립트에 논리를 추가하는 대신 플러그인을 적용하면 많은 이점을 얻을 수 있습니다. 플러그인 적용: - 재사용을 촉진하고 여러 프로젝트에서 유사한 논리를 유지 관리하는 오버헤드를 줄입니다. - 높은 수준의 모듈.. 2022. 2. 6.
gradle 기반의 여러 모듈에서 공통으로 쓰인 스크립트가 있다면? 멀티 모듈 시스템에서 공통으로 쓰인 Gradle Script 가 있다면 어떻게 해야 될까? RootProject | | - SubProjectA | -- build.gradle | - SubProjectB | -- build.gradle | - SubProjectC | -- build.gradle | - build.gradle 여기서 `SubProjectA` , `SubProjectB`, `SubProjectC` 가 build.gradle 에서 공통으로 사용되는 내용이 있다고 가정하자. 약 모듈이 5개정도 만들어지면서 반복되어지는 스크립트를 발견되었고, 코드 복사/붙여넣기가 불편하다고 느꼈다. 어떻게 해야될까? `base.gradle` 을 하나 만들어 전체 프로젝트에 공유하면 되지 않을까? 걱정되는 마음.. 2022. 2. 6.
[나는 왜 이일을 하는가?]을 읽고나서 🧾 트레바리라는 서비스를 통해 이 책을 읽을 수 있었다는 것은 큰 행복이였다. 사실 몃 년전에 구매를 해놨지만 읽지 않았기 때문이다. 이 책은 단순히 사이먼사이넥이 말하는 골든서클(Why, How, What)의 이론을 증명하기 위한 내용만 포함되어 있다고 생각하지 않는다. 내가 하고 있는 이 일을 왜 해야되는 걸까? 라는 질문에 대해서 여러 방향의 정답 찾기 를 도와주는 책이라 생각한다. 현 트레바리 CTO인 완수형과 대화하던 중 이런 얘기를 했었다. "형이 생각하기에 아마추어와 프로의 차이가 무엇인것 같은가? 주니어 개발자와 시니어 개발자의 차이는 무엇인거 같은가?" 라는 질문을 했던 적이 있었다. 이 때 완수형이 말한 얘기중에 인상깊었던 것은 이 부분이였다. "자신의 가치관을 중심으로 코드를 작성했는가?.. 2022. 1. 31.
개발자들이 문서화를 하는 이유는 뭘까? 왜 하는거지? 개발 조직에는 많은 개발 문서가 있다. 그리고 그 중 90%는 폐기 대상이다. - 트레바리 CTO 누군가 트레바리 CTO에게 이런 질문을 했습니다. "쿠팡에 계실 때 개발조직은 문서화를 어떻게 하셨나요?" 문서화... 오늘은 이 문서화에 대해서 이야기해보려 합니다. 이전 근무하던 회사에서도 트레바리와 같은 atlassian의 Confluence를 사용했다. 그 때 사용되었던 형태를 살펴보면 다음과 같은 상황에 사용되었던 것 같아요. - 개발 가이드 - 메인 서비스의 아키텍쳐 - 백엔드 개발자가 프론트엔드 개발자에게 공유할 API - 특정 도구에 대한 사용법 - v1, v2.., deprecated 릴리즈 가이드 - 프로젝트의 계획 및 회고 ... 이전 직장의 서비스는 약 10년동안 숨셨던 서비스였던 만큼.. 2022. 1. 24.
놈이 기다리네요. 끈덕이게. - '아이디어 불패의 법칙' 놈이 기다리네요. 끈덕이게. 틀림없이 금세 먹잇감을 찾아낼 겁니다. 늘 그래왔으니까. 저 이빨을, 저 촉수를 누구도 벗어나지 못합니다. 이렇든 저렇든 실패라는 야수가 우리 모두를 덮칠 겁니다. 제대로 만들기 전에, '될 놈'을 만들어라 트레바리 스타텁-시리즈A 3번째 모임의 책으로 읽게 되었다. 마치, 학교에서 주최하는 특강 세미나에 앉아 "너희가 만약 사업을 해야 한다면?" 이라는 주제의 강의를 듣고온 것같은 착각이 드는 책이였다. 이 책에서 말하고자 하는 것은 글의 마지막 부분에 요약본으로 남기며, 이 책을 읽으며 흥미로웠던 점에 대해서 먼저 적어보려 한다. ✅ 우리가 자주 활용되는 프로토타입과 프리토타입은 무엇이 달랐을까? 연구소에 근무하던 시절 Proof of Concept(PoC)라는 명목하게 .. 2022. 1. 2.
현실을 마주할 용기 - '10년 후 세계사 두 번째 미래' 책을 다 읽어 갈 때 즈음 '닫는 글'에서 공감되는 구절이 있다. '어쩌면 우리는 역사를 통틀어 낙관에 의지해 생존해왔는지도 모른다. 이성이 온통 비관적이라고 말해도 의지로 낙관하면서 말이다' 나도 같은 마음으로 살고 있는건 아닐까? 더 나아가 현실을 마주할 용기가 있는가? 나 자신조차도 '1부 기계와 일 > 인간을 배우는 기계, 기계를 배워야 하는 인간'에서 말하는 흐름 속에서 밀접하게 있음에도 불구하고 이 흐름을 부정적으로 바라보고 있는 내 모습을 발견했다. 나의 직업만큼은 결코 기계에 내어줄 수 없어! 라고 말하곤 하지만, 나의 행위를 지켜보면 이미 기계에 많은 것을 내어주고 있다. 커피숍의 키오스크, 구글의 추천뉴스, 유튜브 등 나보다 나를 더 잘 아는 시스템이 나에게 하는 메시지에 집중하고 있다.. 2021. 12. 19.
Life of Game 을 아시나요? Life of Game 이라는 어플리케이션은 많은 개발자들에게 사랑을 받았다고 합니다. 인생게임이라 불리는 이 게임은 겉으로보면 복잡해 보인다고 느껴지지만, 찬찬히 살펴보면 이런게임이 있을까 싶은 게임이다. 콘웨이에 의해서 만들어진 게임으로 격자가 있는 판에서 시작된다. 규칙 다음 세대로 넘어갈 때 세포들의 생사가 결정되는데, 인접한 8개의 칸을 기준으로 하며 그 기준은 다음과 같다. 죽은 칸과 인접한 8칸 중 정확히 3칸에 세포가 살아 있다면 해당 칸의 세포는 그 다음 세대에 살아난다. 살아있는 칸과 인접한 8칸 중 2칸 혹은 3칸에 세포가 살아 있다면 해당 칸의 세포는 살아있는 상태를 유지한다. 그 이외의 경우 해당 칸의 세포는 다음 세대에 고립돼 죽거나 혹은 주위가 너무 복잡해져서 죽는다. 혹은 죽.. 2021. 12. 7.
잠시 창업자의 마음으로 - '디커플링' 마지막장의 디커플링 책을 내려놓고, 잠시 지금까지의 책 내용을 되돌아 보며 생각한 첫번째 행위는 잠시 나를 내려놓고 창업자의 마음으로 주변 서비스를 둘러보는 것이였다. 책에서 말하는 디커플링이란, 말 그래도 분리하기, 해체하기, 끊어내기이다. 기존의 기업이 고객에게 제공하는 소비 활동 사이를 끊어내는 것을 말한다. 이런 행위를 통해 특정 시장에 파괴적인 혼란을 불러일으켜 혁신적으로 시장을 장악하는 것을 말한다. 책에서 말하는 디커플링의 5단계는 아래와 같다. 1단계: 타킷 세그먼트의 고객 가치사슬을 파악한다. 2단계: 고객 가치사슬을 재정의한 비즈니스 모델에서 말한 가치 유형로 분류한다. 3단계: 고객 가치 사슬 중 약한 부분을 찾는다. 4단계: 약한 사슬을 분리한다. 5단계: 경쟁기업의 반응을 예측한다.. 2021. 11. 28.