왠만큼 바쁘더라도 새로운 것을 공부하거나, 기존에 해왔던 기술들이 어느정도 성숙했다고 느끼면 꼭 글을 써서 블로그에 정리하고는 했는데, 이번달에는 정말 바뻤나 봅니다. 12월인데, 포스팅한 글이 하나도 없네요. 안되겠다 싶어서, 예전부터 프로젝트 사용에 주로 사용하던 jira에 대한 글을 몇일간 정리해서 올립니다. 좀 길기는 하지만 jira를 이용하는 사람들에게 도움이 될거라 생각합니다.
JIRA에 대한 소개
http://bcho.tistory.com
조대협
Atlassian의 jira는 버그 트랙킹 시스템에서 시작해서, issue나 Issue 기반의 전체적인 프로젝트 관리를 할 수 있게 하는 툴이다. 클라우드를 이용한 호스팅 서비스와, 설치형 서비스 양쪽을 모두 지원하며, 10 사용자의 경우 설치형의 경우 10$를 지불하면 라이센스를 받을 수 있고, 호스팅형의 경우 매달 10$ 정도면 서비스를 사용할 수 있다. 100 사용자 라이센스를 구매하더라도 4,000$ 밖에 되지 않는다. 다른 상용 프로젝트 관리 시스템과 비교해보면 상당히 저렴한 가격임에도 불구하고, 실제 사용해보면 그 기능과 편의성에 놀라지 않을 수 없다. Jira에 대한 선전성글로 보일 수 있겠지만, 선전을 해줘도 될만큼 훌륭한 제품이고 가격또한 적절하다. 이외에도 소스코드 관리나 CI를 위한 자동빌드 툴, 팀 채팅 서비스,코드리뷰 도구등 개발에 필요한 많은 도구들을 제공하고 있다. 아직까지 써보지 않았다면 꼭 둘러보기를 바란다.
그러면 jira로 어떻게 프로젝트를 관리할 수 있을까? 먼저 가상의 서비스를 생각해보고 시나리오를 정의해보자.
가상의 프로젝트
Facebook의 Server Side Architecture (이하 SSAG) 그룹을 별도의 웹사이트에서 운영할 수 있게 하는 사이트를 개발한다고 해보자 이 사이트를 통해서 해당 그룹의 멤버들은 글을 읽을 수 도 있고, 올리거나, 삭제 편집 그리고 검색을 할 수 있다. 이 서비스의 이름을 Yurry라고 하자
주요 기능
먼저 서비스의 주요 기능을 정의하고 액셀로 먼저 정리를 해보자
바로 Jira에 등록하지 않고 먼저 액셀로 정리를 하는 이유는, 기능을 정의하고 나면, 빠진 것이 많을 수 도 있고, 요구사항이 잘못 기술 되었을 수 도 있기 때문에, 먼저 액셀로 만들어 놓고 다른 팀원 (특히 개발,기획,UX)들과 함께 리뷰하면서 수정하기 위함이다. 아래는 초기 버전정도의 기능 정의서로 생각하면 되고, 개발이나 기획 그리고 UX 사람들과 몇번의 리뷰를 거치면서 조금더 상세화 되어야 한다.
이때, 두 단계 정도로 나눠서 Feature를 기술 하는데, Feature Level 1의 경우에는 일반적으로 생각할 수 있는 기능으로 보면 된다. (누구나 이해할 수 있는 레벨) 통상 20개 정도가 적절하다. Feature Level 2는 상세 기능을 정의하는데, 이때는 Scrum의 Story 기술 방법을 사용한다
“as a {user}, I want to do {something}”
의 형태를 취하는데, 어떠한 사용자가 시스템을 통해서 어떠한 기능을 한다는 것을 서술하는 것으로, 마치 UML의 Use Case와 같은 개념을 내포하고 있다.
기타 자세한 사항은 Description에 서술한다.
이런 Feature list를 정의할 때 중요한것은 크게 3가지 정도로 들 수 있다.
- Story (Flow or sequence) :
먼저 가장 중요한 것은 전체적인 Feature가 스토리 형태로 흐름을 가져야 한다. Level 1
Feature들을 순서대로 이어 놓으면 사용자가 서비스를 사용하는 흐름 형태가 되어야 한다. 예를
들어 위의 경우 사용자 로그인 > 글 읽기 > {글쓰기 | 좋아요 선택하기 | 검색하기} 와
같이 흐름이 되어야 한다. 위의 예에서는 Level 2 Feature는
나열식이 되기는 하였지만 조금 더 디테일한 경우에는 마찬가지로 순서성을 지키면 이해하기가 편하다.
나중에 이 Feature들을 리뷰 할때, 위에서
부터 Feature를 순서대로 리뷰를 하면 사용자 스토리에 따라서 리뷰를 하기 때문에 조금 더 빠짐없이
리뷰가 가능하다.
- Testable : 각 Feature는 테스팅이 가능한 수준으로 디테일하게 서술되어야 한다.앞서 설명한 바와 같이, 스토리대로 각 기능등이 정의 되어 있으면, 스토리를 따라서 테스트 케이스로 만들 수 있다
- Designable : 마친가지로 디자이너가 기능에 있는 스토리에 따라서 UX를 만들 수 있는 정도로 충분히 기술되어야 하며, 특히 입력이나 출력을 받을 수 있는 필드가 충분히 기술되어야 한다.
UX Prototyping
다음으로, UX에 대한 프로토타입을 구현한다. 필수과정은 아니지만, 기능을 명확하게 하고 빠진 부분이 없는지 흐름이 잘못된곳은 없는지를 체크하기 위해서 UX 프로토타입을 구현해보는 것이 좋다. 이러한 UX 프로토타입을 wireframe이라고 한다.
다음은 balsamiq라는 프로토타입 디자인 도구이다.
Figure 1.http://balsamiq.com/ 의 프로토타입 툴
http://mashable.com/2012/06/07/mockup-tools/ 에 보면 몇가지 유용한 프로토타입 툴들이 소개 되어 있다.
또는 UX 자바스크립트를 사용할 예정인 경우 예를 들어, Bootstrap등을 이용할 경우에는 자바스크립트 디자인 툴을 사용해서 프로토타입을 만들어보는 것도 좋다 이 경우에는 만들어진 프로토타입을 거의 구현단계에 그대로 사용할 수 있기 때문에 구현 기간을 줄일 수 있다. 복잡한 UX가 아닌 경우에는 이러한 방법도 효과적이다.
다음은 layoutit이라는 bootstrap 디자인 도구 이다.
Figure 2. Layoutit 서비스 화면
http://mashable.com/2013/10/20/bootstrap-editors/ 를 보면 bootstrap 디자인툴이 소개되어 있다. 아래는 실제로 layoutit 도구를 사용하여 Yurry 서비스를 프로토타입핑을 한 예이다.
여기까지 진행됬으면 Feature list가 어느정도 필터링되고 다음어져서 완성이 되었을 것이다.
jira agile board
자아 준비가 끝났으면 이제 jira에 feature들을 등록해보자. Feature를 등록하기 전에 jira의 agile board에 대해서 알아볼 필요가 있다.
스크럼 애자일 방법론을 보면 “스크럼 보드” 라는 것이 소개되는데, 해야할일 (To do 또는 Backlog), 진행중인 일 (in progress), 완료된 일 (Complete)로 나눠서, 각 일(Issue)를 포스트잇으로 만든 후, 진행 단계에 따라서 각 단계로 포스트잇을 이동해서 붙이는 방법이다.
Figure 3. 스크럼 보드
이런 스크럼 보드를 웹으로 만들어 놓은 것이 jira의 agile board라는 기능이다. 이 기능을 사용하면 같은 장소에 있는 팀원 뿐만 아니라 원격지에 있는 팀원까지 같이 스크럼 보드를 공유할 수 있는 장점을 가지며, 각 해야할 일(Issue)에 대해서 디테일한 내용을 description에 서술함으로써 조금 더 자세한 Issue 관리가 가능하다.
Figure 4. jira agile 보드.
jira의 상단 메뉴에서 Project > Create Project 메뉴를 이용해서 프로젝트를 생성한다.
다음으로, 상단 메뉴의 Agile 메뉴에서 Mange board를 이용하여 Agile 보드를 생성한다. 여기서는 Scrum 방법론을 사용할 것이기 때문에, Scrum board를 선택하고 프로젝트를 선택한다.
여기까지 수행하였으면, 빈 agile board가 생성되었다.
Issue 종류
자 그럼 이제 앞서 정의한 Feature들을 jira agile 보드에 입력하기전에. Issue를 입력할때, 어떤 필드들을 입력해야 하는지 먼저 알아보자.
Jira에 입력되는 해야할일 feature들을 “Issue”라고 정의하는데, Issue에는 몇가지 타입이 있다.
① Epic
하나의 Sprint에 걸쳐서 끝나지 않고, 여러 Sprint에 걸쳐서 종료되며, 여러 Story들의 집합이다. 주로 Major Feature들을 중심으로 정의한다. Level 1 Feature가 적절하다.
Epic을 정의할때, 하나의 팁중의 하나는 꼭 User Story 단위로만 할것이 아니라, 사용자가 직접적으로 관계가 없는 일에 대해서도 정의할 필요가 있는데, 예를 들어, Infrastructure Set up이나, 디자인 작업,문서 작업등이 이에 해당한다.
② Story
“as a {user}, I want to {do something}”에 해당하는 사용자 직접적으로 사용하는 기능이다. 이 때 Story Point라는 것을 입력할 수 있는데, Story Point는 개발에 걸리는 시간 또는 난이도 등으로 지정할 수 있는데, 필자의 경우에는 “1=개발자 한명이 개발할 수 있는 분량”으로 정의하고, 0.5,1,2,3.. 등의 단위를 사용한다.
③ Chore
Chore는 개발을 해야 하는 부분이지만 사용자와 직접적으로 관계되지 않는 개발 내용을 정의한다. 예를 들어 “Server Logging 구현”, “데이타 베이스 분리”와 같은 작업등을 정의한다. Chore 역시 Story와 마찬가지고 Story Point를 부여할 수 있다.
④ Task (Optional)
Task는 해야하는 일이지만, 구현에 관련되지 않으며, 일정이 없는 경우에 해당한다. 예를 들어 디자인 문서 작성, 기획과 업무 협의 등이 해당한다.
⑤ Issue
Issue 는 말 그대로 Issue이다. 메니져들이 관리하는 Issue, 예를 들어서 클라우드 계약, 서버 Hang up, 솔루션 결정 들과 같이 메니져들이 관리해야 하는 항목이다.
⑥ Bug
버그는 테스트 엔지니어에 의해서 테스팅 되고, 버그로 리포팅 된 타입이다.
⑦ Sub Task
Sub Task가 중요한 내용인데, Story나 Chore를 개발하기 위해서는 여러 가지의 실제적인 개발 작업이 필요하다. 예를 들어 “as a user, I want to read posting”이라는 Story가 있을때, “OPEN API를 호출하여 최근글을 JSON으로 호출하여 출력한다.” “API 호출을 로깅한다” 와 같이 디테일한 개발 테스크로 나뉘어 지는데, 이를 Story나 Chore같은 Issue 아래 Child (Sub) Task로 등록할 수 있다.
이때 하나의 팁은 이 Sub Task는 각 개별 개발자에게 할당되며 0.5일~2일 정도에 끝날 수 있는 테스크로 정의되어야 하며, 만약 2일 이상이 될 경우 다른 Sub Task로 나누어 주는 것이 좋다.
여기서 주의할점은 Story와 Chore과 실제 개발해야 하는 Issue이고 Story Point를 부여할 수 있으며, 테스트 엔지니어에 의해서 테스팅이 되는 부분이다.
jira는 자유도가 매우 높은 도구라서 이러한 Issue Type등을 지정할 수 있다. 아래는 jira의 Project > Administration 메뉴에서 Issue Type을 정의하는 부분이다. 위에서 설명한 Issue Type들에 맞춰서 Customize 하였다.
Epic 등록
Issue 타입에 대해서 이해를 했으면 이제 먼저 Epic을 등록해보자. 앞에서 등록한 Feature Level 1을 Issue로 Epic으로 등록하면 좋다. 먼저 agile board의 Plan 모드(우측 상단에 모드가 있음)에서 Create Epic을 눌러서 아래와 같이 Epic을 등록한다.
여기서 한가지 주목할만한 점은 원래 Feature List에 있던 “페이스 북 연동” Epic에 등록되지 않고 새롭게 “Infrastructure”라는 Epic이 등록되었다. “페이스북 연동”이라는 Feature는 요구 사항이기는 하지만 다른 기능 개발에 전제사항으로 포함되는 기능이기 때문에 별도로 Epic으로 등록하지 않았으며 대신 개발과정에서 서버,데이타 베이스 셋업, 배포 환경 자동화와 같은 인프라 작업이 생길 수 가 있는데, 이러한 작업은 Feature List에는 정의되어 있지 않았기 때문에, Epic 정의 단계에서 새롭게 정의하였다.
Issue 등록 및 맵핑
다음으로 Issue (Story,Chore,Issue,Issue)등을 등록한다. 상단 메뉴의 Issues 메뉴의 Create Issue를 이용하면 된다. 만약에 등록해야 할 Issue가 많을 경우에는 Excel을 Import할 수 있다.
https://confluence.atlassian.com/display/JIRA/Importing+Data+from+CSV 를 보면 Excel을 CSV로 바꿔서 Import 하는 방법이 설명되어 있다.
이 때 몇 가지 필수 필드를 등록해야 한다.
1) Component
Component는 시스템의 컴포넌트를 정의한다. Yurry 시스템의 구조가 서비스를 제공하는 앞단의 서비스 웹 사이트(Service Web Site), 시스템을 배포하는(Deployment System)으로 구성이 되어 있다면 Component는 Service Web Site와 Deployment System 두개로 구성된다. 이러한 컴포넌트 설계는 Feature가 다 정의된 후 아키텍쳐 설계를 거쳐서 시스템을 구성하는 컴포넌트를 정의한 후에 이 컴포넌트를 Component로 사용하면 좋다.
Component는 상단 메뉴의 Projects > 해당 프로젝트 선택 > Administration 메뉴 > Components 메뉴에서 추가할 수 있다.
2) Priority
다음으로 Priority인데, 해당 Issue가 얼마나 중요한지를 나타내는 것으로 Blocker, Critical, Major, Minor, Trivial 식으로 나뉘어 진다. 일반적으로 Major를 선택하면 되고,
• Blocker의 경우 해결되지 않으면 프로젝트가 진행될 수 없는 경우
• Critical은 프로젝트 진행은 가능하나 해결하지 않으면 정상적인 서비스 개발이 어려운 경우
• Major 꼭 개발해야 하는 경우
• Minor 개발은 해야 하나 없어도 상관 없는 경우
• Trivial 있으나 없으나 크게 상관 없는 경우
식으로 중요도를 나눌 수 있다. 프로젝트에 따라서 의미를 정의해서 사용하면 되고, Blocker의 경우에는 공통적으로 프로젝트 진행을 할 수 없는 수준으로 사용하면 된다.
3) Issue 생성
이제 실제로 Issue를 생성해보자 상단 메뉴의 Issues > Create Issue 메뉴를 이용항 Issue를 등록한다. Summary 부분에 제목을 등록하고, 알맞은 Priority를 선택한 후, Issue에 해당하는 Component를 선택한다. 다음으로 Assignee 부분에 해당 Issue에 대한 Owner를 지정한다. 그리고 마지막으로 Description 부분에 앞의 Excel Sheet에서 만든 Detail Description을 채워 넣는다.
4) Epic 맵핑
이제 모든 Story를 등록하였으면, agile board가 다음과 같은 형태가 될것이다.
EPCIS에서 맨아래 “Issues without epcis”를 클릭하면 우측 하단에 EPIC이 맵핑되지 않은 Issue들이 리스트업된다. 이 Issue들을 drag & drop해서 좌측에 표시된 EPIC과 맵핑 시킨다.
※ 만약에 Issue를 등록했음에도 agile 보드의 back log에서 보이지 않는 경우 https://answers.atlassian.com/questions/102966/no-issues-displaying-in-scrum-backlog 를 참고하기 바란다.
Release Version 정의와 맵핑
릴리즈의 개념을 먼저 이해하자, 릴리즈는 작동 가능한 서비스 가능한 상태로 만드는 것이다. 정확하게 이야기 하면 Production 서비스로 올리는 것을 릴리즈라고 한다. 요즘의 애자일 방법에서는 Short Release라는 전략을 사용하는데, 아주 짧은 주기로 서비스나 소프트웨어를 릴리즈한다. 그렇다고 릴리즈마다 매번 Production에 배포 하는 것이 아니라 서비스로 배포가 가능한 형태로 만들거나, 어느 정도의 기능등이 마무리 되었을 때 릴리즈를 한다.
보통 이상적인 경우 매 Sprint가 끝날 때 마다 Release 되는 것이 좋지만, 하나의 Sprint 내에서도 긴급 Release가 될 수 도 있고 (버그 수정, 긴급 반영등) 또는 개발하는 기능이 클 경우 여러 Sprint에 걸쳐서 Release를 할 수 도 있다.
어떠한 기능을 언제 Release 할것인가를 정의하는 것을 “Release Planning” 이라고 한다. jira에서는 이러한 release의 개념을 지원하는데, 애자일 보다 좌측에 “Version”이라는 탭을 클릭하면 아래와 같이 출력된다.
여기서 “Create Version” 이라는 버튼을 누르면 Version을 생성할 수 있고, 이 때 해당 버전을 개발하는 기간 “From-To” 을 명시 할 수 있다
이렇게 버전 정보를 생성한후, 아래 그림과 같이 agile board에서 Issue들을 drag&drop하여release 버전에 맵핑할 수 있다. 개발 목표 완료일을 맵핑할 수 있다.즉 어떤 기능들이 어느 Release 버전에 포함될 것인가를 맵핑할 수 있다는 것이다. 이는 product 관리 관점에서 매우 중요한데, 1.0에서는 어느기능까지 지원하고 2.0에서는 어느 기능 까지 지원하겠다는 것을 명시적으로 지정하는 것이다. 이러한 release 계획에 따라 테스팅, 마케팅, 영업등 다른 조직이 함께 움직인다.
Sprint Planning
여기까지 진행했으면, Story 들이 어떤 기능 개발에 (EPIC)에 맵핑이 되는지 그룹핑이 되었고, 각 기능들이 어느 버전에 (언제) 완료될지가 맵핑 되었다. 그러면 이제 각 Story들을 개발하는데, 얼마의 노력(resource / time)이 필요한지를 측정해보자.
1) 스토리 포인트 부여
앞에서 이미 Story와 Chore에 대해서 설명하면서 스토리 포인트의 개념에 대해서 설명하였다. 여기서 이 단계에서 스토리 포인트를 부여하는데, BackLog에 있는 Issue를 클릭하면 오른쪽에 “Estimate” 라는 항목이 나온다. 여기에서 스토리 포인트를 부여하면 된다.
2) Sprint 생성 및 Issue 맵핑
이제 Backlog가 완성되었다. 이제 Sprint를 생성하고 Backlog에 있는 Issue들 중에, 이번 Sprint에 진행할 Issue들을 맵핑해보자.
아래 그림 처럼 애자일 스크럼 보드에서 “Create Sprint”를 선택하면 Sprint가 생성된다. 이때 Sprint 이름에 기간 “(Dec.16~Dec.27)”과 같은 식으로 지정해놓으면 기간을 파악하는데 도움이 된다.
다음으로 Backlog에 있는 Issue들을 drag&drop으로 Sprint로 이동하여 Sprint로 에 맵핑한다.
그 후에 팀원들이 모여서 해당 Store나 Chore들을 구현하는데 필요한 Sub Task들이 있으면 정의 한다. (Issue에서 More > Create SubTask 메뉴를 사용하면 된다.)
다음으로 해당 Issue나 SubTask를 수행할 사람을 Assign 메뉴를 이용하여 개발자에게 할당한다.
이작업이 끝나면 해당 Sprint에 할당된 Story와 Chore (Story Point들이 있는 Issue들)에 대한 스토리포인트의 Sprint Issue들 아래 “Estimate”로 나타난다. 이를 통해서 해당 Sprint에서 처리할 Story와 Chore들의 양이 적절한지 판단할 수 있다. 위의 그림의 경우 총 Estimate가 7로, 한사람이 working day 기준 1주반 정도면 구현 가능한 양이다. 만약 팀이 4명 정도고, Sprint가 10일이라면 40정도가 MAX가 된다. 버퍼를 20~30%로 생각하면, 28~30 정도의 스토리포인트가 적절하다고 볼 수 있다. 이 버퍼는 팀의 업무 스타일에 따라서 유동적으로 설정한다. Sprint를 대략 3번 정도 해보면 어느정도의 버퍼가 필요한지 산정할 수 있다.
Sprint 시작
이제 Sprint 계획도 다 끝났고, 드디어 Sprint를 시작할 준비가 되었다. 애자일 스크럼 보드/Plan 메뉴에서 “Start Sprint” 버튼을 누르면 Sprint가 시작된다.
Sprint가 시작되면 agile board에서 Work 메뉴를 들어가 보면 변화가 생긴 것을 볼 수 있다.
앞에서 설명한 포스트잇 기반의 스크럼 보드 처럼 TO DO/In Progress/Done 형태로 3개의 영역으로 나뉘어 지고, 모든 Issue들은 TO DO에 위치한다. Sub Task(그림에서 YU-21) 의 경우 위의 그림과 같이 YU-12와 같은 Story나 Chore등 다른 Issue 아래에 다른 색으로 표시된다.
Sprint 진행
Issue 처리
1) Issue의 상태 업데이트
지정된 담당자는 Issue에 대한 작업을 시작했으면, 작업의 상태를 “To Do”에서 “In Progress”로 변경한다. agile board / Work 모드에서 해당 Issue를 drag & drop을 이용하여 In Progress로 옮기거나 Issue 디테일에 들어가서 “Start Progress” (사용하는 워크 플로우에 따라 다를 수 있음) 을 눌러서 상태를 바꿔 준다.
마찬가지로, In Progress에서 작업이 끝나면 Done (또는 Close. 사용하는 워크플로우에 따라 다름)을 눌러서, 상태를 옮겨준다.
2) Comment를 이용한 진행 상태 추가
Jira에 각 Issue에는 comment를 달 수 있는 기능이 있는데, 해당 Issue를 해결하는 데 필요한 내용이나 다른 사람과 커뮤니케이션한 내용(이메일/전화/메신져) 내용들을 붙인다.
이유는, 해당 Issue를 해당하는데 담당자가 무슨일을 했는지에 대한 로그를 남기는 것이다. 향후 다른 사람이 해당 업무를 받거나 또는 비슷한 문제를 해결하고자 할 때 선임자가 어떤식으로 업무를 해결했는지를 찾아볼 수 있도록 하는 것이다.
기술적인 질문을 하는 경우에도 이메일 보다는 Comment에 내용을 달아놓고, 질문을 하고자 하는 사람에게 Issue를 assign 시켜서 jira를 통해서 커뮤니케이션을 하면 별도로 이메일 내용을 jira에 붙일 필요가 없이 커뮤니케이션이 가능하다. (Comment가 붙으면, watching하는 사람이나 또는 assign된 사람,owner에게 자동으로 이메일 notification이 간다.)
경험상 코드 수정이나 기능에 대한 comment 내용들은 대단히 도움이 되는데, comment를 자세히 적도록 팀의 문화를 바꾸는 것은 대단한 노력이 필요하다. 필자의 경우에는 미국계 미들웨어 회사에서 일을 할 때, enhancement나 bug 수정에 대한 communication에 대해서 본사 개발자가 jira와 유사한 Issue 트랙킹 도구를 통해서만 communication을 하도록 프로세스가 잡혀있었다. 그래서 자연히 접하게 되었는데, 향후에 비슷한 문제가 생겼을 때 Issue 트랙킹 도구만 검색해도 유사한 문제와 현상 그리고 해결 방법을 다른 사람들의 커뮤니케이션 쓰레드를 통해서 많은 힌트를 경험이 있다. (실제로 다른 사람들도 그렇게 사용하였다.)
이런 경험 때문에 컨설팅을 할때나 또는 실제 개발에 적용할 때 이런 문화를 적용하고자 노력을 많이 했었는데, 엔지니어적인 특성들 때문인지 보고서처럼 몬가 적고 기록하는데 익숙하지 않은 탓인지 적응이 상당히 힘들었던 경험이 많다. (소스코드에 주석 많이 안다는 것과 같은 원리)
Issue에 comment를 적을 때에는, “내가 휴가를 가더라도 다른 사람이 Issue에 기록된 Comment만 보고도 업무를 인수받을 수 있는 정도의 수준” 적어 주는 정도의 디테일로 기록하는 것이 좋다.
3) Resolve 처리
처리가 끝난 Issue를 “Done” 처리 할 때 사용중인 워크플로우에 따라서, “Resolution” 을 수동으로 입력해줘야 하는 경우가 있다. 이 “Resolution”을 명시적으로 Complete나 다른 완료 상태로 바꿔 주지 않고, Unresolved 상태로 놔두게 되면 jira에서 해당 task를 제대로 끝나지 않은 상태로 인식하는 경우가 있다.
Jira 에는 팀이 가지고 있는 전체 Issue 대비 끝난 Issue를 추적하는 기능이 있다. 이 기능을 이용하면 전체 프로젝트 팀의 진행 상태를 알 수 있다.
그림과 같이 위의 붉은색 그래프가 열려 있는 Issue 이고, 아래 초록색이 해결한 Issue의 수이다. 이 해결한 Issue는 상태를 “In Progress” à “Resolved(Testing)”으로 변환할대 초록색으로 변하게 되는데, 이때 반드시 Resolution을 선택해주지 않으면 아래 초록색 그래프에 반영되지 않는다. 앞서 설명했듯이 워크플로우에 따라 Done이나 Resolve를 선택하면 자동으로 Resolution이 선택되는 경우가 있는데, 만약 현재 사용하는 워크플로우가 자동으로 Resolution을 선택해주지 않는 경우 이렇게 반드시 설정해줘야 한다.
여기서 Resolution을 선택해주지 않으면 Resolved 또는 Close가 되었다 하더라도, 실제 시스템에서는 해결하지 않은 것으로 인식해서 “Resolved”카운터가 증가하지 않는다. (위의 그래프에서 녹색 그래프가 올라가지 않는다.)
그리고 Resolve된 Issue는 Agile 보드에서 아래와 같이 Issue #에 선이 그어진 상태로 표시된다
만약에 현재 Resolved 처리하거나 Close 처리한 Issue중에서 위와 같이 Issue #에 줄이 쳐져 있지 않다면, 반드시 Resolution을 확인하고, UnResolved 상태로 되어 있다면, 해당 Issue를 Reopen 하신후, 다시 Resolve하고 이때 반드시 Resolution을 입력해줘야 한다.
4) 워크 플로우
Jira의 가장 큰 특징 중의 하나가 상당히 많은 부분에 대해서 Customization이 가능하다는 것이다. 그 중에서 강력한 기능중의 하나가 워크 플로우 기능이다. 지금까지 설명한 프로세스는 To do/In progress/Closed와 같은 일반적인 스크럼 기반의 워크 플로우지만, bug나 feature, test case와 같은 Issue 타입에 따라서 워크 플로우가 다를 수 있다. jira에서는 이렇게 각각 다른 Issue 타입에 대해서 다른 워크 플로우를 정의 및 정의할 수 있도록 지원한다.
5) Version Control System 연동을 이용한 Issue(Task)별 코드 변경 추적
Jira는 Issue들 즉 Story나 Chore를 개발 내용이 어느 소스코드에 반영되었는지 까지 추적할 수 있는 기능을 제공한다. SVN이나 git에 commit을 할 때 해당 Issue #를 넣어서 Commit을 하게 되면 아래와 같이 해당 Issue에 관련된 소스코드 변경 부분을 jira에서 링크로 해서 직접 코드 변경(또는 반영) 부분을 보여준다.
설정 방법
https://confluence.atlassian.com/display/JIRA/Integrating+with+a+Source+Control+System
특히 버그 수정을 했을 때, 버그 수정을 위해서 어떤 부분을 변경했는지를 추적할 수 있기 때문에 대단히 편리하다. 이 기능이 유용하기는 하지만, 개발한 코드를 commit할 때 마다 Issue 번호를 넣는 건 습관화 되지 않으면 상당히 귀찮은 일이다. Issue에 Comment를 부지런히 남기는 것처럼, 코드 commit시 마다, Issue #를 넣도록 습관을 변경하는 것이 중요하다.
이런 방식으로 Issue를 진행 및 해결하면서 Sprint를 진행한다. 만약에 중간 중간에 필요한 Issue나 Task가 나오게 되면 추가를 하고 앞서 진행한 방식과 같은 방법으로 Sprint에 추가하여 진행하되, Sub Task들은 Story나 Chore를 구현하기 위한 것이기 때문에, Sprint에 추가하는 것이 것이 타당하지만, 새로운 Story나 Chore등은 Planning때 정의한 것이 아니기 때문에 추가 요구 사항이 된다. 처음 Planning 당시 팀의 사이즈에 맞는 분량의 양만 정했기 때문에, 마구잡이로 현재 진행중인 Sprint에 넣게 되면, 야근(?)이 발생하게 된다.
그렇다고 딱 Story와Chore를 Freeze해서 무조건 한다는 것은 맞지 않을 수 있다. 초기에 Sprint 설계시 요구사항 분석을 잘못했을 가능성이 있기 때문에 빠진 Story나 Chore가 있을 수 있다.
일단 Sprint 진행중, 새로운 Story나 Chore가 생긴다면 넣고 빼는 것에 상관 없이 생성해서 BackLog에 넣어 놓는다. 그리고 꼭 먼저 진행해야 하는 경우 현재 Sprint에 넣고, 현재 Sprint에 포함된 다른 덜 중요한 내용을 빼내서 다시 Backlog로 내려놓는 방법이 타당하다.
그렇다고 부담없이 넣다 뺐다 하라는 것이 아니라, 꼭 필요한 경우에만 융통성을 발휘해서 유동적으로 진행을 하라는 것이다. 만약 Sprint에 들어가 있는 Story나 Chore를 자주 변경하게 되면 전체 팀의 프로젝트 진행에 있어서 혼선을 줄 수 있고 특히나 여러 지역에 분산된 팀의 경우에는 여파가 크다.
6) 몇가지 팁
agile board / Plan 모드에서 상단의 sprint 제목 우측을 보면, 아래와 같이 To do / In progress / Done 상태별 Issue들의 Story Point 들을 합산해서 보여준다. 이 값을 보면 현재 Sprint를 진행하면서 해야할일, 하고 있는 일, 끝난 일의 비중을 쉽게 알 수 있다.
agile board / Plan 모드에서 진행중인 Sprint의 Issue들과 Backlog Issue들은 drag&drop을 이용해서 순서 조정이 가능하다. 중요한 Issue들을 위로 놓아서 관리하는 것이 편리하다.
agile board 상단을 보면 Quick Filter가 있는데, 이는 Configure 메뉴를 이용하여 Customization이 가능하다. 이 Filter를 잘 정의해 놓으면 검색이나 진행 중인 Issue들을 필터린 해서 보는데 매우 편리하다.
일반적으로 특정 Component 별, 이슈별, 사람별 Filter를 미리 정의해놓고 사용하면 편리하다.
Sprint 종료
이렇게 Issue들을 진행하고 Sprint가 끝나는 기간이 되면 해당 Sprint를 종료해야 한다. Sprint를 종료하는 방법은 agile board > Work에서 좌측 상단의 Sprint 명을 클릭하면 아래와 같이 Complete Sprint라는 버튼이 나타나고 이 버튼을 누르면 해당 Sprint가 종료된다.
이때 종료되지 않은 Issue들은 다시 모두 Backlog로 내려가게된다.
새로운 Sprint 시작
다음 새로운 Sprint를 바로 시작할 수 있는데 권장 사항은 이 시기에 스크럼 회고(Retrospective)를 진행하면서 지난 Sprint에서 잘한 것, 못한것 그리고 개선해야 할 것을 논의하면서 프로세스를 개선해나가는 것이 좋다.
경험상 팀장급 (Scrum이나 애자일에서는 Chicken이라고들 부르던데.)은 빠진 자리에서 회고를 하는 것이 좋다. 일반 개발자나 팀원들이 눈치를 보느냐고 제대로 된 토론이 이루지지 않을 수 있기 때문이다. 반드시 프로세스 개선을 위한 의견들을 논의하고 다음번에 반영하는 것이 좋다. 또는 회고중에 나온 내용을 간단히 메모해서 이메일로 Chicken에게 보내서 향후 개선을 요청할 수도 있다.
Chicken들도, 회고에는 Chicken 끼리의 자체적인 회고를 하면서 자체적인 개선 작업을 수행하는 것이 좋다.
회고가 끝난후에, 앞서 진행했던 Sprint Planning 작업부터 다시 수행한다.
Jira의 확장
Dashboard
Jira는 Home 화면을 개인별 또는 프로젝트별로 dashboard를 구성할 수 있다. 여기서 여러가지 현황을 볼 수 있도록 만들 수 있는데, 몇가지 추천할만한 항목으로는
① 사용자별 Issue 할당 현황 : 팀원별로 할당된 Issue의 수를 모니터링 하면, 어느 팀원에게 일이 몰리는지를 알 수 있고, 이를 바탕으로 적절하게 Issue를 분산해서 배치할 수 있다.
② Block,Critical,Major 이슈 개수 : Blocker나 Critical 이슈들은 프로젝트를 진행하는 데 문제가 될 수 있으므로 항상 모니터링 하는 것이 좋다.
③ Created vs Resolved Graph : 이슈가 생성되는 추이 vs Resolve되는 추이인데, Sprint 끝으로 갈 수 록 Resolved Graph가 생성되는 그래프를 쫓아 가야 한다. 팀의 Velocity를 측정할 수 있는 부분으로, 만약에 생성되는 그래프가 올라가는 속도가 Resolved 속도 보다 빠르게 증가한다면 해당 Sprint내에 일을 끝낼 수 없다는 의미이고 Resolved Graph가 완만하게 증가하고, Created Graph가 증가 속도가 둔화되면 프로젝트가 제대로 되고 있다는 의미가 된다.
④ 나에게 할당된 이슈 : 당연히 나한테 할당된 이슈는 모니터링되고 봐야 하고.
⑤ 내가 Watching하고 있는 이슈 : 또한 내가 Watcher List에 들어가 있는 이슈도 모니터링 되어야 한다.
⑥ 다른 프로젝트의 Progress : 몇 개의 프로젝트를 동시에 진행하는 PM의 경우에는 여러개의 프로젝트에 대한 progress를 모니터링 하는 것이 좋다.
Figure 5. jira dashboard 예제
jira에서 dashboard는 gadget등을 이용해서 얼마던지 Customization이 가능하다. 별도의 규칙은 없고 각 업무에 맞게 잘 만들어서 사용하면 되는데, 참고할만한 팁은, Dashboard를 만들 때 팀내의 역할에 따라서 다른 형태의 Dashboard를 만들어서 사용하면 효과적이다. PM의 경우 여러 개여 프로젝트의 Progress와 Issue에 대해서 집중적으로 관리가 필요할 것이고, 개발자의 경우에는 자기에게 할당된 Issue와, 자신이 Watching하는 Issue들을 집중적으로 관리할 필요가 있다. 운영팀의 Incident dash board에 장애 이력을 장애가 발생한 시스템의 분포도, 장애의 원인 분포도 (네트워크 에러, 사람 실수, 설정 오류), 달력으로 장애 발생 횟수를 표시 하는 등을 할 수 있다.
모바일 클라이언트
아무래도 시대가 모바일 & 스마트폰 시대이다 보니, 당연히 jira도 스마트폰용 애플리케이션이 있다. 단순하게 스마트폰에서 이슈를 보거나 Comment를 다는 정도로 생각할 수 있겠지만, 생각보다 재미있는 기능들이 많다.
그림에서 가운데 처럼 채팅 형태로 Comment를 달 수 있는 기능도 있고, Issue를 등록했을 때 맨 오른쪽 그림처럼 이슈가 등록된 위치는 구글 맵을 통해서 나타내 줄 수 도 있다.
당연히 기본적인 리스트를 보여주는 기능도 제공한다. 외부이동이 많은 세일즈 엔지니어나 컨설턴트 또는 장애 처리를 해야 하는 Operation 엔지니어들에 매우 편리하다. 특히 채팅 기능의 경우 SMS와 같이 문자를 받는 형태로 Comment를 붙일 수 있기 때문에 이메일로 Notification을 받는 것 보다 훨씬 빠르게 해당 issue에 대한 Communication이 가능하다.
Add ons
Jira는 다양한 확장 플러그인을 제공한다. https://marketplace.atlassian.com/ 에 가면 유/무료 플러그인을 구매하여 jira를 확장할 수 있다. 또는 jira의 admin 메뉴에서 add on을 검색해서 자동으로 다운로드 및 설치를 하게할 수 있다. (정말 쉽다.)
Figure 6. Tempo Timesheets for JIRA 플러그인
위의 그림처럼 우리가 이 장의 앞에서 소개한 Excel 기반의 Tracking 시스템 형태로 jira를 운영하는 플러그인이나 Gantt chart 플러그인등 다양한 플러그인 조합을 통해서 팀의 스타일에 맞는 형태의 jira로 Customization이 가능하다.
정리
필자의 경우 애자일 팀을 운영하면서 IBM Jazz, Mantis,Bugzilla Trac, Redmine 등 많은 툴을 사용해봤는데, jira가 저렴한 가격대에 정말 실용적인 기능들을 많이 제공한다.
적절한 수준의 복잡도와 Customization을 통한 유연성을 제공하는데, 무엇보다 중요한 것은 툴 보다는 프로세스이다. 어떤 개발 프로세스를 정립하고 팀이 적응하느냐가 문제이지 어떤 툴을 사용하느냐는 그 다음 문제이다.
흔히 이런형태의 툴을 도입하는 과정을 보면 도입하는 당사자만 재미있어 하고, 구축에만 힘을 쏟다가 정작 팀 전체의 프로세스를 바꾸고 적용하는데 실패하는 경우를 많이 봤다.
툴을 구축하는 것보다 단순한 프로세스로 먼저 팀 전체가 움직일 수 있도록 적용하고, 다음 점점 툴과 프로세스를 고도화해 나가는 것을 고려해보자. 본인의 경험상 툴 셋업과 프로세스 정의가 끝난후 최소한 2~3개월은 지속적으로 노력해야 팀에 적용이 된다. 그 전까지 Issue를 제대로 close하지 않거나 내용을 제대로 적지 않거나 등의 여러가지 프로세스를 따르지 않는 경우가 많이 발생한다. 그래서 초기 2~3개월 동안은 Scrum Master가 Issue들을 관리하면서 일일이 개인들에게 mentoring을 하면서 프로세스를 따르도록 해야 한다.
[5] 출처 : https://marketplace.atlassian.com/plugins/com.atlassian.jconnect.jconnect-plugin
, https://itunes.apple.com/us/app/resolveit-for-jira/id533476633?ls=1&mt=8
'ALM > JIRA' 카테고리의 다른 글
JIRA 클라이언트 (0) | 2008.11.07 |
---|---|
JIRA 교육용 자료 (0) | 2008.07.29 |
Atlassian JIRA를 이용한 프로젝트 관리 (기초편) (0) | 2008.04.04 |
JIRA와 SVN 연동 (2) | 2008.03.03 |