일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파일 업로드
- 이미지 출력
- 정규표현식
- 스프링 이미지
- 삭제 구현
- 회원가입 기능
- 스프링 프로젝트
- 인증번호 전송
- 스프링 프로젝트 설정
- Bcrypt
- 스프링 메일 전송
- spring 쇼핑몰
- ResponseEntity
- 쇼핑몰 프로젝트
- 쇼핑몰 포트폴리오
- 스프링 프로젝트 기본 설정
- 스프링 HikariCP
- 스프링 포트폴리오
- BCrypt 적용
- 스프링 게시판
- 스프링 쇼핑몰
- 스프링 쇼핑몰 프로젝트
- spring 프로젝트
- 스프링 업로드
- 스프링 파일 삭제
- oracle 설치방법
- 로그인 기능
- arraylist
- 로그아웃 기능 구현
- 스프링 게시판 구현
- Today
- Total
Kim VamPa
[Spring][쇼핑몰 프로젝트][40] 주문 구현 방향 & 주문 테이블 설계 본문
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188
목표
주문 구현 방향 설정 및 테이블 생성
'주문 구현'을 앞서 주문 구현을 어떠한 방향과 방식으로 할 지에 대해 생각해보고자 합니다.
순서
1. 주문 기능 개요
2. 테이블 설계
2.1 관계 설계
2.2 테이블 속성
2.3 테이블 생성 명령어
1. 주문 기능 개요
주문과 관련된 기능은 크게 두 가지를 구현하고자 합니다.
첫 번째, 사용자가 선택한 물품(장바구니 or 바로 구매)을 주문하는 기능
두 번째, 주문을 취소하는 기능
첫 번째 기능의 대략적인 흐름은 다음과 같습니다.
- 장바구니 혹은 물품상세 페이지(바로 구매 버튼)로 물품을 선택하여 '주문 페이지'로 이동을 한다.
- 주문자의 배송 정보(주소, 이름)을 입력하고 사용할 '포인트'를 입력한다.
- 사용자가 주문 버튼을 누르면 상품의 재고, 주문자의 돈, 포인트가 차감되고, 주문 상태가 '배송 준비'로 DB에 반영된다.
- 주문이 정상적으로 완료되었다면 '메인 페이지'로 이동한다.
두 번째 기능인 '주문 취소'의 경우 본래는 회원의 개인 페이지에서 '주문 취소'를 하는 것이 보통의 경우 일 것입니다, 하지만 이럴 경우 회원의 '개인 페이지'와 같이 새로운 것들을 만들어주어야 하기 때문에 단순화를 위해 '관리자'가 '관리자 화면'에서 '주문 현황'을 볼 수 있고, 취소 버튼을 누르면 주문이 취소될 수 있도록 기능을 구현할 것입니다.
본래는 첫 번째 기능만 하고자 했지만, 주문으로 인해 변화된 데이터(재고, 돈, 포인트)를 되돌리는 것도 해 보는 것이 좋겠다고 생각이 들어 두 번째 기능도 추가하였습니다.
그리고 주문 기능에서 세세한 예외처리는 생략하겠습니다. 예를 들어서 DB에 등록된 상품의 수량이 주문한 수량보다 적을 시 예외처리 및 사용자가 이를 알 수 있도록 해주는 처리는 생략하겠습니다. 세세한 모든 예외처리를 하면 너무 글이 길어진다고 생각되기 때문입니다.
본격적인 구현에 앞서서 주문에 관한 데이터를 담을 '주문 테이블'을 먼저 설계하겠습니다.
2. 주문 테이블 설계
2.1 관계 설계
먼저 회원과 주문의 관계를 생각해보겠습니다. 한 명의 회원은 여러 번의 주문을 할 수 있습니다. 하지만 주문의 경우 반드시 한 명의 회원에 속해야 합니다. 따라서 '회원'과 '주문'은 일대다(1:N) 관계입니다.
그다음 회원과 상품에 대해 생각해보겠습니다. (물품을 구매했을 때 영수증 생각해보시면 이해가 쉬울 거 같습니다.) 하나의 주문에는 여러 개의 상품을 가질 수 있습니다. 그리고 하나의 상품은 여러 주문에 속 할 수 있습니다. 따라서 '주문'과 '상품'은 다대다(N:N) 관계입니다.
이 관계를 근거로 테이블을 설계해야 하는데 논리적으로는 "다대다 관계" 존재할 수 있지만 물리적 설계(실제 DB 테이블 설계라고 생각하면 됨)에서는 "다대다 관계"가 존재할 수 없기 때문에 이 관계를 해소해주어야 합니다. 따라서 '주문', '상품'의 "다대다 관계"를 해소해주기 위해서 중간에 '주문_상품' 매핑 테이블을 넣어주어서 "다대다 관계"를 해소시켜 줄 것입니다. (매핑 테이블을 통해서 N:N 관계가 1:N, N:1 관로 바뀌었습니다.)
그림에서의 "주문"은 "vam_order"라는 이름으로 테이블을 생성할 것이고, 관계 해소 테이블(or 매핑 테이블)은 "vam_orderItem" 이름으로 테이블을 생성할 것입니다.
※ 주문에서 좀 더 세부적으로 개체를 나눈다면 배송정보(주소, 받는 사람 이름)만 따로 관리하는"배송"개체를 따로 둘 수 있습니다. "배송"과 "주문"의 관계는 1:1 관계입니다.
2.2 테이블 속성
"vam_order", "vam_itemOrd"에 넣을 속성들을 살펴보겠습니다.
먼저 "vam_order"입니다.
orderId
- vam_order 테이블의 기본키입니다. 기본키 자동생성 기능을 사용하지 않고 직접 작성하여 입력해 줄 것입니다.
addressee
- 배송을 받는 사람 이름입니다.
memberId
- 주문하는 사람의 아이디입니다.
memberAddr1~3
- 주문한 사람이 배송받을 주소입니다.
orderState
- 주문 상태입니다.
- '배송 준비', '배송 취소'(, '배송 중', '배송 완료) 값이 들어갈 것입니다.
- 우리가 구현 할 두 기능에서 주문을 하게 되면 '배송준비' 상태가 되고, 주문 취소를 하면 '배송취소'상태가 됩니다.
deliverCost
- 배송비입니다.
usePoint
- 주문 시 회원이 사용한 포인트입니다.
orderDate
- 주문한 날짜입니다.
"vam_orderItem"입니다.
orderItemId
- vam_orderItem 테이블의 기본키입니다.
- DB에서 생성해주는 기본키 기능을 사용할 것입니다.
orderId
- vma_order의 기본키 값이 들어가는 외래 키입니다.
bookId
- vam_book의 기본키 값이 들어가는 외래 키입니다.
bookCount
- 주문한 상품의 수량입니다.
bookPrice
- 주문한 상품 한 개의 가격입니다. (할인 적용 X)
bookDiscount
- 주문한 상품의 할인율입니다.
2.3 테이블 생성 명령어
아래의 명령어를 실행하여 "vam_order", "vam_orderItem" 테이블을 생성하였습니다.
Oracle
create table vam_order(
orderId varchar2(50) primary key,
addressee varchar2(50) not null,
memberId varchar2(50),
memberAddr1 varchar2(100) not null,
memberAddr2 varchar2(100) not null,
memberAddr3 varchar2(100) not null,
orderState varchar2(30) not null,
deliveryCost number not null,
usePoint number not null,
orderDate date default sysdate,
FOREIGN KEY (memberId)REFERENCES book_member(memberId)
);
create table vam_orderItem(
orderItemId number generated always as IDENTITY primary key,
orderId varchar2(50),
bookId number,
bookCount number not null,
bookPrice number not null,
bookDiscount number not null,
savePoint number not null,
FOREIGN KEY (orderId) REFERENCES vam_order(orderId),
FOREIGN KEY (bookId) REFERENCES vam_book(bookId)
);
MySQL
create table vam_order(
orderId varchar(50) primary key,
addressee varchar(50) not null,
memberId varchar(50),
memberAddr1 varchar(100) not null,
memberAddr2 varchar(100) not null,
memberAddr3 varchar(100) not null,
orderState varchar(30) not null,
deliveryCost int not null,
usePoint int not null,
orderDate timestamp default now(),
FOREIGN KEY (memberId)REFERENCES book_member(memberId)
);
create table vam_orderItem(
orderItemId int auto_increment primary key,
orderId varchar(50),
bookId int,
bookCount int not null,
bookPrice int not null,
bookDiscount int not null,
savePoint int not null,
FOREIGN KEY (orderId) REFERENCES vam_order(orderId),
FOREIGN KEY (bookId) REFERENCES vam_book(bookId)
);
REFERENCE
DATE
- 2020.12.07
'스프링 프레임워크 > 쇼핑몰 프로젝트' 카테고리의 다른 글
[Spring][쇼핑몰 프로젝트][41] 주문 구현(주문 페이지) - 2 (0) | 2021.12.09 |
---|---|
[Spring][쇼핑몰 프로젝트][41] 주문 구현(주문 페이지) - 1 (0) | 2021.12.08 |
[Spring][쇼핑몰 프로젝트][39] 장바구니 기능(장바구니 삭제) (6) | 2021.12.01 |
[Spring][쇼핑몰 프로젝트][38] 장바구니 기능(수량 수정) (3) | 2021.11.30 |
[Spring][쇼핑몰 프로젝트][37] 장바구니 기능(장바구니 페이지) -4 (0) | 2021.11.29 |