[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

레이블이 채수원인 게시물을 표시합니다. 모든 게시물 표시
레이블이 채수원인 게시물을 표시합니다. 모든 게시물 표시

2016년 5월 4일 수요일

[EP] Deveiw 2012 후기 #2..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

node.js를 이용한 단일언어 기반 웹 애플리케이션 개발 - Monoglot web application development with node.js - 채수원(NHN)
PHP 를 할때는 5페이지 만드는데 5시간 정도가 걸렸는데 자바로 넘어왔더니 배워야 할 것들이 엄청나게 많았고 5페이지 만드는게 거의 50시간은 걸리는것 같았다. 더이상 이런 어려움을 겪고 싶지 않았고 팀에서 Node.js로 개발을 하면서 실험한 결과를 공유하기 위한 세션이다. Node.js로 만든 프로젝트는 개발자노트였는데 nForge의 서브프로젝트로 위키와 매뉴얼작성을 위한 웹사이트이고 오픈소스로 제공된다. 이번 프로젝트를 한 의도는 모두가 다 Node.js로 삽질을 하지 말고 먼저 삽질한 경험을 공유해서 다른 사람들은 삽질을 줄일 수 있도록 하고 Node.js를 확산시켜보려는 의도가 있고 Spring 말고 다른 것도 써보고 싶었다. Node.js를 사용한 배경은 NHN의 기술투자적 의미가 있으며 개발자들이 여러 플랫폼을 사용하고 있기 때문에 다양항 픈랫폼을 지원하는 개발환경이 필요했고 대부분 PHP를 배경으로 가지고 있기 때문에 스프링은 잘 몰랐던 것도 한 목했다. Node.js는 자바스크립트이지만 Node.js에 대한  레퍼런스가 많이 없기 때문에 고생할 확률이 높고 개발을 하면서 어떤 방법이 좋은지 판단이 어려워서 계속해서 스타일을 바꿔가면서 하게 됐다.


여러가지 오픈소스 모듈을 사용했는데 Node.js로 프로젝트를 할 때 이 정보들이 도움이 되기를 바란다. 그리고 오픈 소스를 사용할 때는 나중에 해결되겠지 하지 말고 반드시 지금 기능으로 가능한지를 판단해서 선택해야 한다.

  • Express : 웹서버는 익스프레스를 사용했는데 문서가 그리 좋지 않은 데다가 개발자인 TJ가 소위 미친 개발자게 가까워서 개발하면서 API를 자주 바꾸곤 한다. 하지만 대안 별로 없는 편인데 최근에는 로드 존슨도 참여한 Meteor이 주목을 받고 있다.
  • Jade : 뷰템플릿엔진으로 JSP보다는 낫고 익스프레스와 궁합이 좋다. 뷰의 코드량은 줄일 수 있지만 마크업 개발자와 협업이 좀 필요하다.
  • CoffeeScript : 커피스크립트에는 자바스크립트의 베스트 프렉티스가 포함되어 있기 때문에 자바스크립트를 잘 모르니까 커피스크립트를 써보자는 생각으로 적용했다. 코드량이 감소하기 때문에 복잡도도 줄어들고 가독성은 증가하지만 디버깅이 지옥이다. 소스맵이 나오기 까지는 디버깅에서 대안이 없기 때문에 직접 오류난 곳을 찾아야 함다.
  • Mocha : 테스트 프레임웍으로 다양한 리포트와 형식을 지원하고 커피스크립트도 지원하고 있다. 그리고 다른 테스트 라이브러리와 같이 쓸 수 있다는 장점이 있다.
  • Jake : 자바스크립트로 개발하므로 빌드도 자바스크립트로 하고 싶었다.
  • Zombie.js : 웹브라우저 에뮬레이터로 브라우저를 실제로 띄우지 않고도 테스트를 할 수 있다. 클라이언트측 자바스크립트 테스트도 할 수 있다.
  • i18n-node : i18n은 이 모듈이 가장 좋으므로 믿고 딴거 쓰지 말고 이 모듈을 사용해라. 최초 등록시 자동으로 메시지 파일이 생기는 등 아주 쉽게 사용할 수 있다.
  • setp, async : Flow Control을 하는 모듈로 콜백으로 인한 코드의 복잡함을 줄이기 위해서 사용하고 step는 깔끔하지만 기능이 아주 간단하고 Async는 기능이 엄청나게 많기 때문에 잘못하면 오용할 가능성도 있다.
  • 개발도구 : Vi나 Sublime Text2 둘중에 하나를 사용해라. IDE도 좀 있지만 크게 도움은 안되므로 그냥 앞에서 얘기한 두 에디터를 사용하느게 낫다.

프로젝트를 하면서 배운 점들은 콜백으로 인한 오류를 조심해야 한다는 것이다. 단순히 콜백으로 연결된 것은 블럭킹 콜백이고 실제 I/O를 사용해서 호출되는 것이 지연콜백인데 사용해야 하는 것은 지연 콜백이다. 블럭킹 콜백을 사용해서 성능문제가 발생하는 실수를 하지 말아야 하고 비동기로 인한 실행순서를 착각하지 않도록 조심해야 한다. 적용해 보니 처음에는 프론트앤드 개발자가 빨리 배우지만 결국 서버 프로그래밍이기 때문에 나중에는 서버사이드 개발자가 더 많이 나아가는 것 같다. 그리고 개인 생산성은 괜찮은 편이지만 자바스크립트 파일을 여럿이 수정해야 하기 때문에 팀 레벨의 생상선을 그다지 좋지 않다.


 시간대에 어느 세션을 들을까 많이 고민하긴 했는데 그냥 이 세션을 선택했는데 아주 좋았다. 난 역시 발표는 참 어려운데 채수원님은 맛깔나게 발표를 잘하신다. 올해내내 개발자노트를 Node.js로 진행한 실제 경험을 나누어 주는 세션이라 실무 프로젝트를 못해본 나로써도 그 내용이 궁금해서 들었는데 실제 사용해본 경험이기 때문에 설득력도 있고 내용이 아주 알찼다. 나중에 들으니 뒤에 좀더 있었는데 얘기를 못하셨다고 했는데 그게 아쉽기는 하지만 듣는 사람들에게 여러 모로 도움이 되었을 꺼라고 생각한다. Node.js세션은 500명이 들어가는 큰 곳에서 진행되었는데 자리가 없어서 주위에 앉을 정도로 사람이 많아서 아직도 인기가 좋구나 하는걸 새삼 느끼면서 11월에 진행될 Node 컨퍼런스도 괜찮겠다 싶었다. ㅎ

Netty Internal - 이희승(Twitter)
Netty는 네트워크 애플리케이션을 빨리 만들 수 있게 해주는 자바 네트워크 어플리케이션 프레임워크로 비동기이면서 이벤트 기반이다. 즉 성능이 좋고 리소스를 적게 사용한다. 그리고 IO를 추상화한 레이어로 API를 제공하고 있기 때문에 코드의 변경없이 NIO, OIO, AIO를 바꿔가면서 사용할 수 있고 이벤트 모델과 쓰레드 모델을 잘 정의해 놓았기 때문에 개발자가 원하는대로 사용할 수 있다. 유연하게 이벤트를 다루기 위해서 bi-directional chain of responsibility pattern을 사용하고 있고 'Separation fo Concerns'가 잘 되어 있으므로 네트워크에만 Netty를 사용하고 프로토콜과 비즈니스 로직은 따로 사용할 수 있도록 설계되어 있다.

이벤트루프는 윈도우의 이벤트 디스패처나 자바의 스윙 이벤트 루프, Reactor와 비슷하다. 사용자의 I/O 요청은 이벤트 루프 스레드내에서 요청했을 경우에는 즉시 처리하고 이벤트루프 스레드 밖에서 요청했을 경우에는 이벤트 루프의 작업 큐에 넣어서 스케쥴링한다. 외부 자극에 반응해서 파이프라인에 알리고 Netty 4에서는 사용자가 원하는 임의 작업을 실행할 수 있다.

파이프라인은 이벤트루프에서 이벤트를 받아서 핸들러에 전달하는 역할을 한다. BiDiCoR(bi-directional chain of responsibility pattern)는 서블릿필터나 데코레이터 패턴과 유사한데 단방향이 아닌 나가고 들어오는 양방향에 모두 적용된 링크드 리스트라고 할 수 있다. 인바운드 이벤트를 이벤트루프가 발생시킨 이벤트로 소켓 연결이나 데이터수신등이 있으며 사용자가 작성한 inbound event handler가 수신할 수 있도록 해준다. 아웃바운드 이벤트는 인바운드의 반대로 쓰기, 읽기, 일시중단 등 사용자가 요청한 동작에 대한 것이다. 사용자가 작성한 outbound event handler가 다른 핸들러에서 요청한 동작을 가로챌 수 있도록 해주는데 최종적으로는 이벤트 루프에 전달되어 실제 I/O가 수행될 수 있도록 해준다.


이벤트 모델에서 기존에는 이벤트를 자바 객체로 만들어서 이벤트가 생기면 자바객체를 파이프 라인에 전달하는 구조로 되어 있었다. 그리고 이벤트 하나를 전달하는데 총 8개의 이벤트가 발생하는데 이는 논리적으로는 문제가 없이만 효율적인지에 대해 의문을 가지게 되었다. GC의 비용이 크지 않다고 판단했지만 극도의 성능이 필요한 곳에서는 이것도 문제가 된다는 것을 알게 되었고 강시에는 JVM의 GC보다 직접 구현한 버퍼풀이 더 좋을 수 있는지에 대한 의문을 가졌고 보통은 직접 구현한게 더 느리다. 하지만 쓰르풋이 높은 경우에는 직접 구현한 버퍼풀의 성능이 더 좋은 경우가 있으며 JVM은 보안상 이슈로 메모리를 모두 0으로 채우는 등의 문제를 처리하면 더 좋은 버퍼풀을 만들 수 있다고 판단하게 되었다. 그렇다면 이렇게 객체와 버퍼를 생성할 필요가 없어진다.

그리고 이벤트가 올때와 닫을 때 각각 3개의 이벤트가 발생하는데 실제적으로는 openBound는 큰의미를 가지지 않았고 실제 사용자가 관심을 가지는 것은 통신을 할 수 있는 상태냐 아니냐는 것이었기 때문에 여기에 맞춰서 개선하기로 했다. 또한 메시지 이벤트의 경우에는 메시지를 프로퍼티로 가지고 있었기 때문에 항상 메모리에 물려있었고 메시지마가 객체가 생기는 구조였다. 그리고 항상 네티가 버퍼를 사용하므로 어떤 버퍼를 사용할 지를 사용자가 제어할 수 없었고 메시지 이벤트는 무조건 하나의 소켓을 사용하도록 되어 있었는데 상황에 따라 연속적인 메시지는 하나의 소켓으로 계속 보내면 성능을 높일 수 있다. 그래서 새로운 이벤트 모델에서는 이벤트를 메서드 호출로 변경해서 새로운 객체를 만드는 대신 이벤트의 해당 메서드를 호출하도록 하였다. 그리고 메시지 이벤트는 제거하고 버퍼에 데이터를 채운 다음에 flush 이벤트로 메시지 이벤트를 대체하도록 하였다.

네티 4의 쓰레드모델은 3.x 대비 이벤트 모델 개성과 함께 가장 중요하고 긍정적인 변화이다. 쓰레드 모델이 필요한 이유는 프레임워크에서 사용자의 코드가 어느 쓰레드에서 언제 실행될 지 충분하고 정확하게 정의하지 않으면 사용자가 방어적으로 코드를 작성해야 한다.
이렇게 잘 정의된 쓰레드 모델로 SSL이 4.0으로 올라가면서 1400라인에서 900라인으로 줄어들었다. 네티는 추상화를 제공하고 있기 때문에 실제 통신을 하지 않고도 통신을 에뷸레이트할 수 있다. 그리고 네티 자체는 가 전송의 정확한 동작을 확인하기 위해서 모든 전송방법과 프로토콜의 모든 조합을 교차테스트 하고 있다.

네티는 이름은 많이 들어봤지만 실제로 써본 적은 없기 때문에 원래는 이시간대에 다른 세션을 들을 계획이었는데 주위에 네티에 관심갖는 사람도 많은데다가 그리 어렵진 않을꺼라는 얘기도 있었고 이희승님의 발표도 듣고 싶어서 들어갔는데 정말 최고였다. 위에서 설명한대로 Netty 4로 개발하면서 했던 고민들과 변경사항들을 설명해 주셨는데 아주 차분한 말투로 조곤조곤 설명하시는데 진행이 술술되서 귀에 쏙쏙 들어왔다.(한편으로는 이터너티님이 생각나기도...)

설명이 어떻게 했는데 왜 그렇게 생각했고 무슨 문제가 있었고 이렇게 바꿨다 식으로 진행되서 정말 이해하기가 좋았다. 한편으로는 Node.js때문에 이벤트루프나 비동기에 대한 사전 지식이 있었기 때문에 어느정도 이해하면서 들을 수 있었던 것 같다. 내 입장에서는 Netty 정도면 상당한 메인스트림급 오픈소스 프레임웍이라고 생각하고 있었는데 이희승님도 Netty 써본사람 손들어보라면서 반가워 하는걸 보고 다 비슷하구나 하는 생각이 들었다. Netty를 만든 이희승님이 직접 Netty를 설명해 주시는 기회를 놓치지 않아서 아주 다행이다.

Epilogue
컨퍼런스를 많이 다니다 보니 예전에는 공부하러 갔지만 요즘은 공부하러가는거 반, 사람들 보러가는거 반하면서 간다. 컨퍼런스는 한편으로는 축제의 장이라고 생각하는데 국내 컨퍼런스는 쉬는시간이 너무 짧아서 아쉽다. 특히 이번처럼 트랙을 이동하는 컨퍼런스에서는 쉬는시간 10분은 정말 화장실 갔다가 다른 세션으로 이동하기도 벅찬 시간인데 좀 여유있게 진행되었으면 좋겠다. 그래서 자체적으로 2개 세션을 듣고 딱히 관심가는게 없던 한 세션을 그냥 푹~ 쉬었다.(학교 수업들으러 온 건 아니니까...)

실망스럽다는 얘기도 많이 들었는데 어차피 컨퍼런스는 세션이 핵심이고 그런 면에서 세션들의 수준은 꽤 괜찮은 편이라고 생각해서 만족하고 있다. 그리고 Deview에서 의도했는지는 모르겠지만 메인스트림이라고 하기는 어려운 루비, 스칼라, 노드를 이런 대형 컨퍼런스에서 들을 수 있어서 상당히 반갑고 이런 기술들의 확산에도 꽤 도움이 되었으리라고 생각한다. 


2016년 3월 17일 목요일

[EP]2010 한국 자바 개발자 페스티벌 #1..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

지난 10일(토)에 JCO에서 주관하는 2010 한국 자바 개발자 페스티벌이 이화여대 ECC에서 개최되어서 갔다가 왔습니다.

행사 일정표


운영의 아쉬움
JCO의 컨퍼런스는 작년 10회 컨퍼런스 [해당 포스팅은 옮겨오지 않았다.. 이유는 잘 모르겠넹;;] 때 처음 참가해 보았다가 올해는 언제하나 많이 기다려던 행사였지만 좀 짚고 넘어갈 건 짚고 넘어가야되겠습니다. 사실 저는 컨퍼런스나 세미나는 주목적이 세션을 들으러가는 것이기 때문에 괜히 거창하게 하는 행사에는 그다지 관심은 없는 편입니다. 하지만 이번 JCO의 행사는 운영이 좋다 나쁘다 말하기를 떠나서 운영자체가 없는 느낌이었습니다. ㅡㅡ;;

멋진 ECC에 도착해서 "오~ 좋다~"는 감탄을 했지만 어디서도 자바 개발자 페스티벌이 개최된다는 포스터등은 볼 수가 없었고 다같이 ECC를 미로처럼 돌아다닌 끝에 겨우 A4지에 "Track 2"라고 적혀져있는 것을 찾아냈습니다. 겨우겨우 물어서 제가 신청한 Track 4를 찾을 수 있었습니다. 각 세션이 이뤄지는 장소 앞에 책상만 하나 있었을 뿐 JCO 행사라는 표시는 전혀 붙어있지 않았고 특히 ECC라는 건물이 대칭적으로 내부는 다 비슷비슷하게 생겨서 처음가보는 사람은 원하는 장소를 찾기가 어려웠음에도 행사장에 대한 표시같은 것은 전혀 없었습니다. 저는 아는 사람들도 꽤 있어서 물어물어 트랙을 찾아다녔지만 혼자서 처음 오신 분들은 꽤 고생을 하셨지 않을까 합니다.(저만 헤메인건 아니겠죠? ㅡㅡ;;) 그럴만한 장소도 아니었지만 당연히 있을꺼라고 생각했던 출판사나 업체들의 부스도 없더군요.(이건 꼭 있어야 하는 것은 아니지만 없으니 행사자체가 너무 조용한 느낌이 있었습니다.)

이화여자대학교 ECC
멋지게 생겼던 이대 ECC

사전에 등록을 할때 트랙을 선택을 하기는 했지만 비공식적으로 그냥 수요도파악정도라는 얘기를 들었길래 이전에 참가해봤던 다른 컨퍼런스와 마찬가지로 당연시 시간별로 트랙을 옮겨다닐 생각을 하고 있었지만 막상 도착을 하니 각 트랙이 장소가 꽤나 떨어져 있었고 공식적으로는 트랙간의 이동을 허용하지 않는다는 얘기를 들었습니다. (운영상의 이슈인지는 모르겠지만 별도의 관리조차도 없는 상황에서 이건 상당히 무리한 요구라고 생각되었습니다. 어떻게 관심사가 한 트랙에 다 집중될수가 있을런지요.)

가서 분위기를 파악해 보니 전체 트랙을 다 맡지는 않더라도 각 트랙을 주도하는 커뮤니티들이 있었습니다.(제가 참가한 Track 4는 KSUG의 주도하고 있었습니다.) 트랙별 신청명단과 장소만 커뮤니티에 제공되고 해당 커뮤니티에서 알아서 운영하는 분위기였는데 명단에 이름만 있고 소속도 써있지 않은 관계로 동명이인의 경우 등록에 어려움도 있었고 등록한지 몇주 되었기 때문에 자신이 어느 트랙으로 신청했는지 정확히 기억해내지 못하는 사람들은 자신의 이름을 찾아 멀리떨어져있는 트랙 발표장들을 돌아다녀야 했습니다. 각 트랙은 그냥 각 커뮤니티가 운영을 하는 분위기였기 때문에 미처 알지못하고 커뮤니티에서 도와줄 사람들을 모집해오지 못하신 곳은 발표자분들이 등록데스크를 직접 지키고 계시더군요.(안타까움과 그분들의 헌신에 눈물이... ㅠㅠ)

올해 제가 속해있는 봄싹이 JCO에 합류하게 된 관계로 이름만 알고 있던 작년에 비해서는 JCO에 상황을 약간이나마 알고 있기는 했지만 JCO는 외부에 거의 드러나지 않는 조직(제가 느끼기에)인데다가 그래도 Java에서 JCO라는 이름의 위치가 있기에 기대하고 오신 분들에게 생각치 못했던 이런 운영은 좀 실망스럽지 않았을까 생각합니다.(시간표에는 폐회도 있었는데 그냥 4세션끝나면 그냥 집에가는거더군요.) 물론 이번 페스티벌을 위해서 TFT가 조직 된 것으로 알고 있고 다들 본업이 있으신 가운에 이런 규모의 행사를 준비하는 것이 보통일은 아닐 거라고 생각하고 있지만 이번 행사의 운영에 대한 부분은 여러가지로 아쉬움이 많이 남았습니다.

테스트가능한 소프트웨어 설계와 TDD작성패턴 - 채수원
Track 4의 1세션이면서 얼마전에 TDD 책을 출간하신 채수원님의 세션이었습니다. 책을 출간하신지 얼마 안되었기 때문에 발표는 TDD책에 포함된 내용의 프리뷰 혹은 축약적인 형태의 발표였고 전 얼마전에 책을 읽고 참가를 했기 때문에 복습하는 기분으로 가볍게 들었습니다.(책을 쓰면서 세션발표를 위해서 비기를 숨겨두진 않았을때니 이런 책의 축약형태의 발표는 당연한 부분이라고 생각하고 있습니다.)

발표 PPT발표 PPT발표하시는 채수원님

토요일날 이렇게 세션을 듣기 위해서 이자리에 나와있는 이유는 "보다 더 나은 소프트웨어와 보다 더 나은 삶을 만들기 위해서..."입니다. 일반적으로 개발을 하면 먼저 언어를 공부하고 프레임워크를 공부한 뒤에는 컴퓨터 공학을 공부하면서 객체지향 원칙이나 디자인 패턴등을 공부하게 됩니다. 더 나은 소프트웨어를 만들기 위해서 이지만 이런 것들을 공부해도 잘 되지 않습니다. 간단한 예제 소스를 보고 의존성이 더 많이 들어있는지에 대한 여부는 파악하기 쉽지만 어렵고 복잡한 소스들에서는 쉽게 파악하기 어렵고 경력이 쌓여도 어디가 문제라도 바로 짚어내기 어렵습니다. 이런 것은 이론으로만 공부를 해서입니다.

이 간극을 가장 쉽게 해결할 수 있는 것이 경험상으로 TDD입니다. TDD는 TDD를 하는 것 자체가 목적이 아니라 더 나은 디자인을 하기 위해서 이며 TDD를 하면 쉽게 어디가 문제라는 것을 찾을 수 있게 됩니다.

안좋은 디자인의 징후

  • 단위 테스트 케이스 작성이 어렵다.
  • 단위 테스트 케이스가 자주 깨진다.
  • 단위 테스트 케이스 실행을 위해 준비해야 할 것이 많다.
  • 다른 사람의 테스트 케이스를 읽기가 어렵다.(코드를 읽기 어려운 것이 자신의 실력이 떨어져서인 경우는 많지 않습니다.)

프로그래밍 언어는 계속 발전을 하는데 이것은 인간을 위해서입니다.

기초 점검

  • 프로그램을 작성하기 전에 테스트를 먼저 하라 (Test the program before you write it.)
  • 잘 동작하는 깔끔한 코드 (Clean code that works) : TDD의 목표를 자동화된 테스트를 만드는 것으로 하는 경우도 많은데 TDD의 목표는 잘 동작하는 깔끔한 코드를 만드는 것입니다.
  • 질문 -> 응답 -> 정제 -> 반복 (Ask -> Respond -> Refine -> Repeat)

기본 코스
생성자 메소드 테스트 (Constructor Method Test)
처음 TDD를 할 때 여러가지 걸리는 부분들이 있는데 생성자가 가장 먼저 걸리는 부분 중 하나입니다. 꼭 정답이 있는 것은 아니지만 일반적으로 생성자 테스트는 포함시키지 않고 생성자에 비즈니스 로직이 들어가 있을 경우에만 테스트를 합니다.

동치 비교
TDD는 자신이 원하는대로 동작을 하는가에 대한 테스트인데 인스턴스에 대해서 assertEquals로 비교할 경우 레퍼런스이기 때문에 일반적으로 실패를 하게 됩니다.
이에 대한 해결책은 아래의 방법들이 있습니다.

  • 내부 상태를 꺼내와서 각각 비교
  • toString을 오버라이드해서 비교(약간의 꼼수같은 느낌이 있습니다.)
  • 객체에 equlas메서드를 구현(하지만 이것은 제대로 만들기가 어렵습니다. Effective Java에 보면 여러장에 걸쳐서 자세하게 설명하고 있을 정도지만 의도상은 이렇게 비교하는 것이 가장 적합합니다.)
  • Unitils의 assertReflectionEquals를 이용
배열 비교
  • JUnit 4의 assertArrayEquals를 이용
  • Unitils의 assertReflectionEquals나 assertLenientEquals를 이용
  • List로 변환해서 비교
몇가지 오해
  • TDD와 UnitTest는 다르다. : UnitTest는 자동화에 대한 부분이고 TDD는 개발방법론입니다.(그렇다고 다른 사람이 같은 의미로 사용한다고 지적질(?)하는 것은 한번쯤 생각해 보고 하기를 권하셨습니다. ㅎ)
  • (Do) All or Nothing : TDD를 하기로 하면 모든 것을 다 TDD로 하려고 하는데 그러지 않는 것이 좋습니다. 다 적용하지 말고 로직이 복잡하거나 만들기 어려운 것 위주로만 해도 충분합니다.
Skeleton vs Incremental
테스트 케이스마다 메서드 하나씩 만드는 것을 권장합니다. 스켈레톤은 테스트가 깨지지 않을 정도의 껍데기 클래스를 만드는 것으로 나쁜 방법은 아니지만 숙련자가 아니면 권하지 않는 방법이고 숙련자라고 하여도 간단한 부분에만 쓰는 것이 좋습니다.

One method one assert : 이렇게 만드는 것이 좋지만 실제로 하기는 약간 어렵습니다.

Anti-pattern
테스트를 만들 때 테스트 메서드 하나가 그 안에서 완결되고 시나리오가 되는 것이 좋습니다. setUp의 픽스쳐를 이용할 수도 있지만 문맥을 이해하기 어려우면 각 테스트안에 초기화부분이 포함되는 것이 좋을 수도 있습니다.

상태기반 vs 행위기반
결과값을 비교하는 것이 상대기반의 테스트이고 간단하게 읽히고 가장 많이 쓰이는 방법입니다. 행위기반은 결과값이 아닌 특정메서드가 호출되었는가를 확인하는 방법입니다.

항상 생각만 하고 있던 TDD인데 최근에 자극도 많이 되었고 개발에 적용할때 도움이 될 책도 나왔기에 올해는 좀 적극적으로 적용을 하고 수련을 해봐야겠습니다.(말로만 끝나지 않아야 할텐데요. ㅎ) 그동안 막연히만 알고 있고 좀 잘못알고 있던 내용들도 있는데 최근에 많이 정리가 되어서 좋군요.

[Book] 테스트 주도 개발 : 고품질 쾌속개발을 위한 TDD 실천법과 도구..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

테스트 주도 개발 : 고품질 쾌속개발을 위한 TDD 실천법과 도구 - 10점
채수원 지음
한빛미디어

TDD라는 말을 들으면 누구나 가장 먼저 떠오르는 사람은 창시자인 켄트 벡(Kent Beck)일 것이고 그 다음은 명저중의 하나인 TDDBE(Test Driven Development: By Example)라는 책일 것입니다. 물론 TDDBE에서는 TDD에 대한 소개부터 어떻게 TDD를 이용해서 개발을 하는지 예제와 함께 다양하게 설명해 주고 있기는 하지만 책을 읽고 TDD 해야겠다라는 생각이 들더라도 막상 실제 개발에 써먹으려면 어디서부터 어떻게 적용을 해야할지 막막한 것이 사실입니다.(저같은 경우가 그랬습니다. TDD의 사상은 공감하지만 정작 적용까지는 쉽지 않은...)

현재 국내에는 일부 테스트관련 툴에 대한 책이나 테스트 패턴관련 책들은 있지만 TDD에 대한 책은 TDDBE가 거의 유일한 상황에서 이 책은 가뭄속에 단비와 같은 책이 아닌가 생각합니다. 운좋게 이 책의 베타리더로 참여를 하게 되면서 미리 읽을 기회를 가질 수 있었는데 베타리팅때의 거친 느낌에 비해서 전체적으로 학습하기에 좋은 깔끔한 흐름으로 완성이 된 듯 합니다.

책의 내용은 TDD의 소개와 함께 간단한 예제를 통해서 어떻게 TDD로 어떻게 개발을 해야하는가에 대한 설명부터해서 TDD를 더 쉽게 적용하고 극대화할 수 있도록 하는 JUnit과 Matcher라이브러리 Hamcrest를 이용하는 방법들, 그리고 의존성을 없애고 테스트를 할 수 있는 Mock에 대한 설명 및 Mock 프레임워크들, 데이터베이스 테스트를 위한 DBUnit과 단위 테스트 라이브러리 Unitils까지 실무에 적용할 수 있는 아주 넒은 범위에 대해서 설명을 해 주고 있습니다. 또한 이번에 출시된 책된 책 답게 JUnit 3,4를 모두 설명해 주는 등 최신 버전의 라이브러리에 대해서 설명을 해주고 있기 때문에 바로 적용을 해보는데 큰 어려움이 없을 것으로 보입니다.

개인적인 생각으로는 이 책은 초중급정도를 타게팅으로 하고 있다고 생각합니다. 기본적으로 TDD에 대해서 전혀 모르는 사람도 적용할 수 있도록 자세하게 설명을 해주고 있으며 단순히 TDD에 대한 부분 뿐만 아니라 실제 개발에 적용할 때 도움이 될 수 있도록 이클립스를 기준으로한 상황별 어떤 기능 및 단축키를 이용하면 되는지까지 친절하게 알려주기 때문에 초급자라도 어렵지 않게 예제를 따라하면서 많은 것을 배울 수 있을듯 합니다. (사실 이클립스 사용법에 부분만으로도 이클립스가 익숙치 않은 사람들에게는 많은 도움이 되리라고 생각됩니다.)

너무 친절하게 설명하는 것은 자칫 초급을 벗어난 개발자들에게는 지루한 내용이 될수도 있는데 아무래도 TDD에 대한 관심을 갖게 되는 것이 약간 개발경험을 갖은 뒤인 경우많아서(처음부터 TDD로 습관이 들어있는 축복받으신 분이 아니라면) TDD자체가 약간 중급자를 위한 내용인데다가 책이 커버하고 있는 영역역이 꽤 넓기 때문에 친절하고 자세하게 설명하고 있는 부분에 대해서 초급자타게팅이라는 얘기를 한 것이지 책이 다루고 내용자체를 보면 중급(급을 나누는것 자체가 모호하긴 하지만요)개발자에게 더 적합하다고 생각합니다.

그리고 무엇보다 좋은 점은 단순히 라이브러리의 사용법과 TDD에 대한 가이드만 제공하는 것이 아니라 오랫동안 애자일 및 TDD에 힘써온 저자의 경험이 책에 그대로 묻어나있기 때문에 각 설명마다 장단점을 알려주고 현업에서의 문제점과 한계점에 대해서도 알려주고 있기 때문에 책을 읽으면서 여러가지로 생각해 볼만한 부분 많았다는 것입니다. TDD라는 것 자체가 방법을 알고난 뒤에라도 실제 적용까지는 어느 정도의 수련이 필요한 부분이고 각 상황마다 정답이라고 할 만한 방법은 없기 때문에 TDD와 리펙토링을 하는 방법에만 너무 집중하지 않고 현실적으로 스스로 고민해 볼만한 여러가지 화두들을 던져주어 생각해보게 하고 어느정도의 대안과 경험을 제시해 주는 것은 상당히 좋은 접근이라고 생각하고 있습니다.

문체는 약간 블로그스러운 편한 문체로 되어 있어서 호불호는 있겠지만 저는 오히려 읽기가 좀 편했던 것 같고 지면한계상 어쩔수 없었지만 뒷부분의 실습예제가 좀 더 자세하게 나왔었으면 하는 아쉬움은 있습니다만 TDD를 적용하고 싶은데 어떻게 해야할 지 감이 잘 안오는 개발자들에게는 충분한 도움이 되리라고 생각됩니다.