미니프로젝트 회고개발일지2024. 7. 19. 16:45
Table of Contents
유플러스 - 배달의 민족
지금 듣고 있는 유플러스 수업에서 3일동안 jdbc와 Swing UI를 이용한 미니프로젝트를 진행하게 되었다.
개인마다 주제를 선택할 수 있는데 , 우리 조는 음식 배달 서비스 ERD를 구성했기 때문에 이를 활용하기로 했다.
음식 배달 서비스의 기본적인 기능은 아래와 같다.
이번에는 비즈니스 로직보다는 ERD 구성과 효율적인 쿼리처리에 집중해서 프로젝트를 진행했다.
기능
- 로그인
- 가게 및 메뉴 불러오기
- 메뉴 (옵션) 선택
- 장바구니
- 주문하기 , 주문취소
- 찜하기 , 전화하기
ERD
테이블은 아래와 같이 구성했다.
실제 서비스를 하기에는 많이 부족한 ERD이지만, 깊이 고민하고 프로그래밍까지 하기에는 시간이 부족했다.
지금은 간편하게 만들기 위해 디테일한 기능들을 제외시켰다.
- Users : 사용자 테이블
- Store : 가게 테이블
- Orders : 주문 테이블
- OrderItems : 주문 메뉴 테이블
- MenuCommonCode : 메뉴 관련 필드 공통 코드 (카테고리, 맵기 , 사이즈)
- CommonCodeType : 메뉴 공통 코드 타입 테이블
- Reviews : 리뷰 테이블
- Favorites : 가게 찜하기 테이블
- Coupon : 쿠폰 테이블
- UserCoupon : 사용자 쿠폰 테이블
가장 고민했던 것
메뉴 옵션 테이블
메뉴에는 메뉴별 카테고리, 맵기 , 사이즈 등등의 옵션이 필요하다.
방법 1. 각각의 테이블 만들기 (카테고리 테이블/맵기 테이블 /사이즈 테이블)
- 옵션마다 테이블이 필요하고, 옵션이 추가될때마다 테이블 개수도 늘어날 것 → 비효율적
방법 2. 공통코드 테이블 이용해서 하나의 테이블에서 관리하기
- 공통 코드 테이블이란 , 코드 데이터들을 한데 모아서 관리하는 테이블
- 카테고리,맵기,사이즈 등의 옵션들을 공통 코드 테이블에 모아서 관리
- 옵션의 자유로운 변경 및 추가와 삭제 가능 → 확장성 고려
- CommonCodeType 테이블
- MenuCommonCode 테이블
메뉴 테이블의 옵션 컬럼 ( 맵기,사이즈)
방법 1. 맵기와 사이즈 컬럼을 고정적으로 가진다.
- 옵션이 추가될때마다 메뉴 테이블 / 주문 메뉴 테이블에 컬럼이 추가 되어야 함
방법 2. 옵션 리스트를 Set으로 가지기
- 메뉴마다 어떤 옵션을 가지는지 , 옵션 리스트를 Set으로 구성 → 주문 메뉴 테이블에서 옵션 리스트에 맞는 옵션 값을 또 다시 Set으로 가지는 방법이다.
- 즉 Menu 테이블에는 options SET(<필요한 옵션 codeType ID>) 컬럼을 가지고
- OrderItems 테이블에는 options_value SET(<필요한 옵션 code ID>) 컬럼을 가진다.
- 그러나 이 방법의 문제점은 Set은 ForeignKey 적용이 안된다는 것이다. → 연관관계 불가능
CREATE TABLE `Menu` (
`menu_id` INT NOT NULL AUTO_INCREMENT,
`store_id` INT NOT NULL,
`name` VARCHAR(50) NULL,
`price` decimal(10, 2) default 0,
`category` INT NULL,
`options` SET('SPICE_LEVEL', 'AMOUNT_LEVEL'),
PRIMARY KEY (`menu_id`),
FOREIGN KEY (`store_id`) REFERENCES `Store` (`store_id`),
FOREIGN KEY (`category`) REFERENCES `MenuCommonCode` (`codeId`),
// FOREIGN KEY (`options`) REFERENCES `CommonCodeType` (`codeTypeID`) -> 안됨
);
그래서 방법1. 옵션 컬럼을 고정으로 가지는 방법을 택했다.
더 이상 떠오르는 방법이 없어서 그때는 방법1을 택했지만, 지금 생각해 보니 테이블을 하나 더 만들어서, 메뉴마다 어떤 옵션이 필요한지 목록을 저장하는 방법도 있을 것 같다.
배치 쿼리
- 주문 메뉴 테이블 - 동시에 여러 row를 insert해야한다.
- N개의 로우를 1개씩 N번 insert VS N개 로우를 N개 1번 insert(bulk insert) 둘 중 어떤게 더 빠를지 고민했다.
- 겉으로 보기에는 별 차이가 안날 것 같지만 , row의 개수가 크면 클 수록 bulk insert가 압도적으로 빠르다.
- 질의(SQL) 수행시, 트랜잭션 시작, 종료, Index 처리 등.. 전후로 발생하는 여러 작업이 있음.
- 1개씩 N번의 insert하면 , 위의 전후과정이 N번 발생
- bulk insert를 한다면 , 위의 전후과정을 1번으로 처리
'개발일지' 카테고리의 다른 글
MongoDB Replica Set 구성 (0) | 2024.09.02 |
---|---|
OneToMany (0) | 2024.08.21 |
BastionHost를 이용한 EC2 SSH 접속 (0) | 2024.04.07 |
테스트 H2 DB DATEDIFF 메서드 안됨 (0) | 2024.02.07 |
[개발일지] 접속관련 FCM 메세지 전송 기준 개선 (0) | 2024.01.28 |
@gani+ :: Gani_Dev :)
꾸준히 기록할 수 있는 사람이 되자 !