2008년 05월 24일
이름 없는 목공의 이름 프로젝트 1 - 피드
이름 없는 목공의 이름 프로젝트 첫 번째로 현재 진행 중인 프로젝트에 RSS/Atom 피드 기능을 넣기로 했다. 다음에는 pingback을 추가해볼까 생각 중이다. 팀의 동의 없이 하는 일이므로 절대 전체 프로젝트의 복잡도를 높여서는 안되고, 언제든지 제거할 수 있어야 하는 조건이 있다. 20분 단위로 뛰어 보기로 했다.
첫 번째 뜀박질. 피드를 제공하려면 정보를 RSS나 Atom 규격에 맞게 출력해야 한다. RSS나 Atom 규격을 모르지만 지금 먼저 공부하고 만들려면 시간이 너무 많이 걸린다. 피드 제공이 목적이지 피드 규격 파악이 목적이 아니므로 적당한 라이브러리를 쓰면 된다. 입사하면 피드 리더 만들게 해준다는 낚시에 걸려서 봐둔 Rome을 사용하기로 했다. 튜토리얼의 소스 코드를 복사하고 조금 고쳐서 XyzFeed 클래스를 만들었다. 그냥 System.out으로 출력해서 결과를 확인했다.
두 번째 뜀박질. 앞에서 만든 XyzFeed를 XyzAction에서 불러 쓴다. XyzFeed의 결과를 System.out 대신에 StringWriter에 출력하고 StringWriter에 쓰여진 출력을 toString으로 뽑아서 XyzAction에서 getter로 Result에 노출 시켰다. Result는 Freemarker 템플릿을 하나 만들고 노출된 getter에서 값을 얻어 그대로 출력하도록 했다. 실행해보니 출력이 깨져서 나온다. SiteMesh 데코레이터가 적용되어서 생기는 문제다. 이 문제를 제외하고는 잘 나온다.
세 번째 뜀박질. SiteMesh 데코레이터가 적용되지 않게 하려면 content-type을 바꿔줘야 한다. 여러가지 방법이 있지만 RomeResult를 만들어 SyndFeed를 HttpServletRespnse에 바로 출력하기로 했다. RomeResult도 분명 누군가 만들어 놓았겠지. 검색하니 나온다. jar 가져와서 maven 리포지토리에 올리고 하면 골치 아프니 그냥 소스를 복사해 왔다. result 설정을 RomeResult를 사용하도록 수정하고 XyzAction에서 문자열로 포맷팅하지 않고 SyndFeed를 getter로 Result에 넘겨줄 수 있게 수정했다. 다시 실행해보니 브라우져가 피드로 인식해서 이쁘게 보여준다. 기능은 여기서 완료. 만세~
네 번째 뜀박질. URL 고민.
다섯 번째 뜀박질. XyzFeed 리팩토링. RomeResult의 테스트 추가.
여섯 번째 뜀박질. 테스트를 추가하면서 리팩토링된 RomeResult를 테스트와 함께 원래 프로젝트인 s2rome에 제출하기로 했다. SVN에서 소스를 받아서 빌드하니 안돌아간다. 필요한 라이브러리를 일일이 찾아서 lib에 넣어주고 테스트 확인했다. jMock을 썼더니 필요한 jar가 많다. 혹시 모르니 Result의 Lifecycle을 찾아보고 RomeResult에서 잘못된 부분이 없는지 확인했다. 패치 파일과 함께 이슈에 등록.
구현에는 5 * 20분 = 100분 = 1.5 시간 밖에 안걸렸다. 뭘 만들지가 분명하면 만드는데는 거의 시간이 걸리지 않는다. 구현이 병목이라고 생각하는데 아닌 것 같다. 실제 프로젝트 시에도 구현 기간의 상당 시간이 구현하면서 발견된 앞단계에서 정해진 결정의 문제점을 개선하는데 쓰이는 것 같다. 결정에서 구현, 테스트가 멀어질수록 더 멀리 거슬러 올라갔다 내려와야 하기 때문에 시간은 많이 걸릴 수 밖에 없다. 직렬(Sequential) 도랑(Ditch) 프로세스가 병목이다. 지나친 확대 해석인가?
첫 번째 뜀박질. 피드를 제공하려면 정보를 RSS나 Atom 규격에 맞게 출력해야 한다. RSS나 Atom 규격을 모르지만 지금 먼저 공부하고 만들려면 시간이 너무 많이 걸린다. 피드 제공이 목적이지 피드 규격 파악이 목적이 아니므로 적당한 라이브러리를 쓰면 된다. 입사하면 피드 리더 만들게 해준다는 낚시에 걸려서 봐둔 Rome을 사용하기로 했다. 튜토리얼의 소스 코드를 복사하고 조금 고쳐서 XyzFeed 클래스를 만들었다. 그냥 System.out으로 출력해서 결과를 확인했다.
두 번째 뜀박질. 앞에서 만든 XyzFeed를 XyzAction에서 불러 쓴다. XyzFeed의 결과를 System.out 대신에 StringWriter에 출력하고 StringWriter에 쓰여진 출력을 toString으로 뽑아서 XyzAction에서 getter로 Result에 노출 시켰다. Result는 Freemarker 템플릿을 하나 만들고 노출된 getter에서 값을 얻어 그대로 출력하도록 했다. 실행해보니 출력이 깨져서 나온다. SiteMesh 데코레이터가 적용되어서 생기는 문제다. 이 문제를 제외하고는 잘 나온다.
세 번째 뜀박질. SiteMesh 데코레이터가 적용되지 않게 하려면 content-type을 바꿔줘야 한다. 여러가지 방법이 있지만 RomeResult를 만들어 SyndFeed를 HttpServletRespnse에 바로 출력하기로 했다. RomeResult도 분명 누군가 만들어 놓았겠지. 검색하니 나온다. jar 가져와서 maven 리포지토리에 올리고 하면 골치 아프니 그냥 소스를 복사해 왔다. result 설정을 RomeResult를 사용하도록 수정하고 XyzAction에서 문자열로 포맷팅하지 않고 SyndFeed를 getter로 Result에 넘겨줄 수 있게 수정했다. 다시 실행해보니 브라우져가 피드로 인식해서 이쁘게 보여준다. 기능은 여기서 완료. 만세~
네 번째 뜀박질. URL 고민.
다섯 번째 뜀박질. XyzFeed 리팩토링. RomeResult의 테스트 추가.
여섯 번째 뜀박질. 테스트를 추가하면서 리팩토링된 RomeResult를 테스트와 함께 원래 프로젝트인 s2rome에 제출하기로 했다. SVN에서 소스를 받아서 빌드하니 안돌아간다. 필요한 라이브러리를 일일이 찾아서 lib에 넣어주고 테스트 확인했다. jMock을 썼더니 필요한 jar가 많다. 혹시 모르니 Result의 Lifecycle을 찾아보고 RomeResult에서 잘못된 부분이 없는지 확인했다. 패치 파일과 함께 이슈에 등록.
구현에는 5 * 20분 = 100분 = 1.5 시간 밖에 안걸렸다. 뭘 만들지가 분명하면 만드는데는 거의 시간이 걸리지 않는다. 구현이 병목이라고 생각하는데 아닌 것 같다. 실제 프로젝트 시에도 구현 기간의 상당 시간이 구현하면서 발견된 앞단계에서 정해진 결정의 문제점을 개선하는데 쓰이는 것 같다. 결정에서 구현, 테스트가 멀어질수록 더 멀리 거슬러 올라갔다 내려와야 하기 때문에 시간은 많이 걸릴 수 밖에 없다. 직렬(Sequential) 도랑(Ditch) 프로세스가 병목이다. 지나친 확대 해석인가?
# by | 2008/05/24 23:42 | 트랙백 | 덧글(2)







☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
여섯번째 뜀박질 더 자세하게 설명해주세요~
코드 수정하면 어디까지 확인해봐야할 지 막막하더라구요..
이번 경우는 자체 유닛테스트 외에 Struts2 프레임웍의 컴포넌트이기 때문에 프레임웍이 제시한 라이프사이클에 따라 동작할 때 의도하지 않은 인스턴스 변수 공유 등의 문제가 없는지 확인한 정도입니다.