프로젝트 체크리스트

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