프로젝트 체크리스트
chat gpt 작품
1. 코드 품질 및 유지 보수성
1.1 코드 일관성
코드 스타일 가이드 준수
변수명: 변수명은 일관되게 **카멜 케이스(camelCase)**로 작성하고 의미를 명확히 전달하는가? 예: userName, accountBalance
함수명: 함수명은 동사로 시작하고 기능을 명확히 표현하는가? 예: getUser, calculateTotal
클래스명: 클래스명은 **파스칼 케이스(PascalCase)**로 작성되고 있는가? 예: UserService, AccountManager
인덴트: 팀의 코딩 규칙에 따라 인덴트(들여쓰기)가 일관되게 사용되고 있는가? (보통 2 또는 4 스페이스)
포매터 도구 사용: Prettier, ESLint (JavaScript/TypeScript), Checkstyle (Java), pylint, flake8, black (Python)와 같은 코드 포매터 도구를 사용하여 자동으로 코드 스타일을 맞추고 있는가?
설정 파일이 프로젝트에 포함되어 있고, 팀원들이 일관되게 사용하고 있는가?
1.2 주석 및 문서화
주석
중요한 로직 주석: 복잡한 알고리즘이나 중요 로직에 대한 주석이 적절히 작성되어 있는가? 예: 함수의 목적, 매개변수, 반환값 설명
최신 상태 유지: 주석은 최신 상태로 유지되고, 코드 변경 시 함께 업데이트되는가?
코드 외부 문서화
API 문서화: Swagger, OpenAPI 등을 사용하여 REST API를 자동으로 문서화하고 있는가?
엔드포인트, 요청/응답 형식, 예제 등이 포함되어 있는가?
사용 설명서: 코드 외부에 README 파일이나 위키 페이지로 프로젝트 설정, 빌드, 배포 방법 등이 명확히 문서화되어 있는가?
프로젝트 설정, 설치, 사용법, 예제 코드 등이 포함되어 있는가?
1.3 테스트 커버리지
단위 테스트
작성 여부: 각 함수와 메소드에 대한 단위 테스트가 충분히 작성되어 있는가?
테스트 도구 사용: JUnit, Mockito (Java), Jest (JavaScript/TypeScript), unittest, pytest (Python)와 같은 테스트 도구를 사용하여 테스트 커버리지를 측정하고 있는가?
커버리지 보고서가 생성되고, 목표 커버리지를 설정하고 있는가? (예: JaCoCo, coverage.py)
통합 테스트
상호작용 검증: 통합 테스트를 통해 모듈 간 상호작용이 검증되고 있는가?
API 통합 테스트: 실제 서비스 환경에서 예상대로 동작하는 API 통합 테스트가 작성되어 있는가?
종단 간 테스트 (E2E 테스트)
사용자 시나리오: 실제 사용자 시나리오를 바탕으로 작성된 E2E 테스트가 있는가? (예: Selenium, Cypress)
CI/CD 파이프라인: 자동화된 E2E 테스트가 CI/CD 파이프라인에 포함되어 있는가?
1.4 리팩토링
코드 리팩토링
주기적 리팩토링: 복잡한 코드나 중복된 코드가 정기적으로 리팩토링 되고 있는가?
도구 사용: 코드 냄새(Code Smells)를 제거하기 위한 도구 (예: SonarQube)를 사용하고 있는가?
코드 개선: 기능을 추가하거나 버그를 수정할 때, 기존 코드를 개선하고 있는가?
리팩토링 과정에서 기존 기능이 정상 동작하는지 테스트하고 있는가?
2. 성능 및 최적화
2.1 응답 시간
응답 시간 모니터링
주요 API 엔드포인트: 주요 API 엔드포인트의 응답 시간이 적절한가? (예: 1초 이하)
모니터링 도구 사용: 모니터링 도구 (예: New Relic, Datadog, Prometheus)를 사용하여 응답 시간을 지속적으로 모니터링하고 있는가?
성능 대시보드가 설정되어 있고, 정기적으로 검토되고 있는가?
성능 기준 설정: 성능 기준을 설정하고, 이를 만족하는지 정기적으로 검토하고 있는가?
2.2 자원 사용량
자원 사용 최적화
CPU, 메모리 최적화: CPU, 메모리, 네트워크 사용량이 최적화되어 있는가?
프로파일링 도구 사용: 프로파일링 도구 (예: VisualVM for Java, Chrome DevTools for JavaScript, cProfile for Python)를 사용하여 자원 사용량을 분석하고 있는가?
비효율적인 코드나 알고리즘을 최적화하고 있는가?
비동기 처리: 비동기 처리가 필요한 경우 적절히 구현되어 있는가? (예: async/await, Promise)
2.3 프로파일링
성능 병목 식별
병목 지점 식별: 프로파일링 도구를 사용하여 성능 병목 지점을 식별하고 최적화하고 있는가?
CPU, 메모리 사용 패턴을 분석하여 병목 지점을 해결하고 있는가?
데이터베이스 최적화: 데이터베이스 쿼리 성능을 프로파일링하고, 인덱스 최적화나 쿼리 리팩토링을 통해 개선하고 있는가?
3. 보안
3.1 데이터 보호
데이터 암호화
저장 데이터 암호화: 민감한 데이터 (예: 비밀번호, 개인 정보)가 적절히 암호화되어 저장되고 있는가? (예: AES, RSA)
데이터베이스에 암호화된 형태로 저장되고 있는가?
전송 데이터 암호화: 데이터 전송 시 SSL/TLS를 사용하여 데이터를 암호화하고 있는가?
HTTPS를 통해 안전한 통신이 이루어지고 있는가?
3.2 인증 및 인가
인증 메커니즘
강력한 인증: 강력한 인증 메커니즘이 구현되어 있는가? (예: OAuth2, JWT)
다중 요소 인증: 다중 요소 인증 (MFA)을 도입하여 보안을 강화하고 있는가?
인가 메커니즘
RBAC/ABAC: RBAC (Role-Based Access Control) 또는 ABAC (Attribute-Based Access Control)을 사용하여 권한을 관리하고 있는가?
사용자 권한이 명확히 정의되고, 최소 권한 원칙이 적용되고 있는가?
3.3 취약점 관리
보안 취약점 방지
보안 취약점 방지: SQL 인젝션, XSS, CSRF 등의 보안 취약점이 방치되고 있는가?
정적 코드 분석 도구 사용: 정적 코드 분석 도구 (예: SonarQube)를 사용하여 보안 취약점을 식별하고 해결하고 있는가?
정기적 보안 점검: 정기적인 보안 점검과 펜 테스트 (Penetration Testing)를 통해 보안 취약점을 발견하고 있는가?
보안 업데이트와 패치가 신속히 적용되고 있는가?
4. 데이터베이스 설계 및 관리
4.1 스키마 설계
데이터 모델링
정규화: 데이터베이스 스키마가 적절하게 정규화되어 있는가?
1NF (First Normal Form): 모든 속성이 원자값을 가지는가?
2NF (Second Normal Form): 부분 함수 종속성이 제거되었는가?
3NF (Third Normal Form): 이행 함수 종속성이 제거되었는가?
관계 정의: 테이블 간의 관계가 명확하게 정의되어 있는가? (예: 외래 키)
각 테이블의 외래 키가 적절히 설정되어 있는가?
다대다 관계는 중간 테이블을 사용하여 해결되었는가?
스키마 변경 관리: 스키마 변경이 발생할 때, 이를 추적하고 관리할 수 있는 도구를 사용하고 있는가? (예: ERD, Flyway, Liquibase)
변경 이력을 추적하고 롤백할 수 있는가?
ERD (Entity-Relationship Diagram)를 통해 데이터 모델이 시각적으로 표현되고 있는가?
4.2 인덱싱
인덱스 최적화
필요한 인덱스 설정: 주요 쿼리에 필요한 인덱스가 잘 설정되어 있는가?
검색이 자주 발생하는 컬럼에 인덱스가 설정되어 있는가?
JOIN, WHERE, ORDER BY, GROUP BY 등에 사용되는 컬럼에 적절한 인덱스가 있는가?
인덱스 최적화: 인덱스가 과도하게 사용되지 않고 필요한 곳에만 설정되어 있는가?
과도한 인덱스 사용으로 인해 쓰기 성능이 저하되지 않는가?
중복된 인덱스가 없는가?
인덱스 사용 현황 모니터링: 인덱스 사용 현황을 모니터링하고 필요에 따라 최적화하고 있는가?
EXPLAIN 명령어를 사용하여 쿼리 실행 계획을 분석하고 있는가?
성능 저하가 발생하는 쿼리에 대해 인덱스 추가 또는 최적화를 수행하고 있는가?
4.3 백업 및 복구
백업 전략
정기적 백업: 정기적인 데이터 백업 전략이 수립되어 있는가? (예: 매일, 매주 백업)
전체 백업, 증분 백업, 차등 백업 등 다양한 백업 전략이 사용되고 있는가?
백업 주기와 보존 기간이 명확히 정의되어 있는가?
복구 절차 문서화: 백업 데이터의 복구 절차가 문서화되어 있고, 테스트되었는가?
복구 절차가 명확하게 문서화되어 있고, 주기적으로 복구 테스트가 이루어지고 있는가?
복구 시나리오별로 필요한 도구와 명령어가 문서화되어 있는가?
복구 대비책: 데이터베이스 장애 발생 시 복구 시간을 최소화하기 위한 대비책이 마련되어 있는가?
장애 시 신속하게 대응할 수 있는 복구 계획이 수립되어 있는가?
복구 과정에서의 데이터 무결성과 일관성을 검증할 수 있는 절차가 마련되어 있는가?
4.4 데이터 보안
데이터 암호화
암호화 방식: 저장 데이터와 전송 데이터의 암호화가 적절하게 구현되어 있는가? (예: AES, RSA, TLS)
접근 제어: 데이터베이스 접근 권한이 적절하게 설정되어 있는가?
최소 권한 원칙이 적용되어 있는가?
사용자의 접근 로그가 기록되고 있는가?
SQL 인젝션 방지
프리페어드 스테이트먼트: SQL 쿼리 작성 시 프리페어드 스테이트먼트를 사용하고 있는가?
입력 검증: 사용자 입력값에 대한 철저한 검증이 이루어지고 있는가?
4.5 성능 최적화
캐싱 전략
캐싱 도입: Redis, Memcached와 같은 캐싱 시스템을 사용하여 데이터베이스 부하를 줄이고 있는가?
적절한 TTL 설정: 캐시 데이터의 TTL (Time-To-Live)이 적절히 설정되어 있는가?
파티셔닝
테이블 파티셔닝: 대용량 테이블에 대해 파티셔닝을 적용하여 쿼리 성능을 최적화하고 있는가?
파티션 키가 적절하게 선택되었는가?
파티션 관리가 용이하게 이루어지고 있는가?
4.6 데이터 무결성 및 트랜잭션 관리
데이터 무결성
제약 조건: 각 테이블에 적절한 제약 조건 (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL)이 설정되어 있는가?
트리거 및 스토어드 프로시저: 데이터 무결성을 유지하기 위해 필요한 Trigger나 스토어드 프로시저가 사용되고 있는가?
트랜잭션 관리
ACID 준수: 데이터베이스 트랜잭션이 ACID 속성을 준수하고 있는가? (Atomicity, Consistency, Isolation, Durability)
트랜잭션 격리 수준: 트랜잭션 격리 수준이 적절히 설정되어 있는가? (예: READ COMMITTED, REPEATABLE READ, SERIALIZABLE)
5. 프론트엔드 품질 (React + TypeScript)
5.1 UI/UX
사용자 인터페이스
직관적 UI: UI가 직관적이고 사용하기 쉬운가?
주요 기능이 쉽게 접근 가능하고, 사용자가 직관적으로 이해할 수 있는가?
UI 요소들이 일관된 디자인 패턴을 따르고 있는가?
사용자 피드백: 사용자 피드백을 바탕으로 UI를 지속적으로 개선하고 있는가?
사용자 테스트를 통해 수집된 피드백이 반영되고 있는가?
피드백을 반영한 UI 개선 사항이 기록되고, 추적되고 있는가?
사용자 경험
애니메이션과 트랜지션: 애니메이션과 트랜지션을 적절히 사용하여 사용자 경험을 향상시키고 있는가?
CSS 애니메이션 또는 JavaScript 애니메이션 라이브러리를 사용하여 부드러운 사용자 경험을 제공하고 있는가? (예: Framer Motion, React Spring)
페이지 전환 시 자연스러운 트랜지션이 적용되어 있는가?
페이지 로딩 속도 최적화: 페이지 로딩 속도가 최적화되어 있는가?
코드 스플리팅, Lazy Loading을 통해 초기 로딩 속도를 최적화하고 있는가? (예: React.lazy, React Loadable)
이미지 최적화, 캐싱 전략을 통해 페이지 로딩 속도를 개선하고 있는가?
5.2 반응형 디자인
반응형 디자인 구현
다양한 디바이스 지원: 다양한 디바이스 (모바일, 태블릿, 데스크탑)에서 UI가 잘 작동하는가?
반응형 레이아웃을 구현하여 다양한 화면 크기에서 UI가 적절히 표시되는가?
디바이스별로 다른 UI 요소들이 적절히 조정되고 있는가?
미디어 쿼리 사용: 미디어 쿼리를 사용하여 반응형 디자인을 구현하고 있는가?
CSS 미디어 쿼리를 사용하여 화면 크기에 따라 스타일이 변경되고 있는가?
디자인 프레임워크 활용: 반응형 디자인 프레임워크 (예: Bootstrap, Tailwind CSS)를 사용하여 효율적으로 디자인하고 있는가?
디자인 프레임워크의 그리드 시스템을 사용하여 레이아웃을 구성하고 있는가?
프레임워크의 반응형 유틸리티 클래스를 적절히 활용하고 있는가?
5.3 상태 관리
상태 관리 일관성
상태 관리 라이브러리 사용: 상태 관리 라이브러리 (예: Redux, MobX, Context API)가 적절히 사용되고 있는가?
복잡한 상태 관리가 필요한 경우 Redux, MobX 등의 라이브러리를 사용하여 상태 관리가 일관되게 이루어지고 있는가?
Context API를 사용하여 전역 상태를 관리하고 있는가?
단방향 데이터 흐름: 상태 변화가 단방향 데이터 흐름을 따르고 있는가?
상태 변화가 예측 가능하고, 디버깅이 용이한 단방향 데이터 흐름을 유지하고 있는가? (예: Flux 아키텍처)
상태 관리 패턴 일관성: 상태 관리 패턴이 일관되게 적용되고 있는가?
상태 관리와 관련된 코드가 일관된 패턴을 따르고 있는가?
Redux Toolkit을 사용하여 보일러플레이트 코드를 줄이고, 일관된 상태 관리 패턴을 적용하고 있는가?
5.4 코드 스플리팅 및 성능 최적화
코드 스플리팅
Dynamic Import: React.lazy와 Suspense를 사용하여 동적 임포트를 구현하고 있는가?
Webpack 설정: Webpack을 사용하여 코드 스플리팅을 효율적으로 설정하고 있는가?
성능 최적화
메모이제이션: React.memo, useMemo, useCallback 등을 사용하여 불필요한 렌더링을 방지하고 있는가?
브라우저 캐싱: 브라우저 캐싱을 적절히 활용하여 자원을 효율적으로 사용하고 있는가?
5.5 접근성 (Accessibility)
웹 접근성 표준 준수
WAI-ARIA: WAI-ARIA (Web Accessibility Initiative – Accessible Rich Internet Applications) 표준을 준수하고 있는가?
스크린 리더 지원: 스크린 리더를 통해 웹 페이지를 탐색할 수 있는가?
키보드 네비게이션: 모든 기능이 키보드로 접근 가능하고, 포커스가 명확히 표시되는가?
5.6 국제화 및 현지화 (i18n)
다국어 지원
국제화 라이브러리 사용: react-intl, i18next 등의 라이브러리를 사용하여 다국어 지원을 구현하고 있는가?
다국어 리소스 관리: 다국어 리소스 파일이 구조적으로 관리되고 있는가?
현지화 고려
문화적 차이 반영: 날짜, 시간, 숫자, 통화 등의 형식이 현지화되어 있는가?
사용자 설정: 사용자가 언어와 지역 설정을 쉽게 변경할 수 있는가?
6. 백엔드 품질 (Spring Boot)
6.1 API 설계
RESTful API 설계
일관된 엔드포인트: API 엔드포인트가 일관되고 RESTful한 방식으로 설계되어 있는가?
리소스 중심의 URI 설계가 되어 있는가? (예: /users/{id}, /orders/{id})
HTTP 메소드 사용: HTTP 메소드 (GET, POST, PUT, DELETE 등)가 일관되게 사용되고 있는가?
CRUD (Create, Read, Update, Delete) 작업에 적절한 HTTP 메소드를 사용하고 있는가?
응답 코드 사용: 응답 코드 (200, 201, 400, 404, 500 등)가 적절히 사용되고 있는가?
각 API 응답에 적절한 HTTP 상태 코드를 반환하고 있는가?
에러 발생 시 의미 있는 에러 메시지와 상태 코드를 제공하고 있는가?
6.2 서비스 레이어 분리
비즈니스 로직 분리
서비스 레이어: 비즈니스 로직이 컨트롤러와 분리되어 서비스 레이어에 잘 위치해 있는가?
컨트롤러는 요청을 처리하고, 서비스 레이어는 비즈니스 로직을 담당하고 있는가?
모듈화: 서비스 레이어가 충분히 모듈화되어 재사용 가능한 코드가 작성되고 있는가?
각 서비스 클래스가 단일 책임 원칙을 따르고 있는가?
재사용 가능한 유틸리티 클래스와 헬퍼 메소드가 잘 분리되어 있는가?
6.3 에러 처리
에러 핸들링
에러 처리 구현: 에러 처리가 잘 구현되어 있고, 의미 있는 에러 메시지를 제공하는가?
예외 발생 시 적절한 예외 처리가 이루어지고 있는가?
사용자에게 전달되는 에러 메시지가 명확하고 유용한가?
글로벌 예외 처리: 글로벌 예외 처리 (예: @ControllerAdvice)를 사용하여 일관된 에러 응답을 제공하고 있는가?
@ControllerAdvice와 @ExceptionHandler를 사용하여 공통적인 예외 처리가 구현되어 있는가?
예외 로그가 적절히 기록되고, 문제 해결에 도움이 되는 정보를 제공하고 있는가?
6.4 데이터베이스 연동 최적화
JPA/Hibernate 사용
엔티티 설계: 엔티티 클래스가 잘 정의되어 있는가?
엔티티 클래스가 데이터베이스 테이블 구조와 일치하는가?
쿼리 최적화: 쿼리가 최적화되어 있는가? (예: N+1 문제 방지)
JPA의 Fetch 전략 (Lazy/Eager)이 적절하게 설정되어 있는가?
캐싱 사용: 2차 캐싱을 통해 쿼리 성능을 최적화하고 있는가? (예: Hibernate 2차 캐시)
캐싱 전략이 적절히 설정되어 있는가?
6.5 성능 모니터링 및 로깅
성능 모니터링
Spring Boot Actuator: Spring Boot Actuator를 사용하여 애플리케이션의 성능을 모니터링하고 있는가?
주요 지표 (헬스 체크, 메트릭, 트레이스 등)를 모니터링하고 있는가?
애플리케이션 성능 모니터링 (APM): New Relic, Datadog, Prometheus 등을 사용하여 애플리케이션 성능을 모니터링하고 있는가?
로깅
SLF4J와 Logback: SLF4J와 Logback을 사용하여 로깅이 잘 설정되어 있는가?
로그 레벨 (DEBUG, INFO, WARN, ERROR)이 적절히 설정되어 있는가?
로그 관리: 로그 파일의 크기와 보존 기간이 적절히 관리되고 있는가?
로그 롤링 전략이 설정되어 있는가?
6.6 보안 강화
Spring Security 설정
인증 및 인가: 사용자 인증 및 인가가 잘 구현되어 있는가? (예: OAuth2, JWT)
CSRF 방지: CSRF 방지가 설정되어 있는가?
HTTPS 적용: HTTPS가 적용되어 있는가?
SSL 인증서가 설치되고, 트래픽이 암호화되고 있는가?
6.7 배포 및 운영
CI/CD 파이프라인
자동화 배포: Jenkins, GitHub Actions, GitLab CI 등을 사용하여 CI/CD 파이프라인이 구축되어 있는가?
코드 변경 시 자동으로 빌드, 테스트, 배포가 이루어지고 있는가?
롤백 전략: 배포 실패 시 자동 롤백 전략이 마련되어 있는가?
환경 구성
환경별 구성 관리: 개발, 테스트, 프로덕션 환경별로 구성 설정이 잘 관리되고 있는가?
환경별 설정 파일 (application-dev.properties, application-prod.properties 등)이 분리되어 있는가?
컨테이너화: Docker를 사용하여 애플리케이션을 컨테이너화하고, Kubernetes 또는 ECS를 사용하여 오케스트레이션을 관리하고 있는가?
6.8 확장성 및 유지보수
확장성 고려
스케일 아웃: 트래픽 증가에 대비하여 애플리케이션이 수평 확장이 가능한가?
무상태 (stateless) 애플리케이션 설계가 되어 있는가?
로드 밸런서를 사용하여 트래픽 분산이 이루어지고 있는가?
유지보수성
코드 베이스 정리: 주기적으로 코드 베이스를 정리하고, 불필요한 코드를 제거하고 있는가?
기술 부채 관리: 기술 부채를 주기적으로 점검하고, 이를 해결하기 위한 계획이 있는가?
7. 클라우드 및 DevOps
7.1 CI/CD 파이프라인
자동화 파이프라인
CI/CD 구축: CI/CD 파이프라인이 구축되어 자동으로 빌드, 테스트, 배포가 이루어지고 있는가?
자동 빌드/테스트/배포: 코드 변경 시 자동으로 빌드, 테스트, 배포가 실행되는가?
자동 롤백: 파이프라인에서 실패 시 자동으로 롤백하는 메커니즘이 있는가?
7.2 인프라 자동화
IaC (Infrastructure as Code)
도구 사용: Terraform, CloudFormation 등을 사용하여 인프라가 코드로 관리되고 있는가?
버전 관리: 인프라 변경 사항이 버전 관리되고 있는가?
7.3 모니터링 및 로깅
시스템 모니터링
모니터링 도구 사용: Prometheus, Grafana, ELK 스택 등을 사용하여 시스템 모니터링 및 로깅이 잘 설정되어 있는가?
성능 지표 모니터링: 주요 성능 지표 (CPU, 메모리, 디스크 I/O 등)가 모니터링되고 있는가?
알림 시스템 구축: 알림 시스템이 잘 구축되어 있는가? (예: Alertmanager, PagerDuty)
8. 프로젝트 관리 및 팀워크
8.1 타임라인 준수
프로젝트 일정 관리
일정 준수: 프로젝트 일정이 잘 지켜지고 있는가?
마일스톤/데드라인 정의: 마일스톤과 데드라인이 명확히 정의되어 있는가?
지연 대응: 일정 지연 시 적절한 대응 방안이 마련되어 있는가?
8.2 커뮤니케이션
팀 내 커뮤니케이션
정기적 미팅: 팀 내 커뮤니케이션이 원활하게 이루어지고 있는가? (예: 정기적인 스탠드업 미팅, 회의록 작성)
협업 도구 사용: 팀 간 협업 도구 (예: Slack, Microsoft Teams)가 활용되고 있는가?
8.3 이슈 추적
이슈 관리
이슈 추적 시스템 사용: JIRA, Trello 등 이슈 추적 시스템을 통해 할 일과 버그가 잘 관리되고 있는가?
명확한 정의: 이슈가 명확히 정의되고, 우선순위가 지정되어 있는가?
상태 업데이트: 이슈 해결 상태가 지속적으로 업데이트되고 있는가?
9. 사용성 테스트 및 피드백
9.1 사용자 테스트
사용자 피드백 수집
피드백 수집: 실제 사용자 또는 이해관계자로부터 피드백을 받고 있는가?
사용자 테스트 시나리오: 사용자 테스트 시나리오가 정의되어 있고, 테스트가 정기적으로 수행되고 있는가?
UI/UX 개선: 사용자 피드백을 통해 UI/UX를 지속적으로 개선하고 있는가?
9.2 피드백 반영
피드백 관리
피드백 반영: 받은 피드백을 잘 반영하고 있는가?
투명한 공유: 피드백 반영 상태가 투명하게 공유되고 있는가?
재검토: 피드백 반영 후 재검토가 이루어지고 있는가?
10. 학습 및 개선
10.1 회고
주기적인 회고
회고 실시: 주기적인 회고를 통해 무엇이 잘 되었고 무엇을 개선해야 하는지 논의하고 있는가?
액션 아이템 도출: 회고 결과를 바탕으로 구체적인 액션 아이템이 도출되고 실행되고 있는가?
10.2 지속적 학습
학습 환경 조성
학습 기회 제공: 팀원들이 지속적으로 학습하고 성장할 수 있는 환경이 조성되어 있는가? (예: 기술 세미나, 워크숍, 온라인 강의)
지식 공유: 지식 공유 문화가 형성되어 있는가? (예: 사내 기술 블로그, 스터디 그룹)
Spring Boot 개발 체크리스트
1. 프로젝트 초기 설정
프로젝트 생성
Spring Initializr 사용: URL 확인 및 접근 (start.spring.io)
프로젝트 메타데이터 설정: Group, Artifact, Name, Description
필요한 의존성 선택:
Web: spring-boot-starter-web
데이터베이스: spring-boot-starter-data-jpa, spring-boot-starter-data-mongodb 등
보안: spring-boot-starter-security
기타: spring-boot-starter-actuator, spring-boot-starter-thymeleaf
Java 버전 확인: 11, 17, 20 등
패키징 타입 설정: jar 또는 war (배포 환경에 따라 결정)
프로젝트 구조 설정
패키지 구조:
com.example.myapp.controller
com.example.myapp.service
com.example.myapp.repository
com.example.myapp.domain
com.example.myapp.config
주요 클래스 생성:
Application: Spring Boot 애플리케이션 진입점
BaseEntity: 공통 엔티티 속성 정의 (ID, 생성일, 수정일 등)
버전 관리 설정
Git 저장소 초기화 및 .gitignore 설정
기본적인 커밋 메시지 규칙 설정
2. 빌드 및 의존성 관리
빌드 도구 설정
Maven 설정:
pom.xml에서 프로젝트 정보 및 의존성 관리
<dependencyManagement> 섹션을 사용하여 의존성 버전 관리
Gradle 설정:
build.gradle에서 프로젝트 정보 및 의존성 관리
버전 속성 분리 (gradle.properties 파일 사용)
의존성 관리
불필요한 의존성 제거 및 정리
최신 안정 버전으로 의존성 업데이트
의존성 충돌 확인 및 해결 (mvn dependency:tree, gradle dependencies 명령어 사용)
BOM (Bill of Materials) 사용:
Spring Boot Dependency Management Plugin 사용
3. 애플리케이션 설정
프로퍼티 설정
application.properties 또는 application.yml 파일 설정
환경별 설정 파일 분리 (예: application-dev.yml, application-prod.yml)
기본 설정:
server.port=8080
데이터베이스 설정: spring.datasource.url, spring.datasource.username, spring.datasource.password
JPA 설정: spring.jpa.hibernate.ddl-auto=update, spring.jpa.show-sql=true
로깅 설정
로깅 레벨 설정:
logging.level.root=INFO
logging.level.com.example.myapp=DEBUG
로그 파일 경로 및 롤링 정책 설정:
logging.file.name=logs/myapp.log
logging.file.max-size=10MB
logging.file.max-history=30
커스텀 설정
커스텀 설정 속성 정의 (@ConfigurationProperties 사용)
예: myapp.custom.property=exampleValue
4. 데이터베이스 설정
데이터베이스 설정
데이터베이스 선택: MySQL, PostgreSQL, H2, MongoDB 등
스키마 및 초기 데이터 로드 설정 (schema.sql, data.sql)
JPA 설정
JPA 엔티티 클래스 작성:
@Entity, @Table 애노테이션 사용
기본적인 속성 정의 (@Id, @GeneratedValue, @Column)
JPA 리포지토리 인터페이스 작성:
JpaRepository, CrudRepository 상속
커스텀 쿼리 메소드 작성 (@Query, @Modifying)
데이터베이스 마이그레이션 도구 설정
Flyway:
flyway.locations=classpath:db/migration
마이그레이션 파일 작성 (V1__initial_setup.sql, V2__add_new_column.sql)
Liquibase:
liquibase.change-log=classpath:db/changelog/db.changelog-master.xml
XML, YAML 또는 JSON 형식의 변경 로그 작성
5. 보안 설정
Spring Security 설정
기본 보안 설정:
formLogin().loginPage("/login").permitAll()
httpBasic()
csrf().disable() (필요 시)
사용자 인증 및 권한 부여 설정:
@EnableWebSecurity
@Configuration
사용자 서비스 작성 (UserDetailsService 구현)
OAuth2 및 JWT 설정
OAuth2 클라이언트 설정:
spring.security.oauth2.client.registration
spring.security.oauth2.client.provider
JWT 토큰 발급 및 검증 설정:
JWT 라이브러리 사용 (예: jjwt)
JWT 필터 작성 및 설정 (OncePerRequestFilter 상속)
6. API 설계 및 구현
RESTful API 설계
API 엔드포인트 설계 및 문서화:
Swagger 설정 (springfox-swagger2, springfox-swagger-ui 의존성 추가)
Swagger 설정 클래스 작성 (@Configuration, @EnableSwagger2)
HTTP 메서드 및 상태 코드 설계:
GET, POST, PUT, DELETE 메서드 사용
적절한 HTTP 상태 코드 반환 (ResponseEntity 사용)
Controller 작성
기본적인 CRUD 기능 구현:
@RestController
@RequestMapping
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping
요청 매핑 및 응답 처리:
DTO 클래스 작성 및 사용 (@RequestBody, @ResponseBody)
페이징 및 정렬 처리 (Pageable, Sort)
7. 예외 처리
글로벌 예외 처리
@ControllerAdvice와 @ExceptionHandler를 사용한 글로벌 예외 처리
커스텀 예외 클래스 작성 및 처리:
CustomException extends RuntimeException
@ResponseStatus 애노테이션 사용
유효성 검증
Spring Validation을 사용한 입력값 검증:
@Valid, @Validated 애노테이션 사용
@NotNull, @Size, @Pattern 등의 유효성 검증 애노테이션 사용
유효성 검증 실패 시 예외 처리
MethodArgumentNotValidException 처리
BindingResult 사용
8. 테스트
단위 테스트
JUnit과 Mockito를 사용한 단위 테스트 작성:
@RunWith(SpringRunner.class)
@SpringBootTest
@MockBean 및 @InjectMocks 사용
각 계층별 테스트:
Controller 테스트: MockMvc 사용
Service 테스트: Mockito 사용
Repository 테스트: 테스트 데이터베이스 설정
통합 테스트
Spring Boot Test를 사용한 통합 테스트 작성:
@SpringBootTest
@Transactional
테스트 데이터베이스 설정:
H2 인메모리 데이터베이스 사용
@DataJpaTest
9. 배포 및 모니터링
배포 설정
배포 환경에 맞는 프로파일 설정 (application-dev.yml, application-prod.yml)
Docker 설정 및 Dockerfile 작성:
FROM openjdk:11-jre-slim
COPY target/myapp.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
CI/CD 설정:
GitHub Actions, Jenkins, GitLab CI 등
모니터링 및 로깅
Actuator를 사용한 애플리케이션 모니터링:
management.endpoints.web.exposure.include=*
기본 엔드포인트 활성화 (/actuator/health, /actuator/info 등)
Prometheus, Grafana 등을 사용한 모니터링 설정:
Prometheus 스크레이프 설정
Grafana 대시보드 설정
성능 최적화
애플리케이션 성능 모니터링 및 튜닝:
JMH를 사용한 성능 테스트
JProfiler, VisualVM 등을 사용한 프로파일링
쿼리 최적화 및 캐싱 설정:
Spring Cache 사용 (@EnableCaching, @Cacheable, @CacheEvict)
Hibernate 2차 캐시 설정 (ehcache, hazelcast 등)
10. Spring Batch 설정
Spring Batch 기본 설정
의존성 추가: spring-boot-starter-batch
기본 설정:
spring.batch.job.enabled=false
spring.batch.initialize-schema=always
Job 설정:
@Configuration 클래스 작성
JobBuilderFactory, StepBuilderFactory 빈 주입
Job, Step 생성 및 구성
배치 처리
ItemReader, ItemProcessor, ItemWriter 구현
청크 기반 처리 구성 (.chunk(10))
배치 작업 스케줄링 (Spring Scheduler 사용)
11. Spring STOMP 설정
WebSocket 설정
의존성 추가: spring-boot-starter-websocket
WebSocket 설정 클래스 작성:
@EnableWebSocketMessageBroker
StompEndpointRegistry 설정 (/ws 엔드포인트 등록)
메시지 브로커 설정:
setApplicationDestinationPrefixes, enableSimpleBroker 사용
메시지 핸들링
메시지 매핑 및 처리:
@MessageMapping("/topic")
메시지 핸들러 메소드 작성
12. Redis 설정
Redis 기본 설정
의존성 추가: spring-boot-starter-data-redis
Redis 설정:
spring.redis.host=localhost
spring.redis.port=6379
Redis 템플릿 구성
RedisTemplate 빈 구성
Redis 리포지토리 작성 (@Repository)
Redis 캐싱
Spring Cache 사용 (@EnableCaching)
@Cacheable, @CachePut, @CacheEvict 애노테이션 사용
13. Kafka 설정
Kafka 기본 설정
의존성 추가: spring-kafka
Kafka 설정:
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=myGroup
Kafka 프로듀서/컨슈머 구성
KafkaTemplate 구성
메시지 프로듀서 작성:
KafkaTemplate<String, String> kafkaTemplate
메시지 전송 메소드 작성 (send(topic, message))
메시지 컨슈머 작성:
@KafkaListener(topics = "myTopic", groupId = "myGroup")
메시지 핸들러 메소드 작성
14. 트랜잭션 관리
트랜잭션 설정
@Transactional 애노테이션 사용
트랜잭션 전파 및 격리 수준 설정:
propagation = Propagation.REQUIRED
isolation = Isolation.SERIALIZABLE
트랜잭션 롤백 설정
특정 예외 발생 시 롤백 설정:
@Transactional(rollbackFor = Exception.class)
@Transactional(noRollbackFor = CustomException.class)
15. 서블릿 설정
서블릿 구성
서블릿 등록:
@ServletComponentScan
커스텀 서블릿 클래스 작성 (@WebServlet)
필터 및 리스너 등록 (@WebFilter, @WebListener)
서블릿 필터 구성
필터 클래스 작성:
@WebFilter(urlPatterns = "/*")
doFilter 메소드 구현
필터 체인 구성:
FilterRegistrationBean 사용
16. 현업에서 유용한 라이브러리 및 기술
Lombok
의존성 추가: lombok
Lombok 애노테이션 사용:
@Getter, @Setter, @ToString, @EqualsAndHashCode
@Data, @Builder, @Slf4j
Jackson (JSON 처리)
의존성 추가: spring-boot-starter-json
ObjectMapper 구성:
커스텀 직렬화/역직렬화 설정 (@JsonSerialize, @JsonDeserialize)
JSON 필드 이름 설정:
@JsonProperty
MapStruct (객체 매핑)
의존성 추가: mapstruct
매퍼 인터페이스 작성:
@Mapper
@Mapping, @Mappings 애노테이션 사용
매퍼 구현체 생성 (@Mapper(componentModel = "spring"))
Feign (HTTP 클라이언트)
의존성 추가: spring-cloud-starter-openfeign
Feign 클라이언트 인터페이스 작성:
@FeignClient(name = "myClient", url = "http://localhost:8080")
HTTP 메소드 매핑 (@GetMapping, @PostMapping 등)
ModelMapper (객체 변환)
의존성 추가: modelmapper
ModelMapper 빈 구성:
@Bean 메소드 작성 (new ModelMapper())
객체 변환:
modelMapper.map(source, Destination.class)
JUnit 5 (테스트)
의존성 추가: junit-jupiter
테스트 클래스 작성:
@ExtendWith(SpringExtension.class)
@Test 메소드 작성
Mockito (테스트)
의존성 추가: mockito-core
목 객체 생성 및 사용:
@Mock, @InjectMocks 애노테이션 사용
Mockito.when, Mockito.verify 메소드 사용
REST Assured (API 테스트)
의존성 추가: rest-assured
API 테스트 작성:
given(), when(), then() 메소드 사용
Last updated