본문 바로가기

가치관 쌓기69

왜 테스트 코드를 작성하는 걸까? 트레바리에서 혼자 3주라는 아주 짫은 시간에 구독 서비스을 만들었다. 낮밤, 주중/주말을 가리지 않고 정해진 기한 내에 개발을 마치고 싶었다. 여유 없이 기한내에 개발을 하다보니, 스스로 끊임없이 일정을 핑계삼아 올바른 길보다는 빠른 길을 찾으려는 타협점을 끊임없이 찾으려 했다. 트레바리의 개발 문화는 테스트 주도 개발 이라는 (사실 거창한건 아니지만) 문화을 CTO님이 최우선을 둔다. 나 또한 CTO 님의 영향 덕택에 테스트 코드을 마치 습관처럼 작성한다. 테스트 코드의 장점은 CTO 님 덕택에 직접 몸소 느끼고 있다. (장점에 대해서 중심으로 이야기하지는 않을 예정이다.) 구독 서비스을 만들면서 빠른 길을 찾기 위해서 습관처럼 작성하던 테스트 코드을 중간부터는 스킵하고 넘어가기 일쑤였다. 그러다 보니.. 2022. 10. 29.
DB AutoIncrement 가 아니라, 왜 굳이 IDGenerator Server 을 만들었을까? 추가) 관련 IDGenerator 오픈소스을 만들었습니다. ( github link ) 배경 @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; } 위 코드는 어떤 코드인지 짐작이 가는가? JPA 을 학습한 사람이라면 한번에 인지했을 것이다. 데이터베이스에 어떤 데이터을 저장시키기 위해서 데이터베이스에게 오름차순의 숫자을 요청하여 식별자 을 생성해내는 코드이다. 포스팅 제목에서 보았던 IDGenerator 종류의 하나이다. 이 쯤에서 제목에서 말하는 IDGenerator 는 무엇인지 이해할 필요가 있다. 앞에서 이미 언급된 '식별자' 을 만들어 주는 것이 IDGenerator 의 역할.. 2022. 10. 5.
Mockito을 왜 쓰는지 모르겠다? (with. Test Double) 안녕하세요. 렌입니다. 오늘은 우리가 테스트 코드 작성할 때마다 Mockito 을 사용하는데, 왜 사용하는지 대해서 조금 더 깊게 이야기해볼까 합니다. 테스트하고자 하는 객체의 의존성을 격리한다. 라는 것이 우리가 흔히 아는 왜 사용하는지에 대한 답인데요. 여기서 Mocktio 는 Test Double 라는 큰 개념 안에 있는 하나입니다. Test Double에 대해서 알게 된다면 Mocktio 을 왜 사용하는지 조금은 이해할 수 있지 않을까요? When we are writing a test in which we cannot (or chose not to) use a real depended-on component (DOC), we can replace it with a Test Double. The .. 2022. 9. 22.
좋은 테스트에 대해서 이야기 하기 좋은 테스트에 대해서 이야기해볼까 합니다. 여기서 '좋은' 이라는 말은 개발자에게 언제나 고민의 시작이지 않았을까 싶습니다. 직접 테스트 코드를 작성하며 이 책(이펙티브 유닛 테스팅)에서 말하는 좋은 테스트에 대해서 공감이 되는 부분이 몃년이 지나서야 드디어 조금씩 알게되는 것 같습니다. 다음과 같은 주제로 이야기해보려 합니다. _2.1 읽기 쉬운 코드가 유지보수도 쉽다. _2.2 구조화가 잘 되어 있다면 이해하기 쉽다 _2.3 엉뚱한 걸 검사하는 건 좋지 않다 _2.4 독립적인 테스트는 혼자서도 잘 실행된다 읽기 쉬운 코드가 유지보수도 쉽다. 여기서 말하는 읽기 쉬운 코드란 어떤 코드를 말하는 걸까요? 그 가독성은 어떻게 채울 수 있을까요? 가독성 높은 코드? 가독성 이라는 단어는 눈으로는 이해할 수 .. 2022. 9. 18.
엄청 많은 속성을 가진 객체를 테스트해야 한다면 어떻게 해야될까?(with. test Data Builder) SETTLEMENT 라는 결제/환불 원장 프로젝트를 진행하면서 이야기했던 Test Data Builder 에 대해서 이야기해볼까 한다. Test Data Builder(테스트 데이터 빌더)란 어떤 건인가? 테스트 데이터 빌더를 이야기하기 전에 테스트 코드부터 이야기 해보자. 왜 테스트 코드를 작성하고자 할까? 왜 테스트 코드를 작성하고자 할까? 우리는 테스트 코드로서 무엇을 얻기 위해서일까? 어떤 문맥이냐?에 따라 테스트 코드가 우리에게 전달해주는 것은 다를테지만, 이야기하고 싶은 바를 먼저 말한다면- 안도감이다. 테스트 코드 덕분에 마음의 안정을 얻을 수 있다. 그것은 서비스를 개발하는 클라이언트에게 심리적인 안정감을 준다. '그럼 무조건 테스트 코드를 작성해야 되는거 아닌가?' 라는 생각이 드는 사람.. 2022. 9. 9.
야놀자 이준영님, 한기영님과 이야기하며 느낀점 두 분다 실제로 뵌 적은 사실 단 한번도 없습니다. 오직 동영상 속에서만 대화했습니다.(당연히.. 속으로요.) 우연인지, 필연인지 알 수 없지만 이준영님의 Wanted 동영상과 유튜브 채널의 EO 에서 한기영님 관련 동영상을 볼 수 있었습니다. 이준영님의 Wanted 동영상 40대 중반이 돼서야 깨닫고 실천할 수 있게 된 것 - 한기용 1부 이 두 개의 동영상을 보면서 많은 생각을 하게 되더라구요. 비슷한 커리어를 가지셨고, 인생 전반에 대한 진솔한 성찰 듣고 있노라면, 대기업에서 작은 스타트업으로 오면서 했던 저의 고민이 비슷하게 겹쳤습니다. 제가 겪었던 고민과 이준영님과 한기용님 동영상에서 이야기하고 싶은 내용을 비교하며 이야기 하고 싶었습니다. 두 분다 산전수전 많은 경험을 했습니다. 그 산전수전의.. 2022. 7. 24.
적절한 마이크로서비스를 도입하는 시기는 언제일까? 지난 해 9월 트레바리 테크유닛으로 이직을 결정하게 된 주요 이유 중 하나는 마이크로서비스를 직접 구축 할 수 있는 기회에 있었습니다.. 이 후 약 8개월이 지난 이 시점에 '적절한 마이크로서비스를 도입하는 시기는 언제 일까?' 을 고민하는 것은 뒷북일 수 있지만, 이제는 이 부분에 대해서 어느정도 답을 할 수 있는 시점이 아닐까? 싶어 고민하게 되었습니다. 1. 다우기술에 근무할 적 약 90만 라인이 자바 코드가 모듈형 모놀리스 아키텍쳐로서 운영되는 프로젝트를 약 2년 넘게 관리했었습니다. 이 방대한 코드 속에서 마이크로서비스가 말하는 모놀리스 아키텍쳐의 단점을 운이 좋게도 모두다 겪어볼 수 있었습니다. 약 2주에 한 번씩 배포 빈도를 가집니다. 코드가 심각하게 방대해, 도메인에 집중할 수 없어 스파게.. 2022. 7. 9.
이벤트 스토어(?) 이벤트 소싱(?) 를 활용한 View 를 반복적으로 만들고 부수면서 느낀 점 결론부터 말씀드리면 '이벤트스토어를 활용해 내가 원하는 View 를 만들어 내기란 여전히 턱없이 내공이 부족하다.' 입니다. 먼저 이벤트스토어에 대한 이야기부터 해보려 합니다. 그 다음 반복적으로 만들고 부수면서 느낀 점 이야기 해볼까 합니다. 이벤트 스토어란 무엇일까? 이벤트 스토어가 없던 시절의 우리는 데이터베이스에 어떤 행위의 결과값만 포함시켜왔습니다. Actor에 의해 만들어진 어떤 결과물을 의미합니다. 그렇다면 이벤트란 무엇일까요? 사내에서 이벤트라는 용어를 비개발자분들에게 설명하기 위해 사용된 장표를 가져왔습니다. 이벤트는 특정시점에 발생한 어떤 사건을 의미합니다. 그러므로, 이벤트 스토어는 특정시점에 발생한 사건을 저장하는 것을 의미합니다. 이것이 가져다는 주는 이점은 무엇일까요? 1. 바로.. 2022. 7. 3.
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.
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.
트레바리 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.
개발자들이 문서화를 하는 이유는 뭘까? 왜 하는거지? 개발 조직에는 많은 개발 문서가 있다. 그리고 그 중 90%는 폐기 대상이다. - 트레바리 CTO 누군가 트레바리 CTO에게 이런 질문을 했습니다. "쿠팡에 계실 때 개발조직은 문서화를 어떻게 하셨나요?" 문서화... 오늘은 이 문서화에 대해서 이야기해보려 합니다. 이전 근무하던 회사에서도 트레바리와 같은 atlassian의 Confluence를 사용했다. 그 때 사용되었던 형태를 살펴보면 다음과 같은 상황에 사용되었던 것 같아요. - 개발 가이드 - 메인 서비스의 아키텍쳐 - 백엔드 개발자가 프론트엔드 개발자에게 공유할 API - 특정 도구에 대한 사용법 - v1, v2.., deprecated 릴리즈 가이드 - 프로젝트의 계획 및 회고 ... 이전 직장의 서비스는 약 10년동안 숨셨던 서비스였던 만큼.. 2022. 1. 24.
스타텁-시리즈A: 세상에 없던 새로움을 꿈꾸며 [트레바리 독서 모임 후기] 트레바리 독서모임 참여 후기 약 한달 전에 스타텁-시리즈A 를 신청했다. 이 모임을 신청했던 계기는 이번에 대기업에서 스타트업으로 이직하게 되면서, 스타텁의 자세? 스타텁에서 내가 지녀야할 마음에 대해서 알 수 있었으면 좋겠다 라는 마음으로 신청하게 되었다. 첫 모임의 책은 '절대 성공하지 못할 거야' 으로 북리뷰는 여기서 찾을 수 있다. 약 한달 동안 책을 읽고, 강남에 위치한 트레바리 모임에 참여했다. 스타텁 이라는 주제덕분인지, 모임에 참여했던 분이 다양한 분야의 사람들로 채워졌다. 대기업에 다니며 스타텁 회사에 근무를 희망하는 사람, 갤러리 큐레이터, 특정 회사의 인사팀, 순수예술 화가, 스타텁 개발자, 그리고 많은 창업자분들이 참여했다. 작은 공간에 큰 동그란 책상에 모여 '절대 성공하지 못할 .. 2021. 11. 7.
한번에 단계를 뛰어넘어 버리는 비약적인 코드를 피하자. SqsNameMapping 를 구현하는 과정에서 비악이 일어나는 코드를 작성하게 되었습니다. 비약이란? 비약은 논리나 사고방식이 '중간과정을 건너 뛰었다'는 뜻으로, 상대방의 논지전개에 있어 허구성을 지적하거나, 실현가능성이 희박한 내용을 과장하는것을 지적하는 말 입니다. 아래 코드는 2단계를 뛰어 넘어서는 비약된 코드이다. @Component @ConfigurationProperties(prefix = "aws.xxx") public class XxxNameMapping implements Mapping { private Map queue; @Override public String get(String type) { return queue.get(type); } } 왜일까? 1단계 XxxNameMapp.. 2021. 10. 29.