기존의 프로그램은 버튼을 눌렀을 때 출력되는 화면이 새로 생성된 frame에 출력되도록 했었으나, 수정을 통해 하나의 메인 frame에 panel이 들어가 있고, 그 panel을 필요에 따라 교체하는 방식으로 콘텐츠를 출력하도록 수정했다.
전략 패턴을 활용해보는 것은 전략 패턴과 interface의 활용을 자세히 살펴볼 시간이 부족해 포기했다. 계획하고 있는 양에 비해 시간이 많이 부족하기에, 일단 쓸 수 있는 방식을 사용하기로 했다.
프로그램의 구조도를 생각해보면 여러 패널 클래스가 있고, 각 패널 클래스들에서 특정 버튼을 누를 때마다 각 클래스를 생성해서 호출하는 방식이다. 패널이 출력되어야 하는 창은 하나이기에, 어떻게 하면 다른 어떤 클래스들에서도 메인 frame 클래스에 접근할 수 있을까를 고민했다.
그동안 메인 프로그램에서 정의되고 설정되던 메인 frame을 별도의 클래스로 분리한 뒤, 메인 frame에는 하나의 패널만을 두었다. 이때 메인 프로그램 클래스에 선언되는 메인 frame을 static으로 지정했다. 다른 패널 클래스들에서는 static 메서드를 이용해 메인 frame에 접근한 뒤, 각 클래스에서 패널을 생성해 메인 frame 내의 패널을 교체하는 방식으로 화면의 교체를 수행하도록 했다.
좋은 방식은 아닌 것 같다. 다른 패널 클래스를 생성하기 위해 해당 패널 클래스에서 사용하지 않는 인자까지도 끌어와야 하기 때문이다. 대표적으로 문제가 되는 점이 운동 계획 게시글 리스트와 운동 기록 게시글 리스트가 패널 클래스들의 인자로 이곳저곳으로 막 전달되게 되는데, 어떤 패널 클래스에서는 기능적으로 사용되지 않고 단지 이동할 클래스를 만들어주기 위해서만 사용되게 된다. 아마 스스로도 소스코드를 나중에 보게 되면 '이 리스트는 왜 이 클래스에 전달되고 있지?' 생각이 들 것 같은 구조가 된 것 같아 아쉽다. 리스트 역시 static으로 선언해 각 클래스에서 static getter 메서드로 접근하도록 해볼까 생각해 봤지만 실천에 옮기지는 않았다.
모델의 구조 변경
단순히 텍스트 필드로만 선언해놓았던 운동 계획 게시글 작성 패널의 모양새를 사용자가 좀 더 정해진 틀에 맞춰 선택할 수 있도록 하기 위해 세분화시키는 작업을 진행하고 있다. 이를 위해 운동 계획 게시글 모델을 수정하고, 모델과 관련된 클래스들을 수정해주고 있다.
모델을 수정하면서 모델이 프로그램의 거의 모든 부분에 영향을 끼치고 있다는 생각이 들었다.
운동 계획 게시글에는 '목표 경유장소들'이라는 데이터 멤버가 있다. 일단은 단순히 문자열 자료형으로 구현해놓은 상태였는데, 세분화를 위해 문자열 리스트 자료형으로 수정하고 게시글 작성 패널에서도 문자열로만 입력하는 것이 아니라 요소들을 하나하나 입력해 추가한 뒤, 게시글 인스턴스를 생성할 때 해당 문자열 리스트 자료형을 넘겨주는 방식으로 수정하고 있다.
운동 계획 게시글 모델과 운동 계획 게시글 작성 패널 수정을 마치고 나니 그에 연관된 다른 모든 클래스에서 빨간 불이 들어오는 모습을 확인했다. 모델의 구조가 바뀌니 그 모델을 이용하는 다른 모든 클래스들 역시 바뀐 구조에 맞게끔 수정되어야 하는 것이다. 클래스들의 소스코드의 관심사의 분리가 잘 이뤄져 있지 않다 보니 클래스들 간, 클래스 내에서 소스코드를 왔다갔다하는 데에도 많은 비용을 소모하고 있다.
처음으로 도합 2천 줄 이상의 프로그램을 설계하고 구현해보면서 프로그램의 확장과 유지보수가 얼마나 어려운 작업인지 몸소 느끼고 있다. 내가 쓴 소스코드를 찾아다니며 수정하는 것도 어려운데, 다른 사람이 이렇게 쓴 소스코드를 봐야 한다고 생각하면... 좋은 소스코드를 작성하고, 작성한 소스코드를 리팩터링을 잘 하기 위해 최선을 다해야 할 것임을 몸소 느끼고 있다.
욕심과 실행력
일요일에 실행 흐름도를 그려보면서 '이 정도는 못해도 수요일까지는 만들고, 그 뒤에는 새로운 기능을 추가하거나 리팩터링, 디자인에 신경써봐야지!' 생각했었다. 수요일에서 목요일로 넘어가고 있는 지금, 실행 흐름도에서 생각한 것들의 55% 정도까지 왔다. 실행 흐름도에서 아직 구현하지 않은 부분으로는 사용자 계정에 관련된 부분이 있는데, 로그인을 위해 '사용자'라는 모델을 정의하고, 각 모델마다 볼 수 있는 운동 기록 게시글들을 다르게 하는 등의 작업에도 분명 많은 시간이 소요될 것이다.
오늘인 수요일까지 (사실은 어제 화요일에) 끝내려고 했던 부분들이 아직 다소 남은 점을 생각하면, 모든 것을 다 해낼 수 없으니 취하거나 놓아줘야 할 것을 선택해야 할 것이라는 느낌이 든다.
목표의식과 도전정신, 그리고 스스로의 역량에 대한 인지, 그 사이에서 균형을 잘 잡을 수 있을까...