TDD와리팩토링. 어떻게 연습할것인가?
박재성(자바지기)
넥스트스텝(NextStep)으로1인교육사업
SLiPP(https://www.slipp.net) 커뮤니티운영
이발표에서는"TDD와리팩토링을왜해야하는지알고 있다." 는가정하에진
행한다.
나는개발현장을떠난지6년이되어가고 있다.
이발표의상당수가 구라일수있으니주의해야한다.
TDD와리팩토링. 나는어떻게 연습했나?
2000년대초반JUnit과의만남
해외커뮤니티에서는대단한놈이라는데,
사용법은알겠는데진정한가치는모르는상태로시간이지나감.
테스트주도개발책과의만남
엄청멋져보임.
TDD 기반으로개발하면좀있어보이는개발자일것 같음.
But, 책을읽을때뿐임.
현장의프로젝트에적용하려니막막함이밀려와포기.
리팩토링책과의만남
TDD와리팩토링조합하면내가 지향했던아름다운코드를구현할수있겠다는
희망을가짐.
책과 온라인문서로TDD, 리팩토링연습
연습할때는잘됨.
프로젝트에적용하려니안됨(간단한Util 성격의메소드만가능함)
TDD에대한미련을버리지못하고 현장프로젝트에적용시도
어느순간 mock 프레임워크를활용한테스트가 대부분
Kent Beck은mock 프레임워크없이개발한다던데. 이건 뭐지?
2009년~ 2010년어느날. 볼링점수판과의만남
봄싹스터디에서미션과제로만나게 됨.
너무재미있어코드리뷰전3번, 코드리뷰후1번구현해봄.
내가 꿈꾸던TDD, 리팩토링이가능한경험.
mock 프레임워크사용없이구현가능.
이유는웹프로그래밍이아닌순수자바프로그래밍이었기 때문에가능.
TDD와관련해7, 8년을도전한후에야
테스트하기 쉬운코드와테스트하기 어려운코드를보는눈이생김.
테스트하기 어려운코드를테스트하기 쉬운코드로설계하는감(sense) 이생
김.
2012년부터ATDD + TDD 기반으로SLiPP 개발
무슨짓을해도괜찮은장난감 프로젝트이기 때문에가능.
2014년함수형프로그래밍과의만남
Scheme(LISP 계열의언어)과의만남
함수형프로그래밍스타일을자바에적용해구현하니좀더테스트하기 쉬운코
드를구현하는경험을하게 됨.
2012년~ 현재
학생들교육자료, 스터디하면서수많은예제코드를TDD로구현
재직자대상TDD, 리팩토링교육하면서수많은예제코드를TDD로구현
볼링점수게시판의경우지금까지10번이상은구현
TDD, 리팩토링. 멋져보인다.
하지만생각만큼쉽게 연습할수있는녀석이아니다.
추천하는연습방법
1단계 ‑ xUnit 사용법과 단위테스트연습
Util 성격의메소드에서시작
알고리즘연습할때적용해도좋음
JDK와같이누군가 제공하는api 사용법을익히기 위한학습테스트
2단계 ‑ TDD 연습
게임과 같이요구사항이명확한프로그램으로연습
의존관계(모바일UI, 웹UI, 데이터베이스, 외부API와같은의존관계)가
없이연습
약간은복잡한로직이있는프로그램
적합한구현예제
로또(단, UI는콘솔)
사다리타기(단, UI는콘솔)
볼링게임점수판(단, UI는콘솔)
체스게임(단, UI는콘솔)
지뢰찾기 게임(단, UI는콘솔)
3단계 ‑ 리팩토링과 객체지향설계(또는함수형프로그래밍)
연습
같은요구사항을반복해서연습
연습할때마다제약사항을추가해난이도를높이면서연습
객체지향설계 1단계 제약사항
규칙1: 한메서드에오직한단계의들여쓰기(indent)만한다.
규칙2: else 예약어를쓰지않는다.
객체지향설계 2단계 제약사항
규칙3: 모든원시값과 문자열을포장한다.
규칙8: 일급 콜렉션을쓴다.
리팩토링제약사항
리팩토링과정에서컴파일에러가 발생하지않도록한다.
4단계 ‑ 웹/모바일프로젝트에적용
앞의3단계와병행해연습.
장난감 프로젝트로연습.
5단계 ‑ ATDD와CI 적용
ATDD(End to End 테스트)를적용
지속적통합도구(CI)를적용해지속적인피드백을받을수있는환경 구축
TDD, 리팩토링연습을위해필요한것은?
조급함대신마음의여유
같은과제를반복적으로구현할수있는인내력
나만의장난감 프로젝트
가장필요한것은가보지않는길에꾸준히도전할수있는용기

[OKKY 세미나] 박재성 - TDD와 리팩토링. 어떻게 연습할 것인가?