글

라벨이 TDD인 게시물 표시

스노보드를 타다가...

이미지
올 시즌들어 처음으로 스키장에왔다. 오는 길에 정말로 많은 걱정을 하였는데 그 이유는 올초에 당한 큰 사고(손목 자뼈 노뼈 골절) 때문에 내가 과연 탈 수 있을까하는 걱정에서였다. 지금까지 총 7번 중급과 상급 슬로프를 내려오면서 한번도 넘어지지 않았다. 걱정에서 쏟은 노력이 아까우리만치....  올해로 3년째 스키장을 다니고 있는데(부상으로 2년간은 띄엄띄엄) 어떻게 내가 이만큼 탈 수 있었을지 생각해보았다. 아마도 좋은 장비 때문은 아닐 것이다. 내가 가진 장비는 20만원이 채 안되는 가격에 데크, 바인딩, 부츠가 한세트이다.  그 답은 바로 모든 넘어지는 법을 익혀서가 아닐까한다. 난 정말 지독히도 운동신경이 없어 다른 사람의 100배라고 해도 좋을만큼 넘어지고 또 넘어졌다. 그렇게 수련하면서 더 이상 넘어질 수단이 없을만큼 익힌것이다.  이러한 경험은 비단 스노보드에서만은 아니다. 소프트웨어 개발에서도 우린 단단한 코드를 만들 수 있는 경지까지 이르려면 수많은 실패의 반복이 필수이다.  TDD는 계속된 실패속에 답을 찾는 과정이다. 실패하는 코드를 먼저 작성하고 그것을 바르게 동작하도록 만드는 반복. 그 속에서 코드는 점점 견고해지는 것이고, 버그 없는 우수한 품질의 코드가 나오는 것이다. 다행히 TDD를 하는데는 스노보드를 연마하는 것처럼 고통을 수반하지는 않는다.  아직 TDD를 시작하지 않았다면 이제라도 달리 생각해보자. 코드를 작성해나갈 수록 스노보드를 실수없이 타는 것만큼의 상쾌함을 느낄 수 있을 것이다. - 곤지암리조트 슬로프 아래에서 iPhone 에서 작성된 글입니다.

단위테스트를 위한 주민등록번호 생성

최근 Service 개발에서 반복적인 Account 생성이 필요한 테스트 케이스가 있어서 작업 중 Remote Server에서 주민등록번호 Validation 을 하는 바람에 급히 검색하여 다음과 같은 내용을 알아내었다. 예를 들어 640713-1018433 이 주민번호를 예로 들어보죠 우선 주민등록번호 마지막자리수만 제외하고, 각각의 자리수마다 다음과 같은 수를 곱하여 전체를 더한다. 6 4 0 7 1 3 1 0 1 8 4 3 x x x x x x x x x x x x 2 3 4 5 6 7 8 9 2 3 4 5 ----------------------- + + + + + + + + + + + + 즉, (6*2)+(4*3)+(0*4)+(7*5)+(1*6)+(3*7)+(1*8)+(0*9)+(1*2) +(8*3)+(4*4)+(3*5) = 151 그러면 151 이란 수가 나온다. 이 151을 매직키인 11로 나누어 나머지만 취한다. 151 / 11 = 몫: 13 <-- 버림 나머지: 8 마지막 단계로 매직키인 11에서 나머지 8을 빼면 3이란 수가 나오 는데, 이숫자가 주민등록번호 마지막 자리의 숫자와 일치하면 대한민국 국민이다. 11 - 8 = 3 --> 정상적인 주민등록번호임  출처 : http://blog.naver.com/foenix/40040223161 이 내용을 다음과 같은 메서드로 만들어 보았다. public static String getSSN() { Random rand = new Random(); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(rand.nextLong()); String s1 = new SimpleDateFormat("yyMMdd").format(cal.getTime()); String s2 = null; while(s2 == null || s2.length() < 6) { s2 = Integer.toString...

JNDI DataSource Loading for TDD

Tomcat 등의 Servlet Container를 사용하여, 웹애플리케이션을 개발할 때, DataSource를 Servlet Container의 Context 에 JNDI Resource로 bind 하여 사용하는 경우가 많다. test case를 실행하기 위해 JNDI remote provider 를 제공하는 application server (glassfish, jboss 등)를 사용할 수도 있으나, 이러한 것은 test의 원자성을 저해하기 때문에 test 환경 자체에서 JNDI resource를 생성할 수 있는 방법을 생각해 보았다. Sun에서 제공 하는 File System Service Provider를 이용하는 것이다. 사용법은 매우 간단하다. 단순히 naming context의 initail context factory 를 com.sun.jndi.fscontext.RefFSContextFactory 로 지정하기만 하면 된다. 다음은 간단히 만들어 본 class 이다. 이 class는 context xml 파일을 읽어서 JNDI resource를 loading해 주는 역할을 한다. test를 수행하기 전에 JNDILoader.init()을 실행 해주면 다른 작업 없이 test case를 실행시킬 수 있을 것이다. package com.fguy.test; import java.io.File; import java.io.IOException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.Parser...

제2차 P-Camp 참석 후기

P-Camp 라는 행사를 우연히 (아직도 어떻게 알게 되었는지는 기억나지 않는다.) 알게 되었는데, 행사의 주제가 평소에 지대한 관심이 있던 소프트웨어 테스팅이라 참가신청하게 되었다. 시작 시간이 오후 6시라 평소보다 일찍 퇴근을 하고, 삼성동으로 향했다. 행사장에 생각보다 많은 사람이 있어 놀랐는데, 알고보니 ASTA에 참석한 사람들이었고, 시계를 보니 내가 30분일찍 온 것이어서 간단한 식사후 행사장에 다시 입장하였다. 간단한 행사 소개후,  Agile 보급꾼 김창준님께서 "Ontogeny Unit Tests in Test Driven Development" 라는 주제로 강의를 들려주셨다. 강의 시작전 화면의 "Ontogeny"라는 낯선 단어를 보고 당황해 했는데, 알고보니 나 뿐 아니라 대부분의 사람들이 알 지 못했다는 사실에 안심하였다. 단어의 뜻은 "개체 발생" 이란다. 디자인 패턴의 창시자로 유명한 크리스토퍼 알렉산더의 다른 저서인 Nature of Order 라는 책에서 착안한 Living Structure 라는 개념을 프로그래밍에 접목한 내용이었는데, code(건축물) 가 살아있는 느낌을 갖도록 하는 15가지 property 들 ( http://www.cmcrossroads.com/bradapp/docs/NoNoO.html  참조)이 신선한 자극이 되었다. 마티스 그림의 예에서 이것이 코드 뿐 아니라 일상 생활과 우리의 인생에서도 충분히 적용할 만한 철학적인 관념일 수도 있다라 느꼈고, Luhn Algorithm Code를 리팩토링하는 과정을 접했을때는 이것이 관념적이지 않고 쉽게 구체화될 수 있구나라고 생각했다. 행사 종료 후, 창준님께서 강의 소감을 물으셔서 오늘 듣게 된 TDD에서의 Ontogeny 개념이 TDD를 실행하려고 하는 지인들에게 쉽게 다가설 수 있도록 하는 계기가 될 것이라는 의견과 미디어아트가 대단히 인상적이었으며, 강의내용 이해에 큰 도움이 되었다고 말...