저번에 만든 쇼핑몰 프로젝트 Github를 개선해보려고 합니다.
블로그에 프로젝트 과정을 기록하면서 개선해야 할 점으로 생각해둔 것을 리팩토링하려고 합니다.
구현 기능의 주요 포인트
먼저, 구현기능에서 주요 변경사항은 다음과 같습니다.
- 판매 (SALES) = 판매 관리를 위한 테이블을 추가
- 판매 정보를 조회할 때 상품 정보가 필요하고, 상품에 판매자 정보가 필요하다.
- 장바구니 = 구매한 상품을 담는 공간
- 동일한 상품을 장바구니에 중복으로 담을 수 없으며, 각 상품은 한 번만 담을 수 있다.
- 장바구니에서 상품을 제거하면 해당 주문이 취소된다.
- 상품
- 최소 1개의 상품 이미지를 업로드해야 한다.
- 동일한 상품명과 카테고리로 중복 등록할 수 없다.
- 회원
- 이미 가입된 아이디로는 중복 가입이 불가능하다.
장바구니는 구매한 상품을 담는 공간으로서 역할을 유지하되, 몇 가지 제약 조건을 추가했습니다.
상품 ID당 1번의 구매만 가능하도록 제한했습니다.
회원 관리에서는 중복된 아이디를 검증하는 로직을 추가했습니다.
추가한 사항
- 기본적인 CRUD 구현
- 테스트 코드 작성
- API Docs
- AWS 배포 (EC2 배포, RDS 연동, S3로 상품 이미지 관리)
API 구현에서는 기본적인 CRUD 기능을 구현하고, 이를 바탕으로 API 문서를 작성했습니다.
V1 버전에서는 애플리케이션 개발로 완료했지만, V2 버전에서는 AWS를 활용해 서비스를 배포했습니다.
V1 버전에서 발견된 문제점을 개선한 사항
V1 개발과정을 블로그에서 기록하면서 발견한 문제점을 다음과 같이 개선했습니다.
문제점) 주문상품 조회 시 N+1 문제
- 문제점
- Cart와 OrderItem이 1:N 매핑 관계로 설정되어 있었으며, LAZY 로딩을 사용했습니다.
- 이로 인해 getCartList() 실행 시, 각 Cart의 OrderItem을 조회할 때마다 추가 쿼리가 발생해 N+1 문제가 생겼습니다.
- 해결
- QueryDSL을 사용하여 단일 쿼리를 작성했습니다.
- Cart와 OrderItem 데이터를 조인하여 한 번에 조회하도록 리팩토링했습니다
기술스택
기술 스택에서는 V1 버전과 달라진 사항은 없습니다.
- Backend
- Java 11
- Spring Boot 2.7.1
- Spring Data JPA
- Lombok
- Hibernate
- Spring Web
- validation
- Querydsl
- Gradle
- Frontend
- Bootstrap template
- Thymeleaf
Architecture

AWS에서 EC2, RDS, S3를 사용했습니다.
- AWS EC2 인스턴스 생성
- AWS RDS 데이터베이스 생성
- EC2와 RDS 간 연동
- AWS EC2 서비스에 스프링 부트 프로젝트를 배포 (deploy 배포 스크립트)
- 스프링 부트 프로젝트와 AWS RDS 연동
- S3 연동하여 이미지 업로드
EC2, RDS, S3를 아래와 같이 설정했습니다.
- EC2 : Amazon Linux 2 프리티어 선택
- RDS : MariaDB 프리티어 선택
- 로컬PC에서 RDS 접근 확인 :로컬PC에서 RDS 접근 확인하기 위해 Mysql workbench를 사용한다.
- AWS S3
- 회원이 상품등록할 때 첨부하는 상품이미지를 관리하기 위해 AWS S3를 사용한다.
'프로젝트 > 개인 프로젝트 V2' 카테고리의 다른 글
6) 예외처리와 오류 페이지 만들기 (0) | 2023.06.14 |
---|---|
5) /category/MUSIC와 /category/BOOK 방식의 요청 매핑 개선하기 (1) | 2023.06.13 |
4) Enum 활용 (0) | 2023.06.13 |
2) 도메인 모델과 테이블 설계 (0) | 2023.06.13 |
3) 프로젝트 구조 (0) | 2023.06.13 |
댓글