본문 바로가기

소프트웨어와 개발 산출물

프로그램만이 아니라 데이터, 사용자 문서, 운영 절차까지를 소프트웨어로 보고, 요구·설계·구현·테스트 단계가 서로 연결되는 산출물을 남기는 이유를 설명합니다. 교재 실습 폴더를 꾸리고, 터미널의 현재 폴더와 import 경로의 기준이 다르다는 점을 확인합니다.

앞 글의 신청 함수가 잘 실행되더라도, 진행자가 정원을 어디서 바꾸는지 모르고 담당자가 취소 규칙을 모른다면 모임 운영은 엉망이 됩니다. 소프트웨어를 실행되는 코드만으로 생각하면, 이런 문제는 개발이 끝난 뒤에야 드러납니다. 이 글에서는 독서 모임을 운영하는 데 필요한 코드, 데이터, 설명서, 운영 절차를 나누어 보고, 개발 단계마다 무엇을 남겨야 하는지 정합니다. 마지막으로 이 교재의 실습 파일을 둘 폴더를 준비합니다.

프로그램을 둘러싼 네 가지

같은 신청 프로그램이라도, 실제로 쓰이려면 다음 네 가지가 함께 갖추어져야 합니다.

대상독서 모임의 예확인할 질문
프로그램신청과 취소를 처리하는 함수규칙대로 상태가 바뀌는가
데이터모임의 정원과 참가자 명단누가 만들고 언제까지 보관하는가
사용자 문서설치, 실행, 거절 이유에 대한 안내처음 쓰는 사람도 다음에 무엇을 할지 아는가
운영 절차마감, 백업, 복구, 변경 승인문제가 생기면 담당자가 무엇을 하는가

소프트웨어는 눈에 보이지 않는 규칙을 다루고, 쓰이는 동안 기능이 계속 더해지며, 운영체제나 다른 프로그램에 기대어 동작합니다. 복사하는 데는 비용이 거의 들지 않지만, 요구를 정하고 맞게 동작하는지 확인하는 비용까지 사라지는 것은 아닙니다. 또 기계처럼 닳지는 않지만, 실행 환경이나 요구가 바뀌면 그대로인 코드가 더는 맞지 않게 됩니다.

소프트웨어공학(software engineering)은 소프트웨어를 만들고 운영하고 고치는 일을 체계적으로 하고, 그 결과를 측정해 개선하는 활동입니다. 그렇다고 모든 프로젝트에 같은 양식의 문서를 강요한다는 뜻은 아닙니다. 작은 모임 앱과 의료 장비가 거치는 검토와 승인의 정도가 다른 것은, 잘못되었을 때의 피해와 고치는 비용이 다르기 때문입니다.

산출물은 단계를 잇는다

개발 활동에서 남는 결과를 산출물(artifact)이라고 합니다. 요구 분석은 "취소하면 그 자리를 다른 사람이 쓸 수 있다"는 조건을 남기고, 설계는 명단에서 아이디를 빼는 상태 변화를 정하며, 구현은 그 변화를 코드로 실행하고, 테스트는 실제로 자리가 다시 쓰이는지 확인합니다. 이렇게 산출물들이 서로를 가리키고 있어야, 나중에 무엇을 고칠 때 어디까지 함께 고쳐야 하는지 알 수 있습니다.

요구, 설계, 구현, 테스트, 운영을 한 번씩 차례로 거치고 끝난다고 생각하면 안 됩니다. 운영 중에 잘못된 거절 안내를 발견하면 요구를 다시 확인하고 설계와 테스트를 함께 고쳐야 하며, 단계마다 담당자가 다르더라도 산출물로 서로 이어져 있어야 합니다. 실습 폴더에 policy.md를 만들고 다음 메모를 적어 보세요. Markdown은 #로 제목을 표시하는 일반 텍스트라서 아무 편집기로나 읽을 수 있습니다.

# 독서 모임 첫 정책
목적: 명단 중복과 정원 초과를 막는다.
대상: 모임 진행자와 참가자.
아직 정하지 않은 질문: 마감 뒤 취소를 허용할까?
확인 방법: 진행자에게 취소 사례를 묻고, 결과 코드를 테스트한다.

이 메모는 코드가 따라야 할 규칙을 함께 정하기 위한 것입니다. 문서를 많이 쓰는 것보다, 아직 정하지 않은 질문과 그것을 확인할 방법이 드러나 있는지가 중요합니다.

실습 폴더 꾸리기

이 교재의 실습은 하나의 폴더에서 이어집니다. 기능 요구와 수락 조건에서 신청 규칙을 담은 core.mjs의 전체 코드를 제공하고, 장마다 그 파일을 가져다 쓰는 예제를 examples 폴더에 저장합니다.

reading-lab/
  core.mjs
  core.test.mjs
  examples/
    ch2.mjs
    ch3-1.mjs ... ch10-3.mjs

예제 파일의 import는 다른 파일이 export로 내보낸 함수를 가져오며, 이 ES 모듈 문법은 모듈 시스템에서 자세히 다룹니다. examples/ch2.mjs 안에 적힌 ../core.mjs에서 ..는 그 예제 파일이 있는 폴더의 한 단계 위, 곧 reading-lab을 뜻합니다. node:로 시작하는 모듈은 Node.js에 들어 있어 따로 내려받지 않습니다. 장마다 예제는 서로 다른 파일이므로, 본문이 이어 붙이라고 하지 않은 코드를 한 파일에 계속 붙이면 같은 이름을 두 번 선언해 문법 오류가 납니다.

터미널의 위치와 import의 기준은 다르다

터미널에서 node examples/ch2.mjs라고 실행하면, 터미널의 현재 작업 폴더(current working directory)에서 examples/ch2.mjs를 찾습니다. 반면 그 파일 안의 ../core.mjs는 터미널의 위치가 아니라 ch2.mjs 파일이 있는 위치를 기준으로 찾습니다. 지금 터미널이 어디에 있는지는 다음 명령으로 확인할 수 있습니다.

node -p "process.cwd()"

실습 폴더를 C:\study\reading-lab에 만들었다면, Windows PowerShell에서는 다음처럼 그 폴더로 이동해 파일을 확인한 뒤 실행합니다. 경로는 자기가 만든 폴더로 바꾸어 씁니다.

Set-Location -LiteralPath 'C:\study\reading-lab'
Get-ChildItem
Get-ChildItem -LiteralPath '.\examples'
node examples/ch2.mjs

첫 목록에는 core.mjs가, 둘째 목록에는 ch2.mjs가 보여야 합니다. Cannot find module 오류가 나면 패키지를 설치하기 전에, 터미널의 현재 폴더, 실행하려는 파일의 실제 이름, import가 가리키는 파일을 차례로 확인합니다. node 자체를 찾을 수 없다고 나오면 실행 환경과 작은 프로그램의 준비 과정으로 돌아갑니다.

경로기준위 폴더 구성에서 가리키는 곳
터미널에 적은 examples/ch2.mjs터미널의 현재 작업 폴더reading-lab/examples/ch2.mjs
ch2.mjs 안의 ../core.mjsimport를 적은 파일의 위치reading-lab/core.mjs
node:assert/strictNode.js에 들어 있는 모듈의 이름따로 내려받지 않음

그래서 다른 폴더에서 node C:\study\reading-lab\examples\ch2.mjs처럼 파일의 전체 경로로 실행해도, 그 파일 안의 ../core.mjs는 여전히 reading-lab/core.mjs를 찾습니다. 터미널의 위치와 모듈의 위치를 같은 것으로 생각하면 이런 오류의 원인을 찾기 어렵습니다.

정리

  • 소프트웨어는 프로그램뿐 아니라 데이터, 사용자 문서, 운영 절차를 함께 포함하며, 넷이 갖추어져야 실제로 쓰일 수 있습니다.
  • 소프트웨어공학은 개발과 운영을 체계적으로 하고 측정해 개선하는 활동이며, 필요한 절차의 정도는 실패의 피해와 고치는 비용에 따라 달라집니다.
  • 요구, 설계, 구현, 테스트의 산출물은 서로를 가리키며 이어져 있어야 하고, 개발은 단계를 한 번만 지나고 끝나지 않습니다.
  • 실습은 reading-lab 폴더의 core.mjs와 장별 예제 파일로 이어지며, 서로 다른 예제를 한 파일에 이어 붙이지 않습니다.
  • 터미널에서 실행하는 경로는 현재 작업 폴더를, 파일 안의 import 경로는 그 파일의 위치를 기준으로 합니다.

연습 문제

1. 다음 담당자에게 넘길 것

만든 사람이 "잘 돌아가요"라는 말과 실행 파일만 넘겨주었습니다. 진행자는 정원을 바꾸고 마감 뒤 취소도 받아야 합니다. 인수할 때 요청할 산출물 세 가지와, 각각 무엇으로 확인할지 제안하세요.

해설 보기

먼저 실행 안내와 지원하는 Node.js 버전을 받아, 새 컴퓨터에서 안내만 보고 예제를 실행해 봅니다. 다음으로 정원, 마감, 취소에 관한 정책표를 받아, 가득 찬 명단에 같은 사람이 다시 신청하는 경우와 마감 뒤 취소하는 경우가 정책대로 처리되는지 확인합니다. 마지막으로 데이터를 보관하고 복구하는 절차를 받아, 프로그램을 끈 뒤 명단을 되살려 봅니다. 소스와 테스트도 쓸모 있지만, 테스트가 통과한다고 이 세 가지 업무 질문의 답이 저절로 생기지는 않습니다.

2. 모듈을 찾지 못하는 이유

reading-lab/examples 폴더로 이동한 터미널에서 node examples/ch2.mjs를 실행했더니 Cannot find module 오류가 났습니다. 원인과 고치는 방법을 설명하세요.

해설 보기

터미널의 현재 폴더가 이미 examples이므로, examples/ch2.mjs는 reading-lab/examples/examples/ch2.mjs를 가리켜 존재하지 않는 파일이 됩니다. reading-lab으로 한 단계 올라가 같은 명령을 실행하거나, 지금 위치에서 node ch2.mjs로 실행하면 됩니다. 이때 ch2.mjs 안의 ../core.mjs는 터미널의 위치와 상관없이 파일의 위치를 기준으로 하므로 어느 쪽으로 실행해도 맞게 찾습니다. 오류 메시지에 나온 경로를 읽으면 어느 쪽 기준이 틀렸는지 알 수 있습니다.

3. 산출물 나누기

"정원을 바꾸는 방법", "참가자 명단 파일", "명단이 깨졌을 때 백업에서 되살리는 순서", "신청이 거절된 이유를 보여 주는 문구"는 각각 네 가지 대상 가운데 무엇에 해당하나요?

해설 보기

정원을 바꾸는 방법은 진행자가 읽을 사용자 문서이고, 참가자 명단 파일은 데이터입니다. 백업에서 되살리는 순서는 문제가 생겼을 때 담당자가 따를 운영 절차입니다. 거절 이유를 보여 주는 문구는 화면에 나타나는 프로그램의 일부이면서, 그 문구가 무엇을 뜻하는지는 사용자 문서와 맞아야 합니다. 이처럼 하나의 산출물이 여러 대상에 걸칠 수 있으므로, 고칠 때 함께 바꿀 곳을 산출물 사이의 연결로 찾습니다.

웹, 임베디드, 업무용, AI 소프트웨어 같은 분류는 서로 겹칠 수 있으므로, 분류보다 어떤 산출물이 필요한지를 먼저 따져 보세요. 다음 장의 사용자·문제·범위에서는 구현 기술을 고르기 전에, 사용자가 겪는 문제와 이번에 다룰 범위를 정합니다.