Architecture / / 2023. 7. 12. 14:28

Domain Driven Design for FastAPI(파이썬 FastAPI를 위한 도메인 주도 디자인) - 캡슐화와 추상화

본격적으로 도메인 주도 개발을 공부하면서 하나하나 정리하면서 내가 생각하고 고민한 흔적을 남겨보려고 한다.

캡슐화와 추상화의 차이

자동차를 생각해보자, 자동차가 달려가고 있다. 우리는 자동차가 바퀴가 굴러가면서 공기저항을 이겨내고 달려가는 것을 알 수 있다. 하지만, 그 안에는 수많은 움직이는 부품들이 있고, 작게는 기어부터 시작해 톱니바퀴까지 움직인다. 우리는 이 자동차 내에 수많은 움직임이 다른 움직임을 만들어 내고, 상호작용하고 있다는 것을 알 수 있다. 그와 동시에, 차체를 보자, 차체는 크게보면 디자인이 있지만, 그 안에는 다양한 프레임과 함께 견골들이 존재한다. 우리는 자동차에 엔진이 있다는 것을 알고 배터리부터 다양한 부품이 있다는 것을 안다.

 

오히려 이러한 설명이 너무 어렵게 다가왔을 수도 있겠다. 

 

단순하게 말해서, 캡슐화는 "어떠한 정보 혹은 데이터의 은닉"이다. 추상화는 "어떠한 실행 혹은 행동의 은닉"이다. 이것을 프로그래밍적 관점에서 살펴보겠다. 다양한 언어에서 정보 혹은 행동을 은닉하는 방법이 있겠지만, 나는, 이 글에서는 파이썬을 중점적으로 다룰 것이기에, 파이썬으로 이야기하겠다.

 

단순하게 더하기를 하는 계산기를 생각해보자, 우리에게 필요한 것은 두개의 피연산자 - 정보 - 와 그것을 구현해줄 더하기 기능 - 하나의 행동 - 이다.

class operation:
	def __init__(self):
    	self.result = 0
	
    def set(self, data):
		self.result = data
    
    def add(self, num):
    	return self.result += num

위의 코드를 보면 캡슐화와 추상화를 한번에 파악하기 어려울 것이다. 하지만, 실제 코드 구현을 하고서 아래와 같이 실행해 보면 그 맛을 느낄 수 있을 것이다.

operator = operation()
operator.set(3) # result는 3이 된다.
operator.add(4) # 이때 더하기가 실행되며 출력된다
>>> 7

만약 위의 실행코드만 던져주고 파악해본다면 어떤 느낌이 올까? 일단 set(3)를 해서 무언가 세팅한다는 것을 알 수 있다. 그리고 add를 통해 무언가 더하기를 한다는 것을 알 수 있다. 여기서 우리는 추상화와 캡슐화를 모두 감지했다. 자동차의 부품 - 정보(result)가 은닉되어 있다는 것 - 의 자세한 부분까지 모르지만 자동차가 있다는 것을 알 수 있으며, 자동차의 주행 - add의 실행을 통한 더하기 연산자 실행 - 이 실제로 이루어지고 있다는 것을 알 수 있다.

 

추상화와 캡슐화의 중요성

프로그래머가 코드를 짜면 그걸로 끝나지 않는다. 코드의 양이 많아질 수록 그에 따른 시간과 노력이 들어가며 이에 비례해서 추후에 유지보수에도 시간을 쏟아야 할 것이다. 추상화와 캡슐화의 중요성은 여기서 드러난다. 추상화는 중요한 행동에 집중하도록 도와준다면, 캡슐화는 필요한 정보만을 필터링하도록 도와준다고 생각된다. 

 

추상화와 캡슐화에 대한 오해

  • 추상화와 캡슐화가 무조건적으로 옳은 것은 아니다.

추상화와 캡슐화에 너무 집착하지는 말자, 너무 과도하면 오히려 개발할 시간을 뺏기게 될 것이다. 다만 유념할 것은 느슨한 결합을 유지하자는 생각이다. 파이썬의 경우에는 후에도 이야기하겠지만, 언어차원에서 변수의 접근제한을 두는 경우가 없기에 완벽한 추상화와 캡슐화는 불가능하다는 생각이다. 

  • 추상화와 캡슐화는 실수를 줄이는 것이 아니라, 유지보수성을 높이는 것이다. 

실수를 줄인다고 생각하기 보다는 유지보수성을 높인다고 생각하자. 즉 미래에 투자하는 것이다. 아무리 추상화와 캡슐화를 잘해도 그 객체나 도메인 엔티티 자체 설계에 문제가 있을 수 있다. 다만 그것을 다시금 고칠 수 있는 시간과 비용을 줄이는 것이지 처음부터 실수를 줄이는 것은 아니다.

파이썬에서의 추상화와 캡슐화

추상화와 캡슐화는 Domain Driven Design(앞으로 DDD로 줄여 부르겠다)을 비롯해, Object Oriented Programming(OOP)에서도 중요하게 받아들여지는 개념이다. 캡슐화를 통해 데이터의 접근을 제어하고 추상화를 통해 행동(함수 혹은 메서드)의 접근을 제한한다. 그리고 객체의 데이터의 변경 - DDD에서는 어떠한 도메인에서의 데이터 변경 - 이 객체의 함수 혹은 메서드를 통해서만 이루어지는 것을 추구한다. 그리고 이러한 변수의 데이터는 Private 변수로 불린다.

 

하지만 C++, Java등 과는 달리 파이썬에서는 추상화와 캡슐화가 조금 다르게 받아들여진다고 생각한다. 물론 파이썬은 OOP를 추구하는 언어지만, 철학이 조금은 다르다. 파이썬은 언어 자체에서 Private, Protected, Public같이 변수에 접근 제한을 두지않고 "_" 혹은 "__"를 붙임으로써 관습화된 - 즉 프로그래머 사이의 약속을 통해 - 제한을 둘 뿐이다. 

 

 

 

A class is an example of encapsulation as it encapsulates all the data that is member functions, variables, etc. The goal of information hiding is to ensure that an object’s state is always valid by controlling access to attributes that are hidden from the outside world.

 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유