brunch

You can make anything
by writing

C.S.Lewis

by 김영빈 Jun 26. 2024

메모리 & OOP vs 스토리지 & FP

컴퓨터 과학에서 메모리와 스토리지는 중요한 역할을 한다. 메모리는 빠르고 유연하여 프로그램의 실행 속도를 높이는 데 기여하며, 스토리지는 느리지만 데이터를 장기적으로 보존한다. 이러한 특성은 객체지향 프로그래밍(OOP)과 함수형 프로그래밍(FP)의 특성과도 연관이 있다.


 메모리는 빠르기 때문에 유연성이 크다. 객체지향 프로그래밍은 이러한 메모리의 이점에 의존하고 있다. 객체지향 프로그래밍에서는 객체가 복잡하고 구조화된 형태로 존재한다. 그러한 구조화된 복잡성을 메모리의 빠른 접근 속도로 해결하여 객체들에게 물리적 유연성을 제공해준다.       

메모리는 프로그램이 실행되는 동안 데이터를 빠르게 수정하고 결과를 즉시 확인할 수 있는 환경을 제공한다.

이는 개발과 테스트 주기를 단축시키고, 데이터 변화에 대한 빠른 대응을 가능하게 한다.

또한, 동적으로 객체를 생성, 수정, 삭제할 수 있는 유연성을 제공하기에 변경 비용도 줄일 수 있다.

이러한 메모리의 특성으로 스토리지 의존적인 방식에 비해 메모리 의존적인 방식이 데이터의 변경에 따른 비용이 적다는 장점이 있다.


 따라서 메모리 의존적인 객체지향 프로그래밍은 객체가 구조적이고 복합적인데도 불구하고 데이터 변경에 따른 비용이 적으며, 인간의 뇌와 유사하게 추상화하기 좋다. 역으로 그 복잡성을 해결하기 위해 메모리에 의존적이기 때문에 분산 처리 환경에서는 다소 불리할 수 있다.


 스토리지는 메모리에 비해서 접근 속도가 매우 느리다. 스토리지를 사용하는 방식은 느린 접근 속도, 데이터의 영속성 관리, 고정된 데이터 구조 등으로 인해 변경 비용이 상대적으로 높다.      

느린 속도 때문에 데이터의 변경이 빈번하게 일어나는 경우 성능 저하를 겪을 수 있다. 이는 변화에 대한 반응 속도를 늦추고, 변경 비용을 증가시킨다.

스토리지에 저장된 데이터는 영속적이기 때문에 변경 시 데이터의 일관성과 무결성을 보장하기 위한 추가적인 작업이 필요하고 이는 변경 비용을 증가시키는 요인 중 하나다.

호출 속도를 높히기 위해서는 데이터의 구조화가 필수다. 이러한 고정된 구조를 변경하는데는 고비용이 든다. 특히, 데이터 마이그레이션이나 스키마 변경 작업은 대표적으로 시간과 노력이 많이 들어가는 데이터 구조 변경 작업이다.


이러한 측면으로 함수형 프로그래밍은 스토리지 사용이 주요한 설계에서 유리하게 작용할 수 있다.       

순수 함수를 지향하기 때문에 상태 관리를 위한 메모리 의존도가 덜하다.

불변성으로 스토리지의 데이터 무결성을 유지하는데 유리하다. 이는 무결성, 일관성 보장을 위한 추가 작업에 대한 비용을 줄이는데 도움이 된다.

불변상과 순수 함수 덕분에 동시성 처리에 유리하다. 스토리지는 여러 클라이언트가 동시 접근하는 상황이 발생하는데 동시성에 강한 함수형 프로그래밍은 경쟁 상태를 줄일 수 있고 이는 프로그램이 분산된 시스템에서도 효율적으로 동작하는데 도움이 된다.


 따라서 메모리 의존적인 객체지향 프로그래밍은 하나의 세계를 추상화하여 모델링하기에 적합하며, 변화에 대한 비용이 적다. 이는 복잡한 시스템을 설계하고 관리하는 데 유리하다. 그러나 메모리에 대한 높은 의존성은 대규모 분산 시스템에서는 단점으로 작용할 수 있다. 반면 함수형 프로그래밍은 데이터와 함수를 명확하게 분리하여 관리하기 때문에 스토리지 기반의 구조화된 데이터 관리와 잘 어울려 분산 처리 환경에서 효과적으로 사용할 수 있고 즉 많이 처리할 수 있다. 그러나 함수형 프로그래밍은 객체지향 프로그래밍에 비해서 요소들의 관계성을 직관적으로 파악하기 어렵고 개념적으로 익숙하지 않을 수 있다. 이를 위해 함수형 프로그래밍은 목적과 목표를 명확하게 설정하고 설계를 하는 것이 중요할 수 있다.


 메모리와 스토리지의 특성을 이해하고 이를 프로그래밍 패러다임에 맞게 활용하는 것은 효과적인 시스템 설계의 핵심 중 하나다. 그렇다면 프로그래밍 패러다임에 맞게 적용하기 위해 어떤 판단을 할 수 있을까? 도서 [대규모 서비스를 지탱하는 기술]에서는 엔터프라이즈와 웹 서비스를 구분한다. 본인은 위의 메모리 의존적인 객체지향 프로그래밍과 스토리지에 유리한 함수형 프로그래밍의 내용도 추가해서 정리해 본다.


엔터프라이즈      

그리 높지 않은 트래픽: 어느 정도 예상 가능한 처리량의 증가.

적당한 성장 속도; 스케일 업으로 커버 가능.

아주 높은 신뢰성을 넘어서 무조건 신뢰가 되어야 한다: 높은 신뢰성을 위해 요소들 간의 관계를 직관적으로 잘 파악하기 좋은 객체지향형 프로그래밍이 선호된다.

많은 수의 트랜잭션: 요소간의 관계성을 중요하다는 의미이며 객체지향 프로그래밍이 선호된다. 또한 신뢰를 위해 트랜잭션을 많이 사용한다. 객체지향 프로그래밍의 선호와 영속성을 위해 (메모리를 이용하는) ORM을 선호한다.


웹 서비스      

굉장히 많은 트래픽: 예상이 불가능 한 정도의 처리량의 증가; 폭발하는 요청에 대해서 분산처리가 요구될 수 있다.

폭발적인 성장 속도; 스케일 아웃이 요구되어 순수함수로 작성되는 함수형 프로그래밍이 유리하다.

높은 수준의 신뢰성이 필요하지만 약간의 오차가 용인된다.

트랜잭션이 많이 필요 하지 않다.


 이러한 구분을 통해서 결국 이야기 하고 싶은 것은 제공하려고 하는 서비스의 성질을 잘 알아야 한다는 것이다. 제공하고 싶은 서비스가 (엔터프라이즈여서) 요소간의 관계성이 중요하다고 판단되면 객체지향 프로그래밍이 유리한 것이고 (ex: 결제, 배송) (웹 서비스여서) 트래픽과 성장에 대한 확장성을 보장받아야 한다면 함수형 프로그래밍이 유리할 것이다 (ex: 게시판, 통계). 이에 더 나아가 우리는 또 다른 숙제를 발견한다. 객체지향 프로그래밍이든 함수형 프로그래밍이든 적용 하기에 앞서서 도메인에 대한 잘 알고 있어야 한다는 사실을 발견하게 되는 것이다. 즉 서비스/도메인에 대한 높은 이해가 프로그래밍의 시작이다. 많은 거장들이 개발자를 컴퓨터 뚝딱이는 사람이 아니라 문제를 해결하는 사람이라고 이야기한다. 문제를 해결하기 위해서는 문제를 제대로 볼 수 있어야 한다. 문제는 코드에만 있는게 아니라 코드 이전 부터 존재하는 것임을 잊지 말고 도메인에 대한 관심과 이해하려는 노력이 필요할 것이다

작가의 이전글 피라미드보다 나무같이
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari