시스템구조에서 소프트웨어의 전반 구조를 추상적으로 정리 했다면 컴포넌트 사양에서는 전반 구조를 구체적으로 채우는 작업을 하게 된다. 앞선 작업에서는 클래스의 이름과 역할을 간단히 소개하고 속성(Attribute)와 동작(Operation) 칸은 비워 두었다면 지금부터는 직접 코드 상에서 구현하게 될 클래스의 함수의 이름과 속성을 명시하고 각각의 사용 목적, 기능을 설명해야 한다. 함수 내부 코드만 없을 뿐 헤더 파일에 전역 변수 명과 함수를 선언하는 것과 동일 하다. 클래스 내부 속성을 구체적으로 작성하고 난 후에는 각 클래스들의 시스템 동작하는 형태 결정한다. 여기서 말하는 '동작 형태'란 프로세스, 쓰레드 또는 핸드러와 같이 시스템 상에서 특정 작업을 수행하는 주체의 종류를 말한다. 다소 전문적인 용어 일 수 있지만 개발자들이라면 충분히 이해 할 수 있는 선에서 작성하면 무난하다.


그림 1. 각 클래스에 들어갈 속성과 함수를 명시하는 작업이라고 보면 된다.


시스템 구조를 작성 할 때 꼼꼼히 검토해서 작성 했다면 여기서 할 일은 속성과 동작 칸이 비어있는 클래스에 기능적 요구사항에 있는 기능들을 채워넣는 작업만 하면 될 것이다. 그런데 꼼꼼히 작성하지 않았다면 중간에 막히는 경우가 종종 생긴다. 예를 들어 간단한 기능 A 기능을 구현하려고 클래스들에 함수를 채워 넣었는데 현재 구조 상으로는 구현이 불가능 하거나 또는 하나의 클래스 내에 넣기에 객체지향에 어긋나는 경우가 있다. 이럴 때는 시스템 구조로 돌아가 동작 할 수 있도록 구조를 변경하고 난 후 다시 돌아와서 작성해야 한다. 컴포넌트 사양 작성이 까다로운 이유중 하나다. 이기적인 총무처럼 소규모 소프트웨어에서는 거의 발생하지 않는데 OS나 서버처럼 대규모 소프트웨어에서는 자주 발생하니, 다들 알만한 소프트웨어 회사에서는 최대한 삽질을 방지하기 위해 시스템 구조 단계에서 심사숙고하게 검토를 한다고 한다. 잘못하면 몇백 명이 삽질을 하게 될 수도 있으니까. 그런데 대충하고 몇백 명이 삽질하게 두는 곳도 있다.


이기적인 총무는 앞서 시스템 구조에서 크게 MVC 구조 및 이를 적용하는 방법과 시스템에서 필요한 Database 관리 기법에 대해서 소개 했었다. 컴포넌트 사양에서도 읽는 독자들이 예측하기 쉽게 앞선 작업의 연장선으로 MVC와 Database 관리 부분으로 나누어 작성했다.


1. MVC 구조 구체화


클래스 다이어그램을 명시화하는 일이라고 바로 그림 1에 있는 클래스들에 함수와 속성값을 대입해버리면 독자들이 이해하기 어렵다. 기승전결을 따르는 소설처럼 천천히 밑밥을 던지면서 전체 결과를 볼 수 있도록 전개해야 하는데 바로 결과물부터 던져주면 처음부터 직접 따라가야해 읽기가 쉽지 않다.


독자들이 시스템 구조를 읽고 가장 궁금해 했을 요소부터 시작하는 것이 좋다. 시스템 구조는 추상적으로 작성하기 때문에 개발자는 읽는 도중에 의문점이 많이 생기기 마련이다. 이 부분에 대한 궁금증을 먼저 채우면서 채우는 도중에 생길 수 있는 의문점으로 다시 채우는 방식으로 전개하는 것이 좋다.


그림 2. Controller 기본 구조


시스템 구조에서 MVC 구조를 설명하면서 Controller에 대해서 주구장창 설명을 했었는데 이들이 기본 골격에 대해서는 설명하지 않았다. 아마 독자들이 읽으면서 '도대체 이 시스템의 Controller는 어떤걸 말하는 것일까?'라고 생각 할 것 같아 먼저 Controller의 기본 구조에 대해서 설명했다. onCreate 함수를 통해 생성시 수행하는 작업을 하고 SetView 함수를 통해 화면을 출력한다. 그리고 createController를 함수를 통해 다른 Controller를 생성 할 수 있다. 아마 이렇게만 읽으면 생성 작업에서 어떤 일이 발생하는지 의문점이 생길 것이다. 이를 위해 시퀀스 다이어그램을 준비했다.


그림 3. Controller 생성 작업 시퀀스 다이어그램


그림 3은 Controller가 생성 될 때 일어나는 작업을 설명한 것이다. Parent Controller는 create Controller 함수를 부르면서 set Argument For Created Controller 함수를 통해 생성할 Controller에게 전달할 데이터 정보를 세팅한다. 그러면 생성된 Controller는 이걸 받고 메시지를 보내고 on Create 함수를 실행하고 화면을 띄우고 블라블라~ 사실 그림만 봐도 대강 예측은 가능하다. 읽는 독자도 그림보고 대강 이해가 됐으면 슬쩍 넘어가는 것이 좋다. 텍스트까지 읽으려면 읽어야할 글자 수가 너무 많다.


시퀀스 다이어그램 후에는 각각의 Controller들을 구현 할 떄 고려할 사항들을 정리했다. 이것들을 여기에 모두 쓰는건 무리고 나중에 마무리 포스트에서 깃허브에 정리해 올리도록 하겠다.


2. 데이터베이스 관리 


그림 4. 테이블 속성 명시


시스템 구조에서는 어떤 테이블이 있는지와 각각의 역할 및 매핑 관계에 대해서 간략하게 소개했다면 여기서는 구체적으로 어떤 속성을 자기조 있으며 각각의 속성이 어떤 형태인지 그리고 어떤 기능을 가지고 있는지를 명시해야 한다. 이미 코드상에 있는 create Table 쿼리문을 가져와서 각각에 대해서 썼다. 구현 할 때는 분명히 각각의 의미를 생각하고 만든것 같았는데 문서로 옮기다보니 어떤 목적으로 썼는기 기억이 잘 나지 않았다. 미리미리 주석으로 정리했으니 금방 글을 썼지 그렇지 않았다면 코드 뒤져보느라 시간이 오래 걸릴 뻔 했다. 포기 했을 지도 모르고..


그림 5. 테이블 관리 Controller


앞서 설명한 테이블을 관리하는 주체다. . 이미 구현한 코드상에는 있었는데 시스템 구조에는 빠져있어서 쓸지 말지 고민하다가.. 귀차니즘을 극복하고 시스템 구조에 필요성을 명시하고 다시 썼다.. 시스템 구조를 꼼꼼히 해야하는 이유다.

728x90