AI가 코드를 작성하는 시대가 되었다.
이제 단순 구현 능력은 점점 중요도가 낮아지고 있다.
하지만 한 가지는 변하지 않는다.
무엇을 어떻게 만들 것인지 결정하는 능력, 즉 설계는 여전히 인간의 영역이다.
AI는 빠르게 코드를 만들어주지만,
그 코드가 올바른 구조인지, 미래에도 유지될 수 있는지 판단하지는 않는다.
결국 개발자의 역할은 바뀌고 있다.
- 예전: 직접 구현하는 사람
- 지금: 구조를 결정하고 검증하는 사람
이 글은 “설계를 잘하기 위해 무엇을 공부해야 하는가”를
단순 이론이 아니라 판단 기준을 만드는 과정으로 정리한 로드맵이다.
0. 설계란 무엇인가
설계는 코드를 잘 짜는 능력이 아니다.
설계는 다음 질문에 답할 수 있는 능력이다.
- 이 구조는 왜 이렇게 나뉘어 있는가
- 데이터는 어디서 생성되고 어디서 검증되는가
- 장애가 발생하면 어디서 터지는가
- 트래픽이 증가하면 무엇이 병목이 되는가
중요한 건 하나다.
설계는 현재가 아니라 미래를 기준으로 하는 판단이다.
따라서 CS 공부도 단순 지식 암기가 아니라
문제가 발생했을 때 올바른 선택을 할 수 있는 기준을 만드는 과정이어야 한다.
1단계: 요청과 데이터 흐름 이해
목표
하나의 요청이 시스템을 어떻게 통과하는지 명확히 설명할 수 있어야 한다.
핵심 개념
- HTTP request/response lifecycle
- REST API 설계
- 동기 vs 비동기
- blocking vs non-blocking
- 직렬화/역직렬화 (JSON, DTO)
왜 중요한가
대부분의 설계 문제는 “흐름을 잘못 이해하는 것”에서 시작된다.
- API 응답이 느린 이유
- 스레드가 막히는 이유
- 불필요한 네트워크 비용
흐름을 모르면 구조를 나눌 수 없다.
학습 방법
- 하나의 API 요청을 끝까지 로그로 추적
- Controller → Service → Repository 흐름 시각화
- 요청 1건이 DB를 몇 번 호출하는지 확인
체크 기준
- “이 API는 왜 동기인가?” 설명할 수 있는가
- “비동기로 바꾸면 어떤 문제가 생기는가” 말할 수 있는가
2단계: 데이터 저장과 트랜잭션
목표
데이터가 깨지지 않도록 보호하는 구조를 설계할 수 있어야 한다.
핵심 개념
- 트랜잭션 (ACID)
- Isolation Level
- 인덱스
- N+1 문제
- 정규화 vs 비정규화
- Lock 전략
왜 중요한가
운영 환경에서 가장 많이 터지는 영역은 DB다.
- 데이터 정합성 문제
- 성능 저하
- deadlock
이 영역을 이해하지 못하면
“동작하는 코드”는 만들 수 있어도
“신뢰할 수 있는 서비스”는 만들 수 없다.
학습 방법
- 동일 기능을 다양한 쿼리로 구현해보기
- 인덱스 적용 전/후 성능 비교
- 트랜잭션 범위 줄이는 실험
체크 기준
- “왜 이 쿼리에 인덱스가 필요한가” 설명 가능한가
- “트랜잭션이 길어지면 어떤 문제가 생기는가” 말할 수 있는가
3단계: 객체 설계와 책임 분리
목표
코드를 기능이 아닌 책임 기준으로 나눌 수 있어야 한다.
핵심 개념
- SRP (단일 책임 원칙)
- 의존성 방향
- 계층 구조
- 도메인 모델링
- 객체 간 협력
왜 중요한가
이 단계에서 개발자의 수준이 크게 갈린다.
- 초급: 기능 중심 코드
- 중급: 계층 중심 코드
- 고급: 책임 중심 설계
설계가 좋은 시스템은 기능이 추가되어도 무너지지 않는다.
학습 방법
- 기존 코드의 책임 위치 분석
- 하나의 기능을 여러 구조로 설계
- Controller 로직을 Domain으로 이동시켜보기
체크 기준
- “이 로직은 왜 여기에 있는가” 설명 가능한가
- “이 책임을 옮기면 어떤 장점이 생기는가” 말할 수 있는가
4단계: 비동기 처리와 시스템 확장
목표
트래픽이 증가해도 구조가 유지되도록 설계할 수 있어야 한다.
핵심 개념
- 비동기 처리 (Future, Event)
- 메시지 큐
- 캐싱 전략
- stateless vs stateful
- eventual consistency
왜 중요한가
서비스는 항상 성장한다.
- 트래픽 증가
- 응답 속도 요구
- 외부 시스템 연동
이때 기존 구조를 유지하면서 확장할 수 있어야 한다.
학습 방법
- 동기 로직을 비동기로 변환
- 캐시 적용 전/후 비교
- 간단한 이벤트 기반 구조 구현
체크 기준
- “비동기로 바꾸면 어떤 trade-off가 있는가”
- “캐시 사용 시 정합성은 어떻게 보장할 것인가”
5단계: 장애 대응과 운영 설계
목표
문제가 발생했을 때 빠르게 원인을 찾고 복구할 수 있어야 한다.
핵심 개념
- 로깅 전략
- 모니터링 (metrics, tracing)
- timeout / retry
- circuit breaker
- 장애 격리
왜 중요한가
실제 서비스에서는 “정상 동작”보다
“비정상 상황 대응”이 더 중요하다.
이 상황에서 시스템이 전체적으로 무너지지 않아야 한다.
학습 방법
- 일부러 timeout 상황 만들기
- 외부 API 실패 시뮬레이션
- retry 로직 적용 후 영향 분석
체크 기준
- “이 API가 실패하면 어떻게 동작하는가”
- “장애 발생 시 어디를 먼저 봐야 하는가”
6단계: AI 시대의 설계 학습법
AI는 이제 코드를 대신 작성한다.
하지만 설계는 대신 해주지 않는다.
따라서 학습 방식도 바뀌어야 한다.
설계 질문을 먼저 던진다
코드를 작성하기 전에 항상 생각한다.
- 이 책임은 어디에 있어야 하는가
- 이 구조는 왜 이렇게 나뉘어 있는가
- 어디가 병목이 될 가능성이 있는가
- 트래픽이 증가하면 어디가 먼저 터지는가
하나의 기능을 여러 번 설계한다
- 빠르게 구현하는 구조
- 유지보수 중심 구조
- 확장성 중심 구조
이 비교 과정에서 설계 감각이 생긴다.
AI를 구현자가 아닌 검증자로 사용한다
- 설계 리뷰 요청
- 리스크 분석 요청
- 대안 비교 요청
AI를 잘 쓰는 개발자는
더 많은 코드를 만드는 사람이 아니라
더 많은 선택지를 검증하는 사람이다.
마무리
이제 구현은 점점 자동화되고 있다.
하지만 설계는 오히려 더 중요해지고 있다.
설계를 잘하는 개발자는 코드를 많이 작성하는 사람이 아니다.
문제가 발생하기 전에 어디서 터질지를 예측할 수 있는 사람이다.
CS 공부의 목적은 지식을 쌓는 것이 아니라
그 예측을 가능하게 하는 기준을 만드는 것이다.
결국 설계는 기술이 아니라 판단이다.