객체지향적 설계의 고찰(나의 경험)
- 클래스는 무엇을 기준으로 만들어야 하지?(용어와 용도의 중요성)
7년의 경력을 꽉 채워오면서도 가장 어렵고, 아직도 헷갈리고, 정답을 모르겠는 부분이면서도, 가장 최근에 아차! 싶었던 주제이다.
주니어 시절에 프로그램을 작성하라고 한다면, 가장 막막했던 부분이다.
무엇을 기준으로 클래스를 도출해야하지?
일단 문제의 시작은 클래스라는 용어에서 시작된 것 같다.
언어적으로 제공하는 클래스와 이를 이용해서 무언가를 만들었을 때
개념적으로 엔티티와 값객체로 나눌 수 있다는 사실 조차 몰랐다.
그래서 모든 클래스는 똑같은 줄 알았고, 용도도 같은 줄 알았다.
맴버변수들을 갖고 있고 Getter,Setter를 기계적으로 만들어야 하며, 생성자 시그니쳐는 내맘대로 만들었다.
2. 기능이나 책임은 하나도 표현되지 않았었다.
DDD개념을 접하면서 나를 가장 어렵게 하는 것들이 여기서 시작되었었다.
왜 객체에 기능이 있지? 하지만 이건 DDD에 국한된 개념이 아니였다…
하나의 책임의 갖는 객체는 당연히 그 객체의 책임을 다하기 위해서 기능을 제공하는 것이 당연한 OOP의 특징인데, 그 사실을 전~혀 모르고 개발을 하고 있었고,
MVC 패턴의 기계적인 Controller, Service, DAO만 만들고 DTO를 중심으로 갭라하며 모든 기능은 service와 controller에 마구잡이로 작성되고 있었다.
어느 날 단일 책임원칙에 대해서 생각해보다가 아차 싶었다.
객체도 하나의 책임을 하려면 자신에게 주어진 제약들이나 기능을 갖을 수 있고, 응집도를 높여야 하는데, 난 무엇을 하고 있었나?
뒤통수를 쎄게 한데 맞은 기분이 들며, 지금까지 단순히 개념적으로 와닿지 않은 내용들이 적혀있던 책들을 다시 펴보았다.
3. 아.. 모든 책에서 동일한 이야기를 하고 있었다.
몇년의 시간을 낭비해왔는가.
이제 길을 읽는 법을 배운 것 같다.
정해진 법은 없다. 왕도는 있을 수 있다. 누군가의 노하우도 있을 수 있지만, 누군가 어떤 방법과 패러타임으로 개발을 하였다면, 그 당시 상황에 그 패러다임을 어떠한 이유와 도출 과정을 통해 적용하고 사용하기로 결정 하였는지 이해하는 것이 참으로 중요하다고 생각하게 되었다.
나의 코드에 주관을 갖고, 이를 누군가에게 설명할 수 있는, 그리고 상황이 변화한다면 이를 유연성 있게 변화 시킬 수 있는 개발자가 되어야 겠다.
8년차로 접어드는 내 성장기에 뒤늦은 깨닳음을 기록하며.