📖 구조 노트 목차 Chapter 12 읽는 중

12. 재사용은 기억의 경제다

구조 노트 Chapter 12 2026. 07. 15.

책장 한구석에 두꺼운 책 한 권이 꽂혀 있다. 표지에는 저자 네 명의 이름이 나란히 적혀 있어서 프로그래머들은 이 책을 그냥 GoF라고 줄여 부른다. 1994년에 나온 이 책은 새로운 프로그래밍 기법을 발명하지 않았다. 대신 이미 여러 프로그램에서 반복해서 나타난 스물세 가지 구조를 모아 이름을 붙이고, 각각을 언제 어떻게 쓰면 좋은지 정리해 두었을 뿐이다. 11장에서 살펴본 옵저버도 이 목록 안에 나란히 놓여 있다.

이 책이 실제로 하는 일을 들여다보면 흥미로운 사실이 드러난다. 책은 카페 진동벨의 코드를 담고 있지 않다. GUI 버튼의 이벤트 리스너 코드도, 유튜브 알림 시스템의 코드도 싣지 않는다. 대신 그 모든 사례에서 공통으로 반복되는 관계의 모양, 즉 “누군가 조건을 등록해 두고 조건이 충족되면 통보받는다”는 구조 하나만 남겨 놓았다. 프로그래머는 이 책을 펼쳐서 자신이 마주한 문제가 이 구조와 같은지 확인하고, 같다면 처음부터 다시 궁리하지 않고 이미 정리된 해법을 가져다 쓴다. 이 책이 저장하고 있는 것은 결국 코드가 아니라, 누군가 먼저 발견한 구조에 대한 기억이다.

재사용이라는 말은 흔히 코드를 복사해서 붙여넣는 행위를 떠올리게 하지만, 실제로는 전혀 다른 두 방식이 섞여 있다. 새 프로젝트를 시작할 때마다 예전 프로젝트에서 로그인 검증 코드를 통째로 복사해 오는 방식이 있다. 이 방식은 당장은 빠르지만, 나중에 버그 하나를 고치려면 복사된 자리마다 일일이 찾아가서 똑같이 고쳐야 한다. 반면 그 코드를 별도의 라이브러리로 뽑아내고 여러 프로젝트가 그 라이브러리 하나를 가져다 쓰게 만드는 방식도 있다. 이 경우에는 버그를 한 곳에서만 고쳐도 그 라이브러리를 쓰는 모든 프로젝트가 함께 고쳐진다.

두 방식의 차이는 결국 기억을 어디에 두느냐의 차이다. 복사해서 붙여넣는 방식은 기억을 흩어 놓는다. 같은 지식이 코드베이스 여기저기에 중복되어 저장되고, 그 중복을 하나로 맞춰 두는 책임은 사람에게 남는다. 라이브러리로 뽑아내는 방식은 기억을 한곳에 모아 둔다. 대신 그 라이브러리를 찾고, 설치하고, 버전을 맞추는 새로운 비용이 생긴다. 어느 쪽이 더 나은지는 상황마다 다르지만, 두 경우 모두 목적은 같다. 같은 문제를 다시 처음부터 풀지 않기 위해 이전에 찾아낸 답을 어딘가에 저장해 두는 것이다.

npm install이나 pip install 명령 한 줄을 실행하는 순간에도 같은 일이 벌어진다. 이 명령은 사실 전 세계 어딘가의 프로그래머가 이미 여러 번 겪고 정리해 둔 문제 해결 방법을 통째로 가져오는 행위다. 문자열을 정렬하는 방법, 이미지를 압축하는 방법, 날짜를 계산하는 방법을 매번 새로 궁리할 필요가 없는 이유는, 누군가 그 답을 이미 패키지라는 형태로 저장해 두었기 때문이다. 다만 npm이 저장하는 기억은 GoF가 저장하는 기억과 종류가 다르다. GoF의 책은 구조를 이름으로 저장해 둔 기억이고, npm의 패키지는 그 구조를 특정 언어로 이미 구현해 둔 코드 자체를 저장한 기억이다. 하나는 “이런 모양의 문제는 이렇게 풀린다”는 설계도를 남기고, 다른 하나는 그 설계도를 따라 이미 지어진 건물을 통째로 남긴다.

개인의 실력이 느는 과정도 다르지 않다. 처음 관찰자 패턴 같은 구조를 마주친 프로그래머는 한참을 고민하며 직접 그 구조를 발견해야 한다. 하지만 같은 구조를 몇 번 더 만나고 나면, 다음부터는 고민 없이 그 구조를 알아보고 곧바로 적용한다. 그렇다고 실력이 오직 저장된 답을 꺼내 쓰는 능력으로 환원되는 것은 아니다. 실력은 낯선 문제를 새로 계산해 내는 능력과, 이미 검증된 구조를 적절한 순간에 알아보고 꺼내 쓰는 능력이 함께 작동할 때 온전해진다. 둘 중 하나만 있으면 매번 바퀴를 다시 발명하거나, 맞지 않는 패턴을 억지로 끼워 맞추게 된다.

그런데 이 모든 저장 창고, 즉 GoF의 책이든 npm 패키지든 프로그래머의 머릿속 경험이든, 실제로 담겨 있는 것은 구체적인 코드 한 줄이 아니다. 담겨 있는 것은 서로 다른 재료 위에서 반복해서 나타나는 관계의 모양이다. 진동벨과 이벤트 리스너와 알림 기능은 재료로는 완전히 다르지만, 모양만 놓고 보면 같은 것을 가리킨다. 우리가 재사용하고 있는 진짜 대상은 코드가 아니라 그 코드가 기록해 둔 관계의 모양이며, 코드는 그 모양을 특정 언어와 재료 위에 옮겨 적은 하나의 번역본일 뿐이다.

지금 돌아보면 쌓여 온 것은 대상 자체가 아니라, 대상들 사이에서 반복되는 관계를 알아보는 방법이었다. 그렇다면 이제는 순서를 뒤집어 볼 차례다. 대상을 먼저 그려 놓고 관계를 나중에 채워 넣는 대신, 관계를 먼저 놓고 그 관계가 지나가는 자리에 대상을 세우면 무엇이 달라질까.