Skip to content

Conversation

@hyoon1129
Copy link

@hyoon1129 hyoon1129 commented Feb 16, 2025

📍 주요 기능

  • 특정 기업의 주식 종가 조회
  • API Key 인증 및 유효성 검증
  • 예외 상황 대응 및 로깅
  • GitHub Actions, Docker, EC2를 활용한 배포 자동화 (CI/CD)

📍 API 응답 설계

  • 단일 응답 포맷 적용 → ApiResponse<T> 사용.
  • 성공 및 실패 구조 통일
    • 성공 시: success: true, status: 200
    • 실패 시: success: false, status: 4xx/5xx
  • GlobalExceptionHandler에서 HTTP 상태별 일관된 JSON 포맷 반환
  • API_DOCS.md에서 상세 내용 확인할 수 있습니다!

📍 유효성 검사

  • API Key 필수: 누락 시 403 오류
  • 날짜 형식 검증: yyyy-MM-dd 포맷 준수
  • 기간 유효성: startDate <= endDate 조건 검증
  • 회사 코드 존재 여부 확인: 존재하지 않는 companyCode 요청 시 404 반환

📍 테스트 코드 작성

  • 서비스 계층 테스트 : StockServiceTest를 통해 주식 데이터 조회 로직 검증
  • 예외 처리 테스트 : StockExceptionTest로 주요 예외 상황에 대한 응답 코드 및 메시지 확인
  • h2 데이터베이스 활용 : 테스트 환경에서 DB 접근성 및 성능 검증

📍 로그 정책

  • 로깅 설정: logback-spring.xml
  • 파일 크기, 시간 모두 고려해 로그를 관리하기 위해 SizeAndTimeBasedRollingPolicy 정책 설정

📍 배포 전략

  • CI/CD 파이프라인 구축
  • 도구 : GitHub Actions + Docker + EC2
  • 이미지 관리 : GHCR
  • 배포 사진
    image
    image

📍 라이브러리 선택 이유

  • lombok : 반복적이고 복잡한 코드를 간소화하기 위해
  • spring-boot-starter-validation : API 요청 시 날짜 및 필수 파라미터의 유효성을 검증하기 위해
  • mysql-connector-j : MySQL 데이터베이스와 연결하여 주식 데이터를 조회하기 위해
  • h2database : 테스트 환경에서 메모리 데이터베이스를 사용하여 빠르고 독립적인 테스트를 위해
  • junit-platform-launcher : 서비스 로직과 예외 처리 기능을 검증하는 테스트 코드 실행을 위해

📍 애로사항/아쉬운 점

  • Swagger로 API 문서 자동화를 해보고 싶었는데 자꾸 알 수 없는 오류가 나서 시간 관계상 포기.. 했습니다. 다시 공부 후에 적용해 보려 합니다
  • API Throttling, 응답 포맷 옵션 부분도 공부를 더 하고 적용해 보려 합니다..

- Company.java
- StocksHistory.java
- StocksHistoryId.java (복합 키 사용을 위해)
- GlobalExceptionHandler에서 파라미터 누락을 처리
- StockController에서 수동으로 파라미터를 검증하던 로직 제거
- DateTimeParseException : 잘못된 날짜 형식 입력 예외 처리
- CompanyNotFoundException : 존재하지 않는 회사 코드 조회 예외 처리
- startDate가 endDate보다 이전이어야 한다.
- API 키 검증 로직을 validateApiKey() 메서드로 분리
- HTTP 상태 코드 하드코딩 제거
- validateApiKey() 메서드에 null 체크 로직 추가
- InvalidApiKeyException 클래스 작성
- GlobalExceptionHandler에 InvalidApiKeyException 전용 핸들러 추가
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant