Whiteship's Note


[봄싹] 새 기능 소개

모하니?/Coding : 2009.09.29 18:41


1. 트위터 서비스!

http://twitter.com/springsprout

봄싹 트위터를 통해서 스터디와 모임 개설/변경 소식을 실시간으로 전해드립니다. 트위터 RSS를 구족하시면 RSS 리더기를 통해서도 스터디와 모임 정보를 쉽게 받아 보실 수 있겠죠.

2. 구글 토크 알리미!

s2cmailer@gmail.com

이 주소를 구글토크에 친구로 추가해두고, 구글 토크에서 사용하는 이메일로 봄싹에 가입했다면,
스터디와 모임 메시지를 바로 바로 받을 수 있습니다.

그것 뿐 아니라, 대화형 기능을 제공하여 study? 라고 입력하면 현재 운영중인 스터디 목록을 보여주고, meeting? 이라고 입력하면 현재 개설되어 있는 모임 목록을 보여줍니다.


3. 통계 기능 추가!

스터디에 얼마나 열성적으로 참석하는지..
스터디 별로 참석률은 어떤지..
모임 참가 신청을 하고나서 자주 불참하는 회원은 아닌지..
스터디 별로 신청을 해놓고 얼마나 약속을 잘 지키는지..

한눈에 알 수 있는 기능을 추가했습니다. (테스트 데이터가 엉망이라 통계가 좀 이상합니다.)


나중에는 참석률과 신뢰도를 게이지 형태로 디자인해서 마치.. 게임 캐릭터의 체력과 마력을 나타내듯이 표시할 생각입니다. ㅋㅋ

셋 다 제가 코딩했고 만들면서 많이 고민하고 재미를 느꼈던 기능들입니다.

- 트위터 알리미를 만들 때는 인터페이스 사용의 혜택을 만끽해 보았으며,

- 구글 토크 서비스를 만들 때는 smack API를 이용하는 JabberService를 만들면서 스프링 DI를 어떻게 하면 잘 활용할 수 있을까 고민할 수 있는 계기가 되었습니다.

- 마지막으로 통계 기능을 만들 때는 별로 안 해봤엇던 하이버네이트에 Map<Entity, Primitive Type> 형태의 맵핑도 해보고, 어떤 콜렉션 타입이 좋을지 고민도 해보고, EL로 map안에 있는 데이터 꺼내오기도 해봤네요. 하지만 뭐니뭐니해도 테스트를 통해서 얻을 수 있는 안정감.. 그걸 느껴볼 수 있었습니다.

현재 봄싹은 제가 만든 새로운 기능 말고도 다른 분들이 만들고 있는 새 기능도 많이 있습니다. 본격적인 운영은 추석이 지나고나서 될 것 같네요. 그전까지 지금 상태 그대로 갑니다.

모두 명절 잘 보내세요~
top


[테스트 데이터] 테스트에 필요한 데이터 만들기

모하니?/Coding : 2009.09.29 15:24


    @Test
    public void calcTotalAttendanceRate() throws Exception {
        Member member = new Member();
        Study study1 = new Study();
        Meeting meeting1 = new Meeting();
        Meeting meeting2 = new Meeting();
        Meeting meeting3 = new Meeting();
        Study study2 = new Study();

        study1.addMeeting(meeting1);
        study1.addMeeting(meeting2);
        study2.addMeeting(meeting3);
        member.addJoinedStudy(study1);
        member.addJoinedStudy(study2);
        member.applyAttendance(meeting1);
        member.applyAttendance(meeting2);

        int attendanceSize = member.getAttendances().size();
        assertThat(attendanceSize, is(2));
        assertThat(member.getStudies().size(), is(2));
        assertThat(study1.getMeetingCount(), is(2));
        assertThat(study2.getMeetingCount(), is(1));

        when(mockStudyRepository.getConfirmedAttendanceCountOf(member)).thenReturn(1);
        when(mockStudyRepository.getTotalAttandanceCountOf(member)).thenReturn(attendanceSize);
        memberService.calcRatesOf(member);
       
        assertThat(member.getTotalAttendanceRate(), is(33));
        assertThat(member.getTotalTrustRate(), is(50));
    }

이 테스트에서 절반 이상이 테스트 데이터를 만들고 그 부분을 검증하는 코드입니다. 이 부분을 다음과 같이 바꿀 수 있다면.. 좋을까요? 안 좋을까요?

        Meeting meeting1 = Builder.Create(Meeting.class).Build();
        Meeting meeting2 = Builder.Create(Meeting.class).Build();
        Meeting meeting3 = Builder.Create(Meeting.class).Build();
       
        Builder.Create(Member.class)
            .addStudy(Builder.Create(Study.class)
                    .addMeeting(meeting1)
                    .addMeeting(meeting2)
                    .Build())
            .addStudy(Builder.Create(Study.class)
                    .addMeeting(meeting3)
                    .Build())
            .addAttendance(Builder.Create(Attendance.class)
                    .addMeeting(meeting1)
                    .Build())
            .addAttendance(Builder.Create(Attendance.class)
                    .addMeeting(meeting2)
                    .Build())
            .Build();

Object Mother에 대한 글을 찾아 보다가 Test Data Builder에 대한 글과 거기에 달린 댓글을 통해 닷넷에서 사용하는 NBuilder라는 것까지 대충 살펴봤는데.. 이거 뭐.. 해보지 않고서는 어떨지 잘 상상이 안 되네요.

http://martinfowler.com/bliki/ObjectMother.html
http://c2.com/cgi/wiki?ObjectMother
http://geekswithblogs.net/Podwysocki/archive/2008/01/08/118362.aspx
http://www.nbuilder.org/

그래서 일단은 위와 같이 상상 코딩을 해보았는데.. 어떨런지요.. 흠..
top


[테스트 코드 리팩토링] extract method

모하니?/Coding : 2009.09.29 15:01


    @Test
    public void getAttendanceCountOf() throws Exception {
        insertXmlData("testData.xml");
        Member member = new Member();
        Study study = new Study();
        member.setId(1);
        study.setId(1);
        assertThat(sr.getAttendanceCountOf(member, study), is(2));
        member.setId(1);
        study.setId(2);
        assertThat(sr.getAttendanceCountOf(member, study), is(1));
        member.setId(2);
        study.setId(2);
        assertThat(sr.getAttendanceCountOf(member, study), is(1));
    }

다음과 같이 코드를 리팩토링할 수 있습니다.

    @Test
    public void getAttendanceCountOf() throws Exception {
        insertXmlData("testData.xml");
        checkAttendanceCountOf(1, 1, 2);
        checkAttendanceCountOf(1, 2, 1);
        checkAttendanceCountOf(2, 2, 1);
    }
   
    private void checkAttendanceCountOf(int memberId, int studyId, int count){
        Member member = new Member();
        Study study = new Study();
        member.setId(memberId);
        study.setId(studyId);
        assertThat(sr.getAttendanceCountOf(member, study), is(count));
    }

이번 경우에는 코드 라인수 차이가 얼마 나지 않지만, 대부분의 경우 훨씬 깔끔해집니다.
top