원자(Atom)는 물질의 화학반응을 통해 더 쪼갤 수 없는 단위를 말한다. 현대 물리학의 관점에서 볼 때 원자는 원자핵과 전자로 이루어져 있으며, 원자핵은 중성자와 양성자로 구성된다. 또 핵반응을 통해서는 더 작은 단위로 나뉜다. 원자의 정의에 따라 원자의 특성(Atomic)은 더 이상 나누어 질 수 없는 최소 단위라는 의미를 갖는다. 갑작스럽게 원자 이야기를 꺼낸 이유는 객체지향의 원리를 설명하기에 효과적이기 때문이다. 1
간단한 원자의 원리를 생각해 보면 좋겠다. 우리는 물을 구성하는 화학물질이 산소와 수소라는 것을 잘 알고 있다. 그리고 화학식으로는 H2O라고 표현하는 것을 잘 알고 있다. 이 것은 2개의 수소 원자와 1개의 산소 원자의 화학적 결합을 의미한다. 그래서 물을 전기분해하면 산소와 수소를 얻을 수 있다. 반대의 경우도 생각해 볼 수 있다. 산소와 수소를 이용하면 물을 만들어 낼 수 있다. 또한 일반적인 물보다 무게가 더 무거운 중수(重水, Deuterium)를 만들 수도 있다. 수소 원자 중 적어도 1개 이상이 일반 수소 원자보다 중성자를 하나 더 가지고 있으면 된다. 편의상 중수소를 D(Deuterium)라고 부르면 중수는 D2O와 같은 분자식으로 표현할 수 있다. 여기서 주목해야 할 점은 객체를 원자로 치환해서 생각해보는 것이다. 원자가 가지는 특성처럼 매우 작은 단위의 객체가 있다면 객체들을 조합하는 방식에 따라 다양한 경우를 만들수 있으며, 객체의 재사용이 매우 쉬워지기 때문이다. 물의 화학반응 비유를 살펴보자. 필요에따라 중수를 만들기도 경수를 만들기도 한다. 단지 중성자 수가 다른 수소를 결합하는 것만으로 이러한 변화를 만들 수 있다. 마찬가지로 객체를 원자처럼 만들면 같은 장점을 얻을 수 있다. 화면에 어떤 내용을 출력하는 프로그램을 만든다고 할 때, 출력 기능을 수행하는 원자들을 여러 개 만들고 필요에 따라 붙여서 쓰게 만들 수 있다. 이렇게 설계하면 대부분의 코드는 공유하지만 모니터 화면에 출력하는 기능과 네트워크 소켓에 전송하는 기능을 쉽게 떼거나 붙일 수 있게 되는 것이다. 화면 출력 원자를 붙이면 모니터에 결과를 나타내지만 프린터 원자를 붙이면 종이에 인쇄하도록 만들 수 있다. 반대의 경우도 가능하다. 종이에 인쇄하는 기능을 간단하게 떼어낼 수 있다. 이렇게 원자와 같은 특징을 갖도록 객체를 설계하는 것을 합성(Composition)이라고 부른다. 잘 붙이고 잘 떼어낼 수 있도록 만드는 것이 합성이 가지는 중요한 특징이며, 소프트웨어 유지보수를 편하게 만들기 위해서는 이러한 합성을 잘 활용하는 것이 매우 중요하다. 다시 말하면 객체를 만들 때 들어가는 것만 생각하지 말고 빠져 나오는 것까지 고려해서 개발하는 것이 필요하다 뜻이다.
그러나 이러한 원자 구조 방식이 가지는 단점도 있다. 파일에 어떤 내용을 기록하기 위해서 코드가 장황해진다. 파일에 기록한다는 간단한 일을 수행하기 위해서 객체 관리자(Object Manager), 스트림 관리자(Stream Manager), 파일 관리자(File Manager)등을 호출해서 정보를 전달해야 한다. 그래서 자바(Java)는 C 언어보다 복잡하고 어려워 보인다. 코드의 양도 많고 해야할 일도 많다. 자바에서 마우스 이벤트 처리하는 코드를 생각해 보자. 이벤트 핸들러(Event Handler)와 이벤트 어댑터(Event Adapter), 액션 리스너(Action Listener) 등을 구현해 주어야 한다. 물론 다 필요한 것들이다. 여러가지 경우의 수를 생각하면 모두 필요한 요소들이다. 하지만 선택의 폭이 넓다는 것은 그 만큼 결정해야 한다는 것이 많다는 뜻이기도 하다. 그래서 유연함과 간편함 사이에서 조율할 필요가 있다. 그래서 자바는 외부로 노출할 필요가 없는 부분은 감추도록 만드는 디자인 패턴(Design Pattern)이 생겼다. 대부분의 설정은 기본값으로 숨기고 고급 사용자의 경우만 설정을 추가해서 사용할 수 있도록 개선한 것이다. 이러한 방식은 프레임워크(Framework)로 발전하였다. 그래서 스프링 프레임워크(Spring Framework)를 사용하면 복잡한 내용을 다 알지 못하더라도 웹 어플리케이션(Web Application)을 쉽고 간단하게 만들 수 있게 해준다.
결론을 말하면, 객체지향 방식을 잘 따라서 설계하는 것은 각 객체를 최대한 유일한 속성을 갖는 원자로 만드는 것이다. 다만 그렇게 하면 유연함은 얻지만 복잡도가 올라간다. 그래서 프레임워크를 통해 관리의 대상을 줄여서 사용 편의성을 높이는 것이 필요하다. 다음에 기회가 된다면 스프링 프레임워크가 어떻게 자바 어플리케이션 개발을 쉽고 편하게 만들어 주는 지 살펴보면 좋겠다.
'Sorry Architecture' 카테고리의 다른 글
RBAC with AWS IAM (0) | 2020.02.16 |
---|---|
Stress Test (0) | 2019.11.06 |
Code Review, Thumbs-up (0) | 2019.07.02 |
GitHub Workflow (0) | 2019.06.16 |
Asynchronous Code Review (0) | 2019.06.10 |