다음은 개발자와 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-compose및user_data.sh와 연동하여 배포 시 데이터가 자동으로 세팅되도록 구축함. - API 통합 및 매핑: 프론트엔드와 백엔드 간의 응답 구조 불일치(
ApiResponse래퍼 처리) 및 필드명 차이(product.namevsproductName)를 해결하기 위한 매핑 로직을 API 계층에 추가하여 통신을 완성함.
🔴 삽질/시간 소모 포인트
- JPA 생명주기 및 썸네일 URL 누락:
ProductService에서save()호출 후thumbnailUrl을 세팅하여 DB에 반영되지 않는 문제(엔티티 상태 문제)를 해결하는 데 시간 소요. 로직 순서를 수정하고 EC2에서 직접 패치하여 해결함. - Docker 빌드 및 권한 이슈: EC2
user_data실행 시 Dockerbuildx누락 및gradlew권한 문제로 인해 컨테이너 시작이 반복적으로 실패하여 환경 설정 작업에 지체가 발생함. - 타임존(Timezone) 불일치: DB에 UTC 시간으로 저장되어 프론트엔드에서 KST 기준으로 “종료된 딜”로 표시되는 문제를 해결하기 위해 SQL 오프셋(+9시간) 적용 및 데이터 재주입 작업을 수행함.
- 레포지토리 및 Git 충돌:
timedeal-frontend와timedeal-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.yaml의 ddl-auto를 update로 변경 및 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설정으로 인한 데이터 소실 문제를 겪으며, 개발 환경에서도update나validate를 사용하고 스크립트로 데이터를 관리하는 방식의 필요성을 깨달음.
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