← 블로그 목록

모든 프로그램을 데이터와 상태 전이로 보면 설계가 더 선명해진다

‘모든 프로그램은 데이터베이스다’는 엄밀한 정의는 아니지만 사고 실험으로는 꽤 쓸모 있다. 저장·조회·갱신·삭제, 무결성, 상태 전이의 관점으로 코드를 보면 객체 이름보다 접근 패턴과 유효 상태가 먼저 보이고, 프레임워크가 바뀌어도 설계가 덜 흔들린다. 데이터를 어떻게 다루는지가 결국 프로그램의 성격을 결정한다는 점을 정리한다.

모든 프로그램을 데이터와 상태 전이로 보면 설계가 더 선명해진다

모든 프로그램을 데이터와 상태 전이로 보면 설계가 더 선명해진다

“모든 프로그램은 데이터베이스다”라는 말은 엄밀한 정의라기보다 사고 실험에 가깝다. 실제로 모든 프로그램이 관계형 데이터베이스 관리 시스템은 아니다. 하지만 프로그램을 설계할 때 무엇을 저장하고, 어떻게 읽고, 언제 바꾸고, 어떤 상태를 허용할 것인가로 바라보면 구조가 훨씬 또렷해지는 경우가 많다.

데이터베이스 문서를 읽어 보면 이 감각이 더 잘 보인다. PostgreSQL은 트랜잭션을 통해 여러 변경이 모두 성공하거나 모두 취소돼야 한다고 설명하고, 외래 키 같은 제약은 존재해서는 안 되는 관계를 막아 준다. 많은 애플리케이션 코드도 형태만 다를 뿐 비슷한 문제를 다룬다.

프로그램의 핵심은 결국 저장, 조회, 갱신, 삭제의 조합이다

게임을 예로 들어도 비슷하다. 플레이어의 위치, 체력, 인벤토리, 퀘스트 상태는 모두 데이터다. 문서 편집기라면 본문, 스타일, 커서 위치가 데이터다. 협업 도구라면 작업 카드, 담당자, 상태 값이 데이터다.

겉으로는 전혀 다른 소프트웨어처럼 보여도, 내부에서는 보통 다음 질문을 반복한다.

이 질문은 데이터베이스 설계 질문과 거의 닮아 있다.

성능 문제도 종종 ‘어떻게 읽는가’에서 터진다

프로그램이 느려질 때 사람들은 알고리즘만 떠올리기 쉽다. 물론 중요하다. 하지만 실무에서는 무엇을 얼마나 자주 찾는가, 같은 데이터를 몇 번이나 중복 계산하는가, 필요 없는 범위를 계속 순회하는가 같은 조회 패턴이 성능을 크게 좌우할 때가 많다.

그래서 자료구조를 고를 때도 단순히 저장 형태만 볼 일이 아니다.

프로그램을 데이터 문제로 보면 이런 질문이 먼저 보인다. 그러면 객체 이름보다 접근 패턴이 먼저 보이기 시작한다.

무결성과 상태 전이는 데이터 저장만큼 중요하다

데이터베이스의 외래 키와 제약 조건은 “있으면 좋은 장식”이 아니다. 시스템이 허용하면 안 되는 상태를 구조적으로 막기 위한 장치다. 애플리케이션도 마찬가지다.

예를 들어 주문은 결제 완료 전에 배송 완료가 되면 안 되고, 게임 캐릭터는 동시에 서 있고 점프하고 쓰러진 상태일 수 없다. 이런 문제를 if 문으로만 계속 막다 보면 언젠가 예외가 새어 나온다.

그래서 상태 전이 관점이 중요하다. 게임 프로그래밍 패턴의 상태 패턴 글이 보여 주듯, 복잡한 분기와 가변 상태는 버그가 잘 생기는 영역이다. 유효한 상태를 명시하고, 어떤 입력이 어떤 상태 변화를 일으키는지 분명히 하면 설계가 훨씬 읽기 쉬워진다.

이 관점의 장점은 기술 스택을 가리지 않는다는 점이다

관계형 데이터베이스를 쓰든, 메모리 객체를 쓰든, 이벤트 스트림을 쓰든 핵심 질문은 크게 다르지 않다.

이 질문이 선명하면 프레임워크가 바뀌어도 설계가 덜 흔들린다. 반대로 이 질문이 흐리면 언어와 패턴을 많이 알아도 구조는 쉽게 꼬인다.

핵심 정리

모든 프로그램이 문자 그대로 데이터베이스는 아니다. 하지만 저장, 조회, 갱신, 삭제, 무결성, 상태 전이의 관점으로 프로그램을 바라보면 설계의 핵심이 훨씬 선명해진다.

좋은 코드는 종종 화려한 추상화보다도 “무엇을 저장하는가”, “무엇이 유효한 상태인가”, “어떤 변경이 함께 움직여야 하는가”를 분명하게 정리한 코드에 가깝다. 데이터를 어떻게 다루는지가 결국 프로그램의 성격을 결정한다.

참고 자료

← 목록으로
Related

함께 읽으면 좋은 글

서평C++프로그래밍
『The C++ Programming Language』는 문법책이 아니라 언어 설계 감각을 키우는 책이다

비야네 스트롭스트룹의 『The C++ Programming Language』는 두꺼운 문법서로 보이지만, 실제로는 언어 기능 하나하나를 어떤 설계 판단 아래 써야 하는지를 함께 묻는 책이다. 창안자가 직접 쓴 만큼 ‘할 수 있다’와 ‘해야 한다’를 구분하는 감각이 남으며, 한 단계 올라가려는 C++ 사용자에게 한 번쯤 통과해야 할 책으로 정리한다.

프로그래밍문제 해결설계
소프트웨어 설계에서 트리즈는 정답표보다 모순을 드러내는 질문지에 가깝다

트리즈는 소프트웨어 문제를 자동으로 풀어 주는 만능 표가 아니라, ‘성능을 높이면 복잡성이 늘고 단순화하면 유연성이 떨어진다’ 같은 충돌을 더 선명하게 분해하게 만드는 사고 도구다. 40가지 원리 이름을 외우기보다 이상적 상태와 모순을 한 문장으로 적고, 시간·공간·조건으로 분리해 보는 습관이 실무에서는 더 쓸모 있다는 점을 정리한다.

프로그래밍테스트테스트 주도 개발
테스트 주도 개발은 테스트를 나중에 붙이는 습관이 아니라 설계 순서를 바꾸는 방식이다

테스트 주도 개발은 테스트를 나중에 붙이는 습관이 아니라, 실패하는 테스트부터 써서 설계 순서 자체를 바꾸는 방식이다. 레드-그린-리팩터링의 짧은 피드백 주기에서 핵심은 테스트 개수가 아니라 설계와 검증 사이의 왕복 거리이며, 마지막 단계의 리팩터링이 빠지면 TDD는 반쪽만 남는다. 진짜 가치는 커버리지 숫자보다 더 분명한 경계선과 안전한 변경 능력에 있다.