10강예상 3분입문
[요약] Part 2. 복잡함을 피하는 실용적 백엔드 구조
Part 2. 복잡함을 피하는 실용적 백엔드 구조의 핵심 내용을 정리하고 복습하는 요약 회차입니다.
- 핵심 목표: 복잡함을 피하고 실무에서 견고하게 작동하는 백엔드 아키텍처의 기본기 확립
- 구조의 중요성: AI가 빠르게 코드를 짜더라도 폴더 구조와 계층이 무너지면 유지보수 불가
왜 아키텍처와 폴더 구조가 중요할까요?
- AI의 한계: 코드를 한 파일에 몰아넣거나 일관성 없이 쪼개어 스파게티 코드 유발
- 아키텍처의 본질: 코드가 위치할 명확한 기준 제시
- 통제력 확보: 명확한 원칙 하에 AI에게 특정 로직의 계층 분리를 정확히 지시 가능
핵심 구조 복습하기
- 표준 레이아웃: 실무 Go 백엔드의 스탠다드 레이아웃 및 4계층 아키텍처 필수 암기
실무 Go 프로젝트의 기본 폴더 구조
- cmd/
- 프로그램의 시작점(main.go)이 위치하는 곳. 여러 실행 파일을 관리할 수 있습니다.
- internal/
- 외부 패키지에서 가져다 쓸 수 없도록 감추는 프로젝트의 핵심 비즈니스 로직.
- pkg/
- 다른 프로젝트에서도 유용하게 재사용할 수 있는 범용적인 라이브러리 코드.
- migrations/
- 데이터베이스 스키마 변경 내역을 버전별로 관리하는 SQL 파일들.
역할의 완벽한 분리: 4계층 아키텍처
- 단일 책임 원칙: 한 파일에서 요청, 검증, 저장을 모두 처리하지 않고 계층별 단일 역할 부여
백엔드 계층 간의 데이터 흐름
Router
요청을 알맞은 곳으로 전달
Handler
Handler
HTTP 요청/응답 처리 후 위임
Service
Service
핵심 비즈니스 로직 수행 후 데이터 요청
Repository
Repository
데이터베이스와 직접 통신
Database
- 인터페이스 의존: 계층 간 결합도를 낮추기 위해 구체적 구현이 아닌 인터페이스로 통신
- 영향 최소화: Service나 Repository의 내부 코드가 바뀌어도 다른 계층에 미치는 영향 차단
계층 분리를 지시하는 프롬프트 예시
- 프롬프트 설계: AI에게 코드를 요구할 때 반드시 아키텍처 구조를 먼저 잡아줄 것
"새로운 유저 가입 기능을 만들어줘. HTTP 요청과 응답을 처리하는 코드는 `internal/handler/user_handler.go`에 작성하고, 중복 가입 확인 등의 비즈니스 로직은 `internal/service/user_service.go`에 작성해. DB에 저장하는 코드는 `internal/repository/user_repo.go`로 완전히 분리해줘. 각 계층 간의 통신은 인터페이스를 사용하도록 설계해 줘."
구조를 지키는 것이 개발 속도를 높입니다
- 장기적 효율성: 초기 구조 설계가 번거롭더라도, 프로젝트 확장 시 거대한 혼란 방지
- 체계적 통합: AI가 생성한 코드 파편들을 설계해 둔 아키텍처라는 책장의 올바른 칸에 배치
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.웹 브라우저에서 들어온 HTTP 요청 데이터를 읽고 검증한 뒤, 적절한 응답 코드(예: 200 OK 또는 400 Bad Request)를 반환하는 역할을 담당하는 계층은 어디인가요?
3줄 요약
- 1좋은 아키텍처는 코드가 어디에 위치해야 하는지 명확한 기준을 제공하여 유지보수를 쉽게 합니다.
- 2cmd와 internal 폴더를 활용하여 외부 노출을 제어하고 프로젝트의 시작점을 깔끔하게 관리하세요.
- 3Handler, Service, Repository로 역할을 분리하면 코드의 결합도가 낮아져 확장이 용이해집니다.