본문 바로가기

프로젝트 이야기/지니어스:모노레일

2년전 자바 텀프로젝트 리팩터링하기 : 들어가며

2년전의 '그 프로젝트'

2년 전, '자바프로그래밍실습' 이라는 과목을 수강한 적이 있다. 자바의 문법을 배우고 프로그래밍에 적용해보는 수업이었다. 이런 수업은 항상 최종 프로젝트가 있기 마련인데, 자유주제로 1달이라는 기간동안 간단한 자바 어플리케이션을 개발하는 것이었다. 언제나처럼 제출마감 3일전에야 부랴부랴 시작했고, '더지니어스'에 나왔던 '모노레일' 이라는 게임을 개발했다. 시간에 쫓겨 정신없이 코드를 짯고, 말그대로 '어쨋든 돌아가는' 프로그램을 완성시켜 제출하였다.

 

새는 '어쨌든' 날아간다

 

위에서는 '어쨌든 돌아가는' 이라는 다소 안 좋은 표현을 썼지만 이 프로젝트가 나에게 주는 의미는 꽤나 깊다. 왜냐하면 내가 프로그래밍을 배우고 처음으로 만들어본 '그럴듯한' 어플리케이션이기 때문이다. 주제를 정하고 어쨌든 설계를 하고, 그거를 코드로 작성하는 프로젝트를 수행한 것은 처음 이었다. 또 나름 점수도 잘 받아서 기억에도 좋게 남았었다.

 

이제 와서 왜??

2년동안 손에도 대지 않았던 자바를 1달전 다시 공부하기 시작했다. 사실상 새로이 공부하는 것에 가까웠다. 클래스부터 차근차근 멀티스트림까지 공부했다. 책읽고 따라치기만 반복하니 온전히 내것으로 만드는 것이 쉽지 않았다. 그래서 블로그 정리와 함께 간단한 어플리케이션을 만들어보고자 했다. 그때 떠오른 것이 2년전의 그 프로젝트였다. 새롭게 만들기에는 그럴듯한 주제가 딱히 떠오르지 않았고, 당시에 진행했던 프로젝트를 다시 진행하면서 코드를 리팩터링하고, 더 좋은 서비스로 개선하는 것도 좋은 프로젝트가 될것이라고 생각했다.

(어차피 거의 처음부터 다시 만들어야 해서, 새롭게 시작하는것과 크게 다르지 않을것이라 생각했다.

 

자바를 공부하는것 vs 자바 프로그래밍을 공부하는 것

2년전 나는 말그대로 '자바'를 공부했다. 자바의 문법을 외우고, 따라치고만 반복했다. 왜냐면 1학년때도 그렇게 했고, 알고 있는것, 할줄 아는것이 그거 밖에 없었기 때문이다. 하지만 2년이 지나고 현재의 나는 더 많은 것을 알고 있다. 프로그래밍 공부에서 읽고 따라치는것보다 중요한 것이 얼마나 많은지 나는 알고 있다. 그래서 자바를 공부하면서도 실제 클래스나 인터페이스의 문법보다는 객체지향이라는 주제에 대해 더 깊게 고민한것 같다. 관련 서적도 읽어보고 디자인 패턴과 관련된 정보를 구글링도 하면서 '자바로 어떻게 프로그래밍을 할까?'에 집중했다. 자바 프로그래밍을 공부하다보니 2년전의 그 프로젝트의 문제점도 하나둘씩 보이기 시작했다.

 

문제가 많다.

2년전 만들었던 어플리케이션의 클래스 모식도

3개의 소스파일이 있었고 그 안에는 여러 개의 클래스가 무분별하게 작성되어 있었다. 물론 비슷한 성질의 클래스끼리 나눠 놓긴 했지만 애초에 하나의 파일안에 여러 개의 클래스를 작성하는것은 최대한 지양해야 한다. 1파일 1클래스가 가장 좋다. 간단하게 살펴보면 다음과 같은 문제들이 잇었다.

  1. 하나의 파일에 여러개의 클래스가 있는 문제 (1파일엔 1클래스만 비슷한 클래스는 파일이 아니라 패키지로 묶기)
  2. 외부에서 클래스 내부 필드로 함부로 접근하는 문제 + 인터페이스의 부재 (클래스에 getter, setter 메소드가 없음)
  3. 의미 없는 클래스의 남발 (DownLeft, DownRight... 이런 클래스는 다 하는 역할이 똑같고 필드값만 다름)
  4. 상속을 하지 않고 그냥 개별적으로 클래스를 남발하여 만들어 다형성을 해침 (ErrorWindow1,2,3,4,....)
  5. 객체가 데이터 저장소의 관점에서 쓰여짐. 

쓰다보니 너무 많아졌는데, 일단 가장 큰 문제는 객체지향에 대한 이해가 부족했다는 것이다. 저 당시 개발할때 나의 마인드는 '현실을 그대로 소프트웨어로 가져오자!" 였다. 현실에 타일이 있으니 타일 객체를 만들고, 현실에 플레이어가 있으니, 플레이어 객체를 만들고 이런식을 코드를 짜다보니, 결국 현실에 어떤 데이터가 있는지에 대해 집중하게 되고, 실제 그 객체가 어떤 역할과 책임을 하고 다른 객체와 어떻게 협력해야 하는지에 대해 전혀 고려하지 않았다. 그러다 보니 수많은 문제가 발생한 것이다.

 

앞으로 할일

아마 기존에 작성됬던 모듈과 내부적인 로직들은 그대로 사용하되 내부 코드는 조금더 가독성있게 수정할 것같다. 중요한 것은 그러한 모듈들을 재배치하고 재구성하여 객체 지향 정신에 가까운 어플리케이션을 개발하는 것이다.

 

1.이전 코드 읽어 보면서 문제점및 개선점 체크

2. 로직 다시 설계 (객체지향 및 디자인 패턴 공부해서 적용하기)

3. 기존 코드 가독성 있게 수정 (기존의 코드는 필요함에도 불구하고 제네릭,람다식,스트림 등이 전혀 사용 안됨)

4. 추후 네트워크 공부 후 서버개발하여 멀티 플레이 기능 추가

5. (가능할경우) 웹 어플리케이션으로 발전 

 

일단은 1,2,3이 지금당장 해야할 일이고 4,5는 네트워크 파트 및 자바 웹 개발 공부 후 구현하기로...

현재는 객체지향과 디자인패턴 공부 중...