이 과제를 시작하기 전, 객체지향 개념을 제대로 학습하고 적용할 기회를 얻었다는 사실에 큰 기대감이 있었습니다. 서버 개발에서 유지보수성과 확장성을 고려하는 것이 핵심이라는 점에서, 객체지향 설계의 중요성을 알고 있었기 때문에, 이번 프리코스에서 이를 실습하며 연습해볼 수 있다는 점이 설레었습니다. “이 미션들을 통해 얼마나 성장할 수 있을까?” 하는 생각이 들었습니다.
과제를 시작하기 전, 제가 객체지향 개념들을 제대로 이해하고 적용할 수 있는지 확인하기 위해 객체지향 강의를 처음부터 끝까지 빠르게 듣고 정리했습니다. 객체지향을 어떤 사고방식으로 접근해야 하는지, 어떤 자세로 공부해야 하는지, 캡슐화와 추상화는 어떻게 하는게 좋을지, 상속과 컴포지션이 무엇이고 언제 어떻게 사용해야 할지, 그리고 상속과 컴포지션을 사용하면서 문제가 생기는 것들이 무엇이고, 이런 상속과 컴포지션의 문제를 추상클래스와 인터페이스에서 어떻게 해결하는지를 알게 되었습니다. 강의를 통해 잘못 이해하고 있던 개념들과 모르고 있던 개념들을 깨달았고, 이를 제 블로그에 다시 정리하여 다른 참가자들과도 공유했습니다.
실제로 과제를 수행하면서, 이론으로만 알고 있던 내용들을 직접 적용해보니 객체지향에 대한 이해가 크게 향상되었습니다. 예전에는 단순히 “현실 세계와 유사할수록 객체지향 설계를 잘하는 것이다” 라고 잘못 생각하면서 구현했었습니다. 하지만 이번에는 객체지향은 현실 세계를 완벽하게 시뮬레이션 하는 것이 아니고, 적절한 정도로 구현한다는 사실을 알고 그대로 적용했습니다. 각 클래스들의 역할과 책임을 고민하고, 객체들의 생성의 책임과 의존성을 관리하는 AppConfig 클래스를 만들고, 유지보수성과 확장성을 고려해 Operator라는 추상 클래스를 도입하며 리팩토링을 진행했습니다.
또한, 과제를 진행하면서 정규표현식을 사용하는 것이 적합하다는 사실을 알게 되었습니다. 하지만 실제로 사용해보니, 이스케이프 문자 처리가 예상과 다르게 동작하는 문제를 겪었습니다. 이스케이프 문자 처리에서 \\
와 같은 이중 백슬래시가 필요하다는 사실과 정규표현식에서 특수문자 처리를 어떻게 해야 하는지를 학습했습니다. 공식 문서를 확인하고 학습한 내용을 정리하면서 이를 해결했고, 이후 과제에 성공적으로 적용할 수 있었습니다. 또한 정리한 정규표현식을 블로그에도 다시 정리해서 올렸습니다.
이후 시간이 조금 남아서 최적화를 도전했습니다. 수행 시간을 측정하려 했는데, jmh라는 특정 라이브러리를 사용하지 않는 한, 정확하게 수행시간을 측정하기에는 어렵다는 것을 알게 되었습니다. 그래서 나노타임 단위로 수행시간을 측정하고 밀리초로 변환한 후, 10회의 반복 측정을 한 후 평균을 내는 방식으로 수행시간을 측정했습니다.
기존에 사용하던 정규표현식은 String 객체에서 사용하는 split과 matches 가 아닌 Java의 regex 패키지에 있는 Matcher와 Pattern을 사용하여 리팩토링했습니다. 그 이후에 다시 수행시간을 측정하여 비교하였는데, 평균적으로는 7ms정도 수행시간이 준 것을 확인하였습니다. 하지만, 결과에 신뢰가 가지 않았습니다.
처음에는 단순히 regex 패키지의 Pattern, Matcher가 더 빠르다고만 알고 있었습니다. 하지만 결과에 신뢰가 가지 않아 제가 찾아봤을 때에 Matcher와 Pattern이 더 효율적인 이유는 필요한 정규표현식을 미리 컴파일하여 필요할 때마다 컴파일 된 Pattern을 가져와 사용하여 객체 생성을 덜 하기 때문에 빠르다는 것을 알게 되었습니다.
기존의 방식에서는 각 정규표현식 문자를 따로 상수로 선언하여 필요할 때마다 상수를 조합하여 정규표현식을 생성하는 방식이었습니다. 바뀐 방식은 필요한 정규표현식을 객체 생성시에 Pattern으로 미리 컴파일하여 필요할 때 가져다 사용하는 방식이었는데, 여기에 큰 차이가 없다는 것을 깨달았습니다. 이번 미션의 경우, 처음부터 필요한 정규표현식이 확정되어있는 상태가 아니라, 커스텀 구분자의 유무에 따라서 정규표현식을 동적으로 생성하여 사용하게 되기 때문입니다. 그래서 이번 최적화에서는 그렇게 큰 성과가 없었지만, 정규표현식 최적화의 한계와 방법론을 이해하게 되었습니다. 만약 다음에 비슷한 경우에는 잘 판단하여 최적화할 것 같습니다.
결론적으로는, 최적화는 크게 성과가 없었지만 전반적으로 만족스러운 프로그램을 완성할 수 있었습니다. 다음 미션에도 객체지향 설계를 어떻게 더 잘 적용할 수 있을지 고민하며, 시간이 남는다면 최적화까지 더 깊이있게 도전하여 성장해 나가고 싶습니다.