본문 바로가기
반응형

전체글587

검증부 (assert / expect)는 하드코딩한다 최근 코드리뷰를 하다가 자주 지적하던 내용이 있어, 정리하게 되었다. 요즘 팀 분들이 가장 많이 하는 실수가 바로 검증부에 도메인 로직이 추가되는 것이다. 이를테면 다음과 같은 구현 클래스가 있다고 해보자. export class FilePath { private readonly _path1: string; private readonly _path2: string; private readonly _path3: string; private readonly _path4: string; constructor(path1: string, path2: string, path3: string, path4: string) { this._path1 = path1; this._path2 = path2; this._path.. 2021. 11. 15.
테스트 코드에서 내부 구현 검증 피하기 테스트 코드를 작성하고 운영하다보면 기존 코드가 조금만 변경되어도 테스트를 다 고쳐야하는 경우가 종종 있다. (모든 경우가 그렇진 않겠지만) 기능의 최종 결과를 검증하는게 아니라 내부 구현을 검증하는 경우에 자주 이런일이 있었다. 내부 구현을 검증하는 테스트들은 구현을 조금만 변경해도 테스트가 깨질 가능성이 커진다. 내부 구현은 언제든지 바뀔 수 있기 때문에 테스트 코드는 내부 구현 보다 최종 결과를 검증해야한다. 그럼, 내부 구현을 검증하는 경우란 어떤 것인지 알아보자. 1. 상세 구현부를 다 검증하는 경우 이를 테면 다음과 같이 합계 금액을 구하는 클래스가 있다고 하자. export class OrderAmountSum { minusSum: number = 0; plusSum: number = 0; .. 2021. 11. 11.
Git에서 원하는 커밋만 제거하기 (feat. SourceTree) Git을 사용하다보면 특정 커밋들만 날리고 싶을때가 있습니다. 근데 하필 그게 한참 전 커밋들이거나, 중간 커밋들이면 reset으로 골라내기가 쉽지 않은데요. 이럴때 rebase interactively 를 사용하기가 좋습니다. 해결방법 예를 들어 아래와 같이 REC-296 커밋 2개를 모두 빼고 싶은 상황이라고 가정해봅니다. 그럼 그 직전 커밋을 선택합니다. 해당 커밋을 우클릭을 하신뒤, Rebase children of ... interactively 을 선택합니다. 그럼 아래와 같이 리베이스 화면이 나오는데, 여기서 삭제를 원하는 커밋을 선택한뒤, 하단의 Delete를 클릭합니다. 그럼 해당 커밋을 삭제 표기가 됩니다. 지우고싶었던 2개의 커밋을 모두 delete를 하고, OK를 누르시면 그때부터 .. 2021. 11. 5.
인프런 수습 회고 수습이 진작 끝나, 사내에 작성한 수습 회고글을 블로그에도 옮깁니다. 전직장에서 되게 확실하게 배운게 하나 있는데, 개발팀이 개발만 하면 망한다 였다. 좀 더 풀어나가자면, 회사를 이루는데는 크게 2가지 축이 있다. 문제를 정의하고 찾아내는 축 CEO(를 비롯한 임원진) / 기획 / PM / 영업 / 컨텐츠 등 문제를 해결하는 축 개발 / 마케팅 / 디자인 등 여기서 문제를 해결해야하는 개발자의 입장에서 개발로만 어떻게든 문제를 해결하려고 한다면 비효율적으로 문제를 해결할 수 밖에 없다. 마치 "망치질밖에 모르는 사람은 모든 것이 못으로 보이는 것" 처럼 말이다. 이게 진짜 고객이 원하는 것일까? 이 기능이 진짜 CS 운영자들분들께 필요한 기능일까? 이렇게 기능 추가하는 것보다 더 많은 고객에게 가치를 .. 2021. 11. 2.
테스트 픽스처 올바르게 사용하기 xUnit에서는 테스트 대상 시스템 (System Under Test, 이하 SUT) 를 실행하기 위해 해줘야 하는 모든 것을 테스트 픽스처라고 부른다. 처음 테스트 코드를 배우게 되면 이 테스트 픽스처 부분에 대해서 완전히 오해하는 경우를 자주 본다. 최근에 팀에 단위 테스트를 전파하고 코드리뷰를 진행하는 과정에서 다들 비슷한 오해를 하고 있는걸 발견하고 작성하게 되었다. 모든 코드는 TypeScript와 Jest로 작성되었다 1. beforeEach (setup) 등 사용할 경우 아래 코드를 보면 공통된 테스트 픽스쳐를 beforeEach 로 처리하였다 describe('Order1', () => { let sut: Order; beforeEach(() => { sut = Order.create(10.. 2021. 10. 30.
NestJS에서 응답/요청 객체 직렬화 (Serialization) 하기 저 같은 경우에 최대한 Dto를 불변으로 만들기 위해 setter나 public 필드는 배제하는데요. 어쩔수 없이 public 필드 (혹은 public setter)를 써야하는 경우 (TypeORM의 Entity 등)를 제외하고는 무조건이다 싶을 정도로 딱 필요한 정도로만 외부 제공용 메소드를 만들어서 사용합니다. 이를 위해서는 Controller에서 사용하는 응답/요청 Dto 객체의 직렬화는 필수로 진행하게 됩니다. 이번 시간에는 이런 상황등을 대비해서 응답/요청 객체의 직렬화 하는 방법을 진행해보겠습니다. 1. 응답 객체 직렬화하기 흔히 소프트웨어 설계에서 이야기하는 응집도(cohesion)와 결합도(coupling)가 있습니다. 좋은 코드 디자인이라 하면, 높은 응집도 / 낮은 결합도로 설계해야 하.. 2021. 10. 24.

728x90
반응형