백엔드 개발을 시작할 때는 무작정 코드를 작성하기보다, 먼저 시스템을 어떻게 설계할지 고민해야 한다.
요구사항이 명확하지 않으면 구현 도중 리팩터링이 빈번해지고, 아키텍처가 부실하면 성능 병목이나 보안 문제가 발생할 수 있다.
이 글에서는 백엔드 시스템을 설계할 때 필수적으로 고려해야 할 항목들을 정리한다.
실무뿐 아니라 사이드 프로젝트를 진행할 때도 참고하면 좋다.
1. 요구사항 및 유즈케이스 정의
서비스가 제공해야 하는 기능을 정리하고, 각 기능이 어떻게 작동해야 하는지 구체화한다.
- 회원가입, 로그인, 게시글 작성 등 주요 기능 도출
- 각 기능에 대한 입력값, 출력값, 처리 흐름 정리
- 예외 상황(예: 비밀번호 오류, 중복된 ID 등) 정의
[예시]
기능: 회원가입
- 입력: 이메일, 비밀번호
- 출력: 가입 성공 메시지 또는 에러 코드
- 예외: 이메일 중복, 비밀번호 형식 오류
기능: 게시글 작성
- 입력: 제목, 내용, 첨부파일
- 출력: 게시글 ID, 작성 시간
- 예외: 로그인하지 않은 사용자, 제목 없음
2. 도메인 모델 및 데이터 구조 설계
도메인 모델은 시스템이 다루는 핵심 객체를 의미한다. 이 객체들 간의 관계와 속성을 정의하고, 이를 바탕으로 데이터베이스 구조를 설계한다.
- 사용자, 게시글, 주문 등 주요 도메인 식별
- 각 객체의 속성과 관계 정의 (1:N, N:M 등)
- ERD 작성 및 데이터베이스 테이블 설계
[예시] 도메인 모델
엔티티: User
- 필드: id, email, password, createdAt
엔티티: Post
- 필드: id, title, content, authorId, createdAt
관계: User 1:N Post (사용자 1명이 여러 게시글 작성 가능)
예시 (엔티티 클래스 - Java)
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String email;
private String password;
private LocalDateTime createdAt;
}
3. API 명세 정의
프론트엔드와 백엔드가 통신하기 위한 REST API 명세를 문서화한다.
- 각 기능에 대응하는 URI, HTTP Method(GET, POST 등) 정의
- 요청(Request)과 응답(Response)의 데이터 구조 명시
- 인증/인가 처리 방식 포함 (JWT, OAuth 등)
- Swagger 또는 Postman을 활용해 문서화
예시 - 회원 가입 API 명세
POST /api/users
Content-Type: application/json
{
"email": "test@example.com",
"password": "1234"
}
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 1,
"email": "test@example.com"
}
4. 시스템 아키텍처 설계
시스템 전반의 구성 요소와 구조를 설계한다. 초기에는 모놀리식 아키텍처로 시작하고, 트래픽이 증가하면 마이크로서비스로 전환하는 경우가 많다.
- 시스템 구성 방식 결정 (모놀리식 / 마이크로서비스)
- 서버, DB, 캐시, 메시지 큐, 3rd-party 연동 구성
- 주요 기술 스택과 데이터 흐름도 정의
[예시]
구조: 모놀리식 (Spring Boot 기반 단일 애플리케이션)
구성 요소:
- Web 서버: Nginx
- 애플리케이션 서버: Spring Boot
- 데이터베이스: MySQL
- 캐시: Redis
- 외부 연동: 결제 API (KakaoPay)
5. 보안 요구사항 정의
사용자의 데이터와 시스템을 보호하기 위한 설계가 필요하다.
- 인증/인가 방식 설정 (JWT, OAuth2 등)
- 민감 정보 암호화 (비밀번호, 카드정보 등)
- 입력값 검증 (SQL Injection, XSS 방지)
- 보안 헤더, HTTPS 적용 여부 등
[예시]
인증: JWT (로그인 시 AccessToken 발급)
입력값 검증: 이메일 형식 체크, SQL Injection 방지
암호화: 비밀번호는 BCrypt 해시 처리
HTTPS 적용, 보안 헤더 설정 (CSP, X-Content-Type-Options 등)
6. 성능 및 확장성 고려
서비스 운영 중 예상되는 트래픽에 대응할 수 있어야 한다.
- 예상 동시 접속자 수, 요청 수 계산
- 캐싱 전략 (Redis 등), 로드 밸런서 활용
- 수평/수직 확장 고려
- DB 인덱스 최적화, 쿼리 튜닝 등 성능 개선 전략 포함
[예시]
예상 트래픽: 동시 접속자 1,000명
캐시 전략: Redis로 인기 게시글 캐싱
DB 튜닝: 게시글 목록 조회 시 인덱스 사용
확장성: 애플리케이션 서버 Auto Scaling 구성
7. 에러 처리 및 로깅 전략 수립
운영 중 발생하는 에러를 추적하고, 빠르게 대응할 수 있는 체계를 마련한다.
- 예외 상황 정의 및 처리 방법 설계
- 로그 레벨 설정 (INFO, WARN, ERROR 등)
- 로그 저장소 및 모니터링 도구 설정 (ELK, Grafana 등)
- 알림 시스템 연동 (Slack, 이메일 등)
[예시]
예외 처리: GlobalExceptionHandler 사용 (Spring)
에러 코드 정의: 400 Bad Request, 404 Not Found, 500 Internal Server Error 등
로그 수집: Logback → Filebeat → Elasticsearch
모니터링: Grafana 대시보드, Slack 알림 연동
추가 고려 하면 좋은 항목
항목 | 설명 |
CI/CD 및 배포 전략 | GitHub Actions, Jenkins 등을 통한 자동화 배포, 롤백 전략 수립 |
테스트 계획 | 유닛 테스트, 통합 테스트, API 테스트 시나리오 정리 |
문서화 | Swagger, Postman, 시스템 구조도, 데이터 흐름도 작성 |
운영 및 모니터링 | Prometheus, Grafana, 알림 시스템 설정 |
법적/규제 요건 | 개인정보 보호법, GDPR, 로그 보관 정책 준수 |
백엔드 설계 시 필수 문서 리스트
문서 | 설명 |
요구사항 정의서 | 기능 목록, 유즈케이스, 시나리오 정리 |
도메인 모델 설계서 | 엔티티 목록, 관계도(ERD), DB 테이블 정의 |
API 명세서 | URI, HTTP Method, 요청/응답 예시, 인증 방식 |
시스템 아키텍처 문서 | 전체 구성도, 기술 스택, 데이터 흐름도 |
보안 정책 문서 | 인증/인가 방식, 암호화 전략, 취약점 대응 |
성능/확장 전략서 | 트래픽 예측, 캐싱 전략, Auto Scaling 방안 |
예외 및 로깅 처리 정책 | 에러 처리 흐름, 로그 포맷, 모니터링 도구 사용법 |
CI/CD 문서 | 빌드/테스트/배포 자동화 흐름, 롤백 전략 |
테스트 시나리오 | 유닛/통합/API 테스트 케이스 |
운영/모니터링 가이드 | 장애 대응 시나리오, 알림 설정, 시스템 점검 프로세스 |
백엔드 설계는 단순한 기술 구현을 넘어서, 시스템 전체의 품질과 확장성, 유지보수성을 좌우한다.
잘 설계된 시스템은 장애에 강하고, 변경에 유연하며, 사용자 경험을 개선한다.
또한, 이후 프로젝트 운영 및 유지보수 시에도 기본 문서로 유용하게 사용이 가능하다.
실무에서 문서가 제대로 안 되어 있는 프로젝트 만큼 운영하기 어려운 프로젝트도 없다.
실제 프로젝트를 진행할 때 위 내용을 하나의 체크리스트처럼 활용해 보자.
그러면 기본적으로 프로젝트 구축 시 발생 할 문제들을 사전에 체크할 수 있을 것이다.
'Develop Basic' 카테고리의 다른 글
Log 로그는 왜 사용하는 것인가? 로그 레벨 정리 (0) | 2021.06.18 |
---|---|
홈브류 Homebrew 는 무엇인가? (+기본 명령어) (0) | 2021.06.02 |
홈브류 에러 해결! Error: homebrew-core is a shallow clone. (0) | 2021.05.27 |
Error: Unknown command: cask | java, mysql 설치 시 발생 에러 (0) | 2021.05.26 |
vi 문자열 찾기 및 문자열 바꾸기 총정리 (0) | 2021.05.25 |
댓글