애플리케이션 개발은 어떤 순서로 하면 좋을까 2?

2013-02-13 18:26

지난 번 애플리케이션 개발은 어떤 순서로 하면 좋을까?(http://www.slipp.net/questions/21)와와) 관련한 이야기를 했는데 이와 관련해 많은 논의가 진행되지 못한 느낌이 들어 다시 한번 논의를 해보면 좋지 않을까라는 생각으로 다시 한번 질문을 던져 본다.

현재 slipp.net은 가능하면 acceptance test를 만들려고 노력하고 있다. 하지만 생각보다 Acceptance Test Driven Development(이하 ATDD) 방식으로 구현하기 쉽지 않은 경우가 많다. SLiPP 스터디에서 ATDD 기반으로 예제 소스 코드를 만들어 가는 과정을 통해(http://www.slipp.net/wiki/pages/viewpage.action?pageId=5177662 참조) 느낀 점도 있어 같이 한번 이야기하려 한다.

먼저 전체 아키텍처를 Layered Architecture를 근간으로 한다고 가정하고 Controller => Service(Business Layer) => Repository 또는 Dao(Persistence Layer) 같은 구조로 구현한다고 생각해보자. 이와 같은 웹 애플리케이션을 개발한다고 생각했을 때 구현 순서는 어떻게 가져가는 것이 좋을까?

SLiPP 스터디에서(http://www.slipp.net/wiki/pages/viewpage.action?pageId=5177662 문서 참조) ATDD 기반으로 구현할 때는 다음과 같은 순서로 개발한 듯하다. 이 문서에서는 모델 1 방식으로 구현했는데 모델 2로 한다면 아래와 같을 것으로 판단된다.

  • Acceptance Test 구현
  • 빈 껍데기의 Controller 구현
  • 화면 구현(jsp 구현)
  • ControllerTest 구현과 Controller 구현
  • Controller 구현하면서 Business Layer Interface 도출
  • ServiceTest 구현과 Interface에 대한 구현체 구현
  • Service 구현체 구현하면서 Repository에 대한 Interface 도출
  • Repository 구현. Spring Data JPA인 경우 추가 구현이 없는 경우도 많음.

대략적으로 위와 같은 순서로 개발할 수 있을 듯하다. 여기서 의문점은 다음과 같다.

  • ATDD 기반이 아니라 일반적으로 개발할 때의 개발 순서는 어떤 순서로 하는 것이 좋을까?
  • 위 내용을 보면 도메인 설계 과정이 빠졌는데 도메인 설계는 언제하는 것이 좋을까?
    • 최초에 도메인 설계를 일정 수준 진행한 후에 개발을 시작하는 것이 좋을까?
    • 개발을 진행하다 도메인이 도출되는 시점에 설계하는 시간을 가지는 것이 좋을까?

위 구현 순서는 UI => Controller => Service => Dao와 같이 화면에서 시작해 제일 뒷단의 데이터베이스까지를 관통하는 방식인데 말도 안되는 접근 방식인가?라는 생각도 든다. 도메인이 너무 단순해 도메인 설계를 충분히 고려하지 못한 것도 같다. 도메인 복잡도가 있다면 최초 도메인 설계부터 진행하는 것이 맞을까?

PS. 페이스북으로 로그인했을 경우 페이스북으로 글 보내기 기능을 추가했는데 이에 대한 테스트겸 같이 논의해 봤으면 하는 마음으로 글을 쓴다.

4개의 의견 from SLiPP

2013-02-13 18:50

저는 acceptance레벨의 테스트를 먼저 만들지는 않습니다.

모두 unit test기반으로 만들고 구현이 완료되면 개발자 매뉴얼 테스트를 합니다.

  1. domain/service 구현
  2. Repository mock or stub형태로 구현
  3. 1,2번 반복
  4. Controller/JSP구현
  5. repository 쿼리 구현(저는 아직 JPA를 실무에 적용 못해봤습니다.)
  6. manual test

올해는 JPA경험 원년으로 삼고 진행해보려고 합니다..^^

2013-02-15 10:26

매번 다르지만 최근엔

  1. dummy controller + view로 단위 page flow 개발 1.5 필요시 controller용 단위 테스트 케이스 작성
  2. service 계층 통합 테스트 케이스 작성 (인수 테스트 성격)
  3. service + domain + repository(with in memory db) 개발
  4. 리펙토링
  5. DB DDL 작성
  6. 디자인 적용

말씀하신 것과 어느 정도 비슷하네요.

2013-02-15 18:21

@ologist 내가 과거에 개발하던 순서와 거의 비슷한다. 그런데 ATDD 기반으로 개발하다보니까 위와 같은 순서로 진행하게 되더라고.. 근데 domain 설계가 어느 시점에 진행되는 것이 좋을까?

@fupfin 아 정말 저와 비슷하군요. 물론 앞에서 제가 이야기했던 부분에서는 ATDD 기반이라 Acceptance Test를 먼저 만들기는 하지만요. 질문이 몇 가지 있어 남깁니다.

  • ATDD 기반으로 하지 않으시는데 위와 같은 순서로 진행하게 된 계기가 있으신가요?
  • 위와 같이 개발하니까 좋은 점이 있던가요?
  • domain 설계가 service의 인터페이스가 도출된 시점에 진행되는데요. 이 방식이 맞다고 생각하시나요? 그 이유는? 아니면 최초 요구사항 분석하는 시점에 기본적인 domain 설계하는 것은 어떻게 생각하시는지요? 위 글을 보면 설계가 아니라 개발이라고 적혀있는데 혹시 설계는 다른 시점에 하신다면 그 부분도 공유해 주시면 좋겠어요.
  • 개발할 때 설계에 시간은 어느 정도 투자하시나요?

궁금한 점이 맞네요. 이 부분이 정답이 없다는 것은 알지만 다른 분들은 어떻게 진행하는지 궁금해서 같이 이야기해보고 싶었어요. 프로그래밍 잘하는 개발자가 있으면 그 친구들의 개발 과정을 동영상으로 찍어 놓고 공유해 보면 재미있을 듯 하네요.

의견 추가하기

연관태그

← 목록으로