다음은 개발자와 AI 간의 오늘 하루 대화 로그야. 이 로그를 분석해서 내가 하루 동안 무엇에 집중하고 시간을 썼는지 한눈에 파악할 수 있도록 Obsidian 마크다운 형식으로 요약해줘.

📝 일일 개발 로 요약

1. 작업 분포

카테고리비중
인프라/DevOps (Terraform/AWS/Docker)35%████░░░░░░
백엔드/DB 로직 (동시성/JPA/시드)35%████░░░░░░
프론트엔드 연동/수정20%██░░░░░░░░
디버깅 및 문제 해결10%█░░░░░░░░░

2. 집중 영역 / 시간 소모 포인트

🟢 생산적 작업

  • Terraform 아키텍처 재설계: 복잡한 운영 환경 설정을 제거하고, 테스트에 최적화된 간소화된 아키텍처(EC2 Public Subnet + Docker Compose, S3+CloudFront)로 성공적으로 재구성 및 배포함.
  • Redis 동시성 제어 도입: 타임딜 재고 차감 시 발생하는 동시성 이슈를 해결하기 위해 Redisson을 활용한 분산 락(RedisTimeDealFacade)을 구현하고 이를 검증하는 테스트 코드를 작성함.
  • 데이터 시드 및 자동화 파이프라인: DB 초기화 및 더미 데이터 주입을 자동화하는 쉘 스크립트(seed_initial_data.sh, refresh_timedeals.sh)를 작성하고 docker-composeuser_data.sh와 연동하여 배포 시 데이터가 자동으로 세팅되도록 구축함.
  • API 통합 및 매핑: 프론트엔드와 백엔드 간의 응답 구조 불일치(ApiResponse 래퍼 처리) 및 필드명 차이(product.name vs productName)를 해결하기 위한 매핑 로직을 API 계층에 추가하여 통신을 완성함.

🔴 삽질/시간 소모 포인트

  • JPA 생명주기 및 썸네일 URL 누락: ProductService에서 save() 호출 후 thumbnailUrl을 세팅하여 DB에 반영되지 않는 문제(엔티티 상태 문제)를 해결하는 데 시간 소요. 로직 순서를 수정하고 EC2에서 직접 패치하여 해결함.
  • Docker 빌드 및 권한 이슈: EC2 user_data 실행 시 Docker buildx 누락 및 gradlew 권한 문제로 인해 컨테이너 시작이 반복적으로 실패하여 환경 설정 작업에 지체가 발생함.
  • 타임존(Timezone) 불일치: DB에 UTC 시간으로 저장되어 프론트엔드에서 KST 기준으로 “종료된 딜”로 표시되는 문제를 해결하기 위해 SQL 오프셋(+9시간) 적용 및 데이터 재주입 작업을 수행함.
  • 레포지토리 및 Git 충돌: timedeal-frontendtimedeal-order 레포의 불일치, 그리고 Redis 기능 추가에 따른 브랜치 충돌을 해결하고 병합 전략을 수립하는 데 시간을 사용함.

3. 타임라인

시간화자내용
09:07🐹테라폼 레포 점검 요청. README와 코드 불일치 문제(CloudFront/S3 누락 등) 확인.
09:17🐹프론트엔드 로컬 서버 실행 실패(.env 누락).
10:00⌨️프로젝트 폴더 이동 및 npm start 시도.
10:58🦦프론트/백엔드 통합 문제(CORS, API 미구현, 테라폼) 심각함 보고 및 원인 분석 시작.
11:04🦦SecurityConfig.java에 CORS 설정 추가 및 docker-compose.yml 포트 정리.
11:11🦦Terraform 코드 전면 재설계(S3+CloudFront 추가, DB를 Docker Compose로 이관) 결정.
11:33🦦Terraform apply 완료. 프론트엔드 빌드 및 S3 업로드 완료. EC2 Docker 빌드 중 buildx 버전 문제 발생 및 해결.
11:40🦦프론트엔드 접속 시 ApiResponse 래퍼 구조 불일치로 인한 에러 발생. API 레이어 수정 및 필드명 매핑 로직 추가.
11:47🦦스케줄러 로직 문제로 데이터 시딩 실패. 시작 시간을 동적으로 설정하여 재시도 후 성공.
11:56🦦상세 페이지 500 에러 및 필드명 매핑 오류 수정 후 커밋/푸시.
12:02🦦상태값 불일치(PENDING vs UPCOMING)를 mapDeal 함수에서 정규화하여 수정.
12:31🦦백엔드 DTO(TimeDealDto.Response)에 재고 필드(dealQuantity, remainingQuantity) 누락 확인 후 추가.
12:36🦦JWT 토큰 디코딩 로직 추가 및 주문/배송지 API 연동. 필드명 매핑 처리 완료.
12:53🦦DB 데이터 중복 및 thumbnailUrl NULL 문제 확인. 원인 분석 시작.
12:56🦦EC2 접속 후 ProductService.java 직접 패치. 썸네일 URL 세팅 로직을 save 전으로 이동.
13:00⌨️도커 컨테이너 재빌드 및 DB 리셋.
13:15🦦로직 재수정(Setter 위치 변경) 후 재시드. thumbnailUrl 정상 반영 확인.
13:24🦦신용카드 결제 시 실패(PGSimulator.jsx의 외부 API 호출 문제)를 내부 모킹 로직으로 변경.
13:49🐹EC2 DB에 상품 10개 및 타임딜 데이터 직접 주입.
13:55⌨️백엔드 컨테이너 재시작 및 DB 데이터 초기화.
13:57🦦타임존 문제(UTC vs KST) 해결 위해 SQL에 KST 오프셋 적용 및 상태 수정.
14:06🐹Redis 동시성 제어 구현 요청. Redisson 의존성 추가 및 RedisTimeDealFacade 작성.
14:14🦦배포 시 자동 데이터 주입 스크립트(seed_initial_data.sh) 작성 및 문서화.
14:27🦦Git 충돌 해결 및 브랜치 전략 수립(Redis 기능 별도 브랜치 분리).
17:29🦦RDS 마이그레이션 및 Private VPC 구조 변경을 위한 Terraform 아키텍처 가이드 제공.
17:33🦦application-dev.yamlddl-autoupdate로 변경 및 RDS 연동 준비.
17:45🦦신규 RDS 배포 시 부팅 실패 방지를 위해 Flyway 마이그레이션 도입 제안.

4. 해결한 문제와 인사이트

  • 인프라 단순화의 효율성: 개발/테스트 단계에서는 복잡한 운영 환경(Multi-AZ RDS 등)보다 Docker Compose와 Public EC2 조합이 훨씬 효율적이며 비용 절감에 도움이 됨을 확인함.
  • JPA 엔티티 생명주기 주의사항: repository.save() 이후에 엔티티 필드를 수정해도 DB에 반영되지 않는(Dirty Checking 미작동 등) 문제를 겪으며, 연관된 필드 설정은 영속화 메서드 호출 이전에 완료해야 함을 배움.
  • 동시성 제어의 필수성: 단순 DB 트랜잭션만으로는 타임딜 선착순 이벤트의 재고 초과 판매를 막을 수 없어, Redisson을 활용한 분산 락 구현이 필수적임을 인지함.
  • API 계층의 표준화: 백엔드의 표준 응답 래퍼(ApiResponse)를 프론트엔드에서 일관되게 처리하는 API Client 계층의 중요성을 다시금 확인함.
  • 환경 설정 관리: ddl-auto: create 설정으로 인한 데이터 소실 문제를 겪으며, 개발 환경에서도 updatevalidate를 사용하고 스크립트로 데이터를 관리하는 방식의 필요성을 깨달음.

5. 주요 파일 및 변경사항 (코드 미포함)

  • terraform/main.tf: 기존의 MySQL RDS, ElastiCache 등을 삭제하고, S3 + CloudFront + EC2 구조로 아키텍처를 재작성함.
  • backend/.../SecurityConfig.java: CORS 설정을 환경변수(CORS_ALLOWED_ORIGINS)를 사용하도록 수정하여 유연한 도메인 허용 처리.
  • backend/.../ProductService.java: 썸네일 URL 설정 로직의 위치를 save() 호출 이전으로 이동시켜 JPA 영속성 문제로 인한 데이터 누락을 해결함.
  • backend/.../dto/TimeDealDto.Response: 프론트엔드 전달을 위해 재고 관련 필드(dealQuantity, remainingQuantity)를 추가함.
  • backend/.../RedisTimeDealFacade.java: Redisson 클라이언트를 사용하여 타임딜 재고 차감 시 분산 락을 적용하는 새로운 퍼사드 클래스 생성.
  • frontend/src/api/timedeal.js & order.js: 백엔드 ApiResponse 래퍼에서 데이터를 추출하는 로직과 백엔드 필드명(product.name 등)을 프론트엔드 필드명으로 변환하는 매핑 로직 추가.
  • frontend/src/components/PGSimulator.jsx: 신용카드 결제 시 존재하지 않는 외부 API 호출을 제거하고 내부 타이머 기반의 모킹 로직으로 변경하여 결제 완료 처리 구현.
  • backend/.../application-dev.yaml: DB 스키마 자동 생성 설정을 create에서 update로 변경하여 재시작 시 데이터 유지.
  • seed_initial_data.sh: EC2 구동 시 DB에 연결하여 초기 데이터(카테고리, 상품, 유저)를 자동 주입하는 쉘 스크립트 생성.

Supported by ai-log-sync & GLM-4.7