초보 개발자들이 설계에 어려움을 겪는 주요 원인은 다음과 같습니다.
1. 시스템 = 코드라는 인식
- 설계 지시를 받으면 코드를 먼저 떠올리고, 다이어그램이나 표 작성을 코드 구현 후의 부수적인 작업으로 간주합니다. 이로 인해 ‘뇌내 구현’ 후 추출하는 비효율적인 방식으로 접근하게 됩니다.
2. 중요 요소 파악의 어려움
- 중요한 기술적 요소를 미리 조사하라는 조언에도 불구하고, 어떤 코드를 작성할지 알아야 중요 요소를 파악할 수 있다고 생각하여 모든 코드를 처음부터 구상하려 합니다.
3. 절차를 설계로 오해
- DB-모델-컨트롤러-뷰 순서의 구현 절차를 설계했다고 보고하는 경향이 있습니다. 이는 전체 시스템 구조에 대한 고민 없이 학습된 절차를 반복하는 것에 불과하여 잦은 재작업을 유발합니다.
이러한 문제를 해결하기 위해 발표자는 ‘역산(Back-calculation)’ 기반의 인공적 설계 방법론을 제시합니다.
1. 완성된 시스템 상상
- 개발하고자 하는 기능(예: 사용자 CSV 임포트)이 최종적으로 어떤 모습으로 사용자에게 제공될지 구체적으로 상상합니다. (예: 업로드 화면, 성공/실패 메시지, 에러 처리 방식, 이력 관리 필요성 등)
2. 본질적인 목표 설정
- 상상한 시스템에서 가장 핵심적으로 달성하고자 하는 가치(Goal)를 명확히 정의합니다. (예: UI가 아닌 ‘CSV로부터 사용자 등록/갱신’이라는 비동기 처리의 본질) 이는 복잡한 사고를 방지하고 중요한 부분에 집중하기 위함입니다.
3. 목표 달성에 필요한 요소 역산
- 설정된 목표를 달성하기 위해 무엇이 필요한지 단계적으로 질문하고 답하며 요소를 도출합니다.
- “사용자 등록/갱신을 위해 무엇이 필요한가?” -> “CSV 사용자 등록/갱신 비동기 처리가 필요하다.” (이것을 ‘스텝’이라 명명)
- “비동기 처리는 어떤 형태인가?” -> “ActiveJob을 활용한 UserImportJob 형태일 것이다.”
- “Job 내부의 처리는 어디에 작성할 것인가?” -> “재사용성을 고려하여 Import 모델에 구현한다.” (이때, ‘Import’와 같이 짧고 본질적인 이름을 부여하는 것이 중요)
- “Import 모델을 만들기 위해 무엇이 필요한가?” -> “파일 업로드 시 Import 모델 레코드를 생성해야 한다.”
4. 주변 기능 포함 및 영역 분리
- 도출된 핵심 기능 외에 목록, 상세 보기, 에러 표시 등 주변 기능들을 추가하고, 이를 로직, 등록 화면, 목록/상세 등으로 영역을 나누어 전체 구조를 정리합니다.
5. 절차 계획
- 설계된 구조를 바탕으로 데이터 준비 용이성 등을 고려하여 개발 절차를 수립합니다. (예: Import 로직부터 시작할지, 등록 화면부터 시작할지 등)
이 과정에서 ‘비동기 처리’, ‘서비스 클래스’, ‘모델 중심’, ‘트랜잭션’ 등 레일즈 개발에 자주 사용되는 ‘디자인 파트(Design Parts)’를 활용하고, 초기 결정은 ‘가설(仮置き)’로 간주하여 유연하게 변경할 수 있도록 합니다. 특히 ActiveRecord의 Associations와 params 구조, nested_attributes 등은 레일즈 설계 시 중요한 디자인 파트입니다.