지금까지 변수, 함수, 클래스와 상속까지 파이썬의 핵심 문법을 하나씩 배워왔습니다. 이제 남은 것은 이 도구들을 가지고 실제로 무언가를 만드는 일입니다. 그런데 막상 “이제 프로젝트를 만들어보자”고 마음먹으면, 무엇부터 손대야 할지 막막해지는 경우가 많습니다.
이번 챕터에서는 코드를 한 줄도 쓰기 전에 거쳐야 할 단계, 바로 요구사항 분석과 설계에 대해 이야기해보겠습니다. 이 단계를 건너뛰고 바로 코딩부터 시작하면, 프로그램이 절반쯤 완성됐을 때 방향을 다시 잡아야 하는 상황을 자주 겪게 됩니다. 특히 지금까지 배운 함수, 조건문, 클래스 같은 도구들을 실제로 어떻게 조합할지는, 코드를 쓰기 전에 머릿속(또는 종이 위)에서 먼저 정리해두는 편이 훨씬 수월합니다.
핵심 요약
프로젝트 기획은 코드를 작성하기 전에 무엇을, 왜, 어떻게 만들지 정리하는 과정입니다. 요구사항 분석은 “무엇을 만들 것인가”를 명확히 하는 단계로, 목표와 범위를 정하고 필요한 기능을 목록으로 만드는 작업입니다. 설계는 “어떻게 만들 것인가”에 대한 구체적인 청사진으로, 정리된 기능을 함수와 데이터 구조 단위로 쪼개는 작업입니다. 처음 프로젝트를 만들 때는 작게 시작해서 핵심 기능만 먼저 완성하고, 나머지는 나중에 덧붙이는 방식이 가장 안전합니다.
왜 코딩 전에 기획이 필요할까
기획 없이 코딩부터 시작하면, 만들다 보니 필요한 기능이 계속 추가되고, 이미 짜둔 코드 구조가 그 기능을 담기에 맞지 않아 다시 뜯어고쳐야 하는 상황이 반복됩니다. 집을 지을 때 설계도 없이 벽돌부터 쌓기 시작하는 것과 비슷합니다. 벽을 다 쌓고 나서야 방 배치가 잘못됐다는 걸 알게 되면, 처음부터 다시 시작해야 할 수도 있습니다.
반대로 코드를 쓰기 전에 몇 분만 투자해서 “이 프로그램이 무엇을 해야 하는가”를 정리해두면, 코딩하는 동안에는 그 목록을 하나씩 구현해나가기만 하면 됩니다. 방향을 잃고 헤매는 시간이 크게 줄어드는 셈입니다. 프로젝트 규모가 커질수록 이 차이는 더 크게 벌어지는데, 기획 없이 시작한 프로젝트는 기능이 하나 추가될 때마다 기존 코드를 뒤흔들지만, 기획을 거친 프로젝트는 이미 정해둔 구조 안에 새 기능을 끼워 넣기만 하면 되는 경우가 많습니다.
요구사항 분석: 무엇을 만들 것인가
요구사항 분석은 프로그램이 해야 할 일을 사용자 입장에서 명확한 문장으로 정리하는 과정입니다. 이 단계에서는 코드를 전혀 쓰지 않고, 오직 “무엇이 필요한가”만 생각합니다.
1. 목표와 범위를 먼저 정하기
가장 먼저 할 일은 이 프로그램이 어떤 문제를 해결하는지, 누구를 위한 것인지 한두 문장으로 정의하는 것입니다. 예를 들어 간단한 계산기를 만든다면 목표는 “사용자가 기본적인 사칙연산을 손쉽게 할 수 있도록 돕는 것”이고, 범위는 “정수와 실수의 덧셈, 뺄셈, 곱셈, 나눗셈”으로 한정할 수 있습니다. 처음부터 공학용 계산기 수준의 기능을 전부 넣으려 하면 완성까지 가지 못하는 경우가 많으므로, 범위를 좁게 잡는 것이 초보자에게는 특히 중요합니다.
2. 사용자 스토리로 기능을 구체화하기
사용자 스토리는 “사용자가 시스템을 통해 무엇을 할 수 있는가”를 사용자 관점의 문장으로 적어보는 방법입니다. “사용자로서, 나는 ~할 수 있다”라는 형태로 하나씩 적다 보면, 막연했던 아이디어가 실제로 구현해야 할 기능 목록으로 바뀝니다. 할 일 목록 관리 프로그램을 예로 들면 다음과 같은 문장들이 나올 수 있습니다.
- 사용자로서, 나는 새로운 할 일을 추가할 수 있다.
- 사용자로서, 나는 완료한 할 일을 완료 처리할 수 있다.
- 사용자로서, 나는 더 이상 필요 없는 할 일을 삭제할 수 있다.
- 사용자로서, 나는 전체 할 일 목록을 확인할 수 있다.
기획 단계 없이 코딩부터 시작했다면 “할 일 추가”만 만들고 끝냈을 수도 있지만, 이렇게 정리해보면 수정·삭제·조회 기능까지 미리 필요하다는 걸 알 수 있습니다.
3. 핵심 기능과 나중에 추가할 기능 나누기
사용자 스토리를 다 적었다면, 그중에서 “이게 없으면 프로그램이 성립하지 않는 기능”과 “있으면 좋지만 나중에 추가해도 되는 기능”을 나눠보는 것이 좋습니다. 할 일 목록 프로그램이라면 추가·삭제·완료 처리·조회는 핵심 기능이고, 마감일 알림이나 우선순위 정렬, 카테고리 분류는 나중에 추가해도 되는 기능입니다.
이렇게 나눠두면 첫 완성 목표가 훨씬 명확해집니다. “핵심 기능 네 가지가 다 동작하면 일단 완성”이라는 기준이 생기기 때문에, 하나씩 만들어가는 동안 “이것도 넣어야 하나, 저것도 넣어야 하나” 하며 끝없이 범위가 늘어나는 상황을 막을 수 있습니다. 나중에 추가하고 싶은 기능은 잊어버리지 않도록 따로 목록에 적어두기만 하면 됩니다.
요구사항이 정리됐다면, 이제 그 기능들을 실제 코드 구조로 옮기는 설계 단계입니다. 이 단계에서 유용한 방법은 각 기능을 함수 하나에 대응시켜보는 것입니다. 아직 내부 로직을 채우지 않고, 함수 이름과 역할만 먼저 적어두는 것을 흔히 ‘뼈대(skeleton)를 짠다’고 표현합니다.
이 코드가 하는 일: 앞서 정리한 사용자 스토리 네 개를 각각 함수로 이름만 먼저 정의해둡니다. pass는 “아직 내용은 없지만 문법적으로는 완성된 함수”를 뜻합니다.
def add_task(task_list, task_name):
"""할 일을 추가한다."""
pass
def complete_task(task_list, task_name):
"""할 일을 완료 처리한다."""
pass
def remove_task(task_list, task_name):
"""할 일을 삭제한다."""
pass
def show_tasks(task_list):
"""전체 할 일 목록을 보여준다."""
pass
이렇게 함수 이름과 매개변수, 그리고 docstring으로 역할만 먼저 적어두면, 전체 프로그램의 구조가 한눈에 보입니다. 이후에는 함수 하나씩 pass를 실제 코드로 바꿔나가면 되므로, 한 번에 프로그램 전체를 완성하려 할 때보다 부담이 훨씬 줄어듭니다.
어떤 데이터 구조로 저장할지 정하기
설계 단계에서 함수 목록 못지않게 중요한 것이 데이터를 어떤 형태로 저장할지 정하는 일입니다. 할 일 이름만 저장하면 되는지, 완료 여부까지 함께 저장해야 하는지에 따라 필요한 데이터 구조가 달라집니다.
이 코드가 하는 일: 이름만 저장하는 단순한 리스트와, 완료 여부까지 함께 저장하는 딕셔너리 리스트를 비교합니다.
# 방법 1: 이름만 저장 (완료 여부를 표현할 수 없음)
tasks_v1 = ["장보기", "청소하기"]
# 방법 2: 이름과 완료 여부를 함께 저장
tasks_v2 = [
{"name": "장보기", "done": False},
{"name": "청소하기", "done": True},
]
요구사항 분석에서 “완료 처리” 기능이 필요하다고 정리했다면, 방법 1로는 완료 여부를 표현할 방법이 없다는 것을 미리 알아챌 수 있습니다. 이렇게 데이터 구조를 코딩 전에 정해두면, 함수를 만드는 도중에 “이 정보를 어떻게 담아야 하지”라는 고민을 다시 하지 않아도 됩니다.
코드로 옮기기 전에 말로 먼저 적어보기
함수 뼈대까지 짰다면, 각 함수 안에서 어떤 순서로 일이 일어나야 하는지 한국어 문장으로 먼저 적어보는 것도 도움이 됩니다. 이렇게 코드가 아닌 말로 논리를 정리하는 것을 흔히 ‘의사코드(pseudocode)’라고 부릅니다. 문법을 신경 쓰지 않고 순서만 정리하기 때문에, 나중에 실제 코드로 옮길 때 문법 오류와 논리 오류를 한 번에 고민하지 않아도 됩니다.
이 코드가 하는 일: add_task 함수 안에서 할 일이 처리되는 순서를 코드가 아닌 주석으로 먼저 적어둡니다.
def add_task(task_list, task_name):
"""할 일을 추가한다."""
# 1. 같은 이름의 할 일이 이미 있는지 확인한다.
# 2. 이미 있다면 아무 것도 하지 않고 안내 메시지를 출력한다.
# 3. 없다면 task_list에 새 할 일을 추가한다.
# 4. 추가 결과를 사용자에게 알려준다.
pass
이렇게 순서를 먼저 문장으로 적어두면, pass 자리를 실제 코드로 채울 때 “무엇을 어떤 순서로 써야 하지”라는 고민 없이 이미 정리된 순서를 그대로 옮기기만 하면 됩니다.
뼈대를 실제 코드로 채우기
위에서 정리한 의사코드를 그대로 따라가면, add_task 함수는 다음과 같이 완성될 수 있습니다. 기획 단계에서 이미 순서를 정해뒀기 때문에, 코드를 쓰는 동안에는 “다음에 뭘 해야 하지” 대신 “이 문장을 파이썬 문법으로 어떻게 표현하지”만 생각하면 됩니다.
이 코드가 하는 일: 의사코드의 각 줄을 실제 파이썬 코드 한 줄씩으로 옮겨 add_task 함수를 완성합니다.
def add_task(task_list, task_name):
"""할 일을 추가한다."""
if task_name in task_list:
print(f"'{task_name}'은(는) 이미 목록에 있습니다.")
else:
task_list.append(task_name)
print(f"'{task_name}'을(를) 추가했습니다.")
tasks = []
add_task(tasks, "장보기")
add_task(tasks, "장보기")
# 출력 결과
# '장보기'을(를) 추가했습니다.
# '장보기'은(는) 이미 목록에 있습니다.
나머지 complete_task, remove_task, show_tasks 함수도 같은 방식으로, 먼저 순서를 의사코드로 적고 그 순서를 그대로 파이썬 문법으로 옮기면 됩니다. 기능 하나하나를 이렇게 순서대로 완성해나가면, 처음에는 막막해 보였던 프로젝트도 어느새 눈에 보이는 프로그램이 됩니다.
기획 단계에서 흔히 하는 실수
처음 프로젝트를 기획할 때 가장 흔한 실수는 범위를 너무 넓게 잡는 것입니다. 할 일 목록 프로그램 하나에 우선순위 설정, 마감일 알림, 태그 분류까지 한 번에 넣으려 하면 시작조차 어려워집니다. 핵심 기능 몇 가지만 먼저 완성하고, 나머지는 “나중에 추가할 기능” 목록으로 따로 적어두는 편이 훨씬 현실적입니다.
또 하나는 기획을 아예 건너뛰고 바로 코딩부터 시작하는 것입니다. 간단한 프로그램이라도 요구사항을 서너 줄로만 적어보는 습관을 들이면, 나중에 기능을 빠뜨렸다는 사실을 코드가 절반쯤 완성된 뒤에야 깨닫는 상황을 피할 수 있습니다.
자주 묻는 질문 (FAQ)
Q. 기획 문서를 꼭 따로 만들어야 하나요?
A. 거창한 문서일 필요는 없습니다. 사용자 스토리 몇 줄과 함수 뼈대 정도만 텍스트 파일이나 주석으로 남겨도 충분히 효과가 있습니다.
Q. 요구사항 분석과 설계를 꼭 순서대로 해야 하나요?
A. 큰 흐름은 요구사항 분석 → 설계 순이 맞지만, 실제로는 설계를 하다가 요구사항을 다시 다듬는 경우도 많습니다. 완벽하게 분리하기보다는 두 단계를 오가며 다듬어도 괜찮습니다.
Q. 함수 뼈대만 짜두고 pass로 남겨두면 프로그램이 실행되나요?
A. 네, pass만 있는 함수도 문법적으로는 완전한 함수라 오류 없이 실행됩니다. 다만 호출해도 아무 동작을 하지 않을 뿐입니다. 그래서 전체 구조를 먼저 잡아둔 뒤 하나씩 채워나가는 방식이 가능합니다.
Q. 혼자 만드는 작은 프로젝트도 기획이 필요한가요?
A. 오히려 혼자 만드는 프로젝트일수록 기획을 건너뛰기 쉬운데, 규모가 작아도 몇 줄짜리 요구사항 목록을 적어두면 나중에 기능을 빠뜨리거나 방향이 흔들리는 일을 줄일 수 있습니다.
Q. 핵심 기능과 나중에 추가할 기능은 어떻게 구분하나요?
A. 정해진 공식은 없지만, “이 기능이 빠지면 프로그램이 원래 목적을 달성하지 못하는가”를 기준으로 삼으면 쉽습니다. 목적 달성에 꼭 필요한 것은 핵심 기능, 있으면 더 편리한 정도는 나중에 추가할 기능으로 분류하면 됩니다.
마무리하며
요구사항 분석은 “무엇을 만들 것인가”를 사용자 관점에서 명확히 하는 과정이고, 설계는 그 요구사항을 함수와 데이터 구조라는 실제 코드의 형태로 옮기는 과정입니다. 두 단계를 거치고 나면, 코딩은 이미 정해진 뼈대를 하나씩 채워나가는 작업이 됩니다. 처음에는 이런 과정이 코딩보다 더 번거롭게 느껴질 수 있지만, 몇 번 프로젝트를 완성해보면 기획에 들인 시간이 결국 코딩 시간을 줄여준다는 것을 체감하게 됩니다. 요구사항 목록과 함수 뼈대, 이 두 가지만 습관적으로 만들어도 다음 프로젝트를 시작할 때 훨씬 덜 막막할 것입니다. 다음 챕터에서는 이번에 배운 기획 과정을 실제로 적용해, 조건문과 반복문을 활용한 숫자 맞추기 게임을 함께 만들어보겠습니다.
참고 자료
- Python 공식 튜토리얼 (전체 목차): https://docs.python.org/ko/3/tutorial/index.html
- Python 공식 튜토리얼 — 제어 흐름과 함수 정의: https://docs.python.org/ko/3/tutorial/controlflow.html
#파이썬프로젝트기획, #요구사항분석하는법, #파이썬함수뼈대설계, #할일목록프로그램만들기, #파이썬프로젝트설계, #프로젝트기획, #요구사항분석, #소프트웨어설계, #파이썬기초, #파이썬입문
