전체 글(6)
-
TDD 사이클의 단계별 목표
TDD 사이클은 빨강(테스트 작성) → 초록(테스트 통과) → 리팩토링(중복제거) 순으로, 반복적으로 진행한다. 해당 포스트에서는 TDD 사이클의 단계별 목표를 설명한다. 1. 먼저 테스트를 작성한다이 단계는 '인터페이스'를 설계하는 단계이다. 기능의 사용법을 결정하고, 작동 여부를 확인하는 방식을 결정해야 한다. 기능을 사용하는(또는 예외가 발생하는) 구체적인 예제 코드를 생각하는 것이 좋다. 클래스 이름, 메서드 이름, 파라미터 개수 등을 정하고, 테스트 코드로 기능을 사용할 때 불편한 부분이 없는지 확인한다. 테스트 데이터는 대표적이면서 읽기 쉬운 것을 사용한다. 기능의 작동 여부를 확인하기 위해서 객체의 내부 상태를 사용하는 것은 좋지 않다. 테스트 코드에서 객체 내부에 대한 의존성이 생기면, 리..
2024.09.08 -
학습 테스트 (라이브러리 사용법부터 오픈소스 기여까지)
많은 프로젝트에서 외부 라이브러리를 사용한다. 라이브러리는 작업 시간을 아껴주기 때문에 팀원들의 동의가 있고, 해결하려는 문제에 도움이 된다면 사용하는 편이다. [테스트 주도 개발] 책에서는 학습 테스트에 대한 설명이 있다. 학습 테스트는 외부에서 만든 소프트웨어를 처음 사용할 때, 해당 소프트웨어의 기능을 테스트 코드에서 사용해 보는 것을 말한다. 학습 테스트를 작성하면 아래와 같은 효과를 볼 수 있다.라이브러리 사용법을 학습한다문자 그대로 학습 테스트는 라이브러리의 사용법을 '학습'하기 위해서 작성한다. 나머지는 추가로 얻는 보너스 효과이다. 라이브러리는 많은 기능을 제공한다. 이 중에 프로젝트에서 사용하는 기능에 대해서만 학습 테스트를 작성한다. 라이브러리의 모든 기능을 학습 테스트로 작성하는 것은..
2024.09.03 -
TDD로 추상화 로직 설계하기
"TDD로 추상화 로직을 어떻게 설계해야 할까?" 2010년에 [테스트 주도 개발]을 읽고 TDD를 처음 알게 됐지만, 이 질문에 대한 답은 최근에서야 정리할 수 있었다. (그동안 꾸준히 TDD를 사용하지는 않았다. TDD에 대한 믿음과 의심을 반복하며 시간을 보냈다) 용어 정리해당 포스트에서는 아래와 같은 용어를 사용한다. 구현 전 설계: 일반적인 '사전 설계'를 의미한다. 코드를 구현하기 전에 코드 구조를 설계하는 것을 의미한다구현 후 설계: 테스트 코드와 구현 코드를 작성한 후, '리팩토링'으로 코드 구조를 설계하는 것을 의미한다 예시 문제A 시스템과 B 시스템의 데이터를 조회해서 비즈니스 로직을 처리해야 하는 이슈가 있다고 하자. A 시스템은 웹 소켓으로 데이터를 조회하고, B 시스템은 주기적으로..
2024.09.02 -
이펙티브 헥사고날 아키텍처
최근에 [만들면서 배우는 클린 아키텍처]를 읽고, 개인 프로젝트에서 헥사고날 아키텍처를 실험해 봤다. 이번 실험으로 기존에 계층형 아키텍처를 사용하면서 느꼈던 단점에 대한 괜찮은 해결법을 발견했다. 가능하다면 앞으로 진행하는 모든 백엔드 프로젝트에 헥사고날 아키텍처를 적용할 예정이다. 물론, 나중에 더 괜찮은 아키텍처를 발견하면 갈아탈 생각이다. 내가 생각하는 계층형 아키텍처의 단점은 작업자에 따라 비즈니스 로직의 구현 위치가 달라질 수 있다는 점이다. 단순한 계층형 아키텍처는 웹(컨트롤러) → 도메인(서비스) → 영속성(레파지토리) 순으로 의존성이 설정된다. 의존성 방향으로 데이터가 전파되기 때문에, 의존성의 마지막 단계인 영속성 계층에 비즈니스 로직이 쌓일 가능성이 있다. 팀에서 규칙을 정하면 이 현..
2024.08.30 -
안드로이드에서 JSON 파싱하기 [Gson 라이브러리 사용]
최근에 안드로이드에서 JSON 데이터를 파싱할 일이 있었다. 처음엔 안드로이드에서 기본으로 제공하는 API 로 코딩을 했다. 기본 API로 코딩을 해보니 불편한 점이 있었다. 이 문제를 해결해주는 외부 라이브러리를 찾다가 Gson을 발견했다.Gson덕분에 JSON 파싱을 쉽고 간단하게 할 수 있었다. Gson 사용법을 익히면서 알게 된 내용을 공유하기 위해 포스트를 남긴다. 1. 기본 JSON API(org.json.*)의 불편함1.1. Checked Exception을 던진다기본 API를 쓰면서 try/catch 문이 가장 불편했다. 대부분 간단한 형식의 JSON 을 쓰기 때문에 예외가 발생할 상황은 거의 없었다. 하지만 기본 API는 Checked Exception을 던지기 때문에 빈 try/catc..
2015.09.14 -
TDD 예제(점진적으로 설계하기)
TDD의 아이러니 중 하나는 TDD가 테스트 기술이 아니라는 점이다(워드 커닝엄의 선문답이다). TDD는 분석 기술이며, 설계 기술이기도 하다. 사실은 개발의 모든 활동을 구조화하는 기술이다.- 《테스트 주도 개발》by 켄트 벡 나는 TDD가 현업에서도 쓸만한 방법이란 걸 확인하고 싶었다. 그래서 업무와 비슷한 예제를 찾고, TDD로 구현하면 좋겠다는 생각을 했다. 문제는 쓸만한 예제를 찾는 일이었다. 현업과 비슷한 예제를 찾기 위해 두 가지 가정을 했다. 첫째, 대부분의 개발자는 신규 프로젝트를 하지 않고, 기존 코드에 기능을 추가하거나 버그를 수정하는 일을 한다. 나는 기존 코드에 새 기능을 추가하는 예제를 원했다. 둘째, 너무 쉬운 예제는 안된다. 피보나치수열은 TDD 단골 예제이다. 피보나치수열은..
2015.06.04