9/30/2018

스프링 쇼핑몰 만들기 #2. 테이블과 패키지, VO 생성

스프링 쇼핑몰 만들기

이번에는 기본적으로 필요한 테이블과, 그 테이블의 VO(Value Object)를 생성하겠습니다.

기본적인 테이블은 회원 테이블과 상품 테이블, 이렇게 2가지가 되겠습니다. 나중에 카트(담아두기), 구입, 상품 소감, 게시판등 다른 테이블도 추가해야하지만 지금 당장 사용하지 않으니 그때 작업하면 됩니다.

먼저 회원 테이블입니다.

create table tbl_member (
    userId      varchar2(50)    not null,
    userPass    varchar2(100)   not null,
    userName    varchar2(30)    not null,
    userPhon    varchar2(20)    not null,
    userAddr1   varchar2(20)    null,
    userAddr2   varchar2(50)    null,
    userAddr3   varchar2(50)    null,
    regiDate    date            default sysdate,
    verify      number          default 0,
    primary key(userId)
);

아이디와 비밀번호, 닉네임, 연락처, 주소, 가입날짜, 인증 여부로 구성되어있습니다. 주소는 우편번호와 주소, 상세주소 3가지로 나뉘어 저장할 예정이기 때문에 3개로 나누어놨습니다. 제약조건은 null만을 이용하여 회원가입시 주소를 입력하지 않아도 되도록 했습니다.

회원가입시 메일 인증할 할 예정이기 때문에 인증여부 컬럼이 존재하며, 기본값으로 0이면 인증이 안된 상태며, 0이 아니라면 인증이 된 상태로 구분합니다.

다음은 상품 테이블입니다.

create table tbl_goods (
    gdsNum       number          not null,
    gdsName      varchar2(50)    not null,
    cateCode     varchar2(30)    not null,
    gdsPrice     number          not null,
    gdsStock     number          null,
    gdsDes       varchar(500)    null,
    gdsImg       varchar(200)    null,
    gdsDate      date            default sysdate,
    primary key(gdsNum)  
);

상품 번호, 상품 이름, 분류, 가격, 수량, 설명, 이미지, 등록 날짜로 구성되어있습니다. 수량과 설명, 이미지는 입력하지 않더라도 등록될 수 있도록 제약 조건을 null로 했습니다.

분류는 1차적으로만 분류할 수 있지만, 필요에 따라 2차 또는 그 이상으로 분류할 수 있습니다.

예를 들어서, 아래와 같은식입니다.

# 커피
- 아메리카노
- 카페라떼
# 간식
- 쿠키 - 초코 쿠키
- 빵 - 프레즐, 미니 모카

이런식으로 분류할 수 있겠습니다.

저는 2차까지 분류할 예정이기 때문에 분류용 테이블을 하나 더 만들겠습니다.

create table goods_category (
    cateName     varchar2(20)    not null,
    cateCode     varchar2(30)    not null,
    cateCodeRef  varchar2(30)    null,
    primary key(cateCode),
    foreign key(cateCodeRef) references goods_category(cateCode)
);

카테고리 테이블은 카테고리 이름, 카테고리 코드, 카테고리 참조 코드로 구성되어있습니다.

이 테이블에서는, 테이블 내부에서 참조(foreign)가 발생하므로 테이블 생성과 동시에 참조키가 생성되었습니다.

카테고리 이름은 말그대로 이름, 실제로 표시되는 이름입니다.
카테고리 코드는 개발자가 개발자 나름의 규칙에 의거하여 부여하는 코드입니다.
카테고리 참조 코드는 상위 카테고리가 무엇인지 가르키는 코드입니다.

이름 코드 참조 코드
커피 100 null
아메리카노 101 100
카페라떼 102 100
에이드 200 null

참조 코드가 없는(null) 카테고리는 무엇도 참조하지 않는 최상위 카테고리입니다. 아메리카노는 101이라는 자신만의 코드를 가지고 있으며, 참조 코드로 100을 가지고 있습니다. 코드가 100인것은 커피이므로, 아메리카노는 커피의 하위 카테고리임을 알 수 있습니다.

카테고리 테이블에서는 같은 테이블에서 참조가 발생하지만, 상품 테이블와 카테고리 테이블은 다른 테이블이기 때문에 별도로 쿼리를 작성해야합니다.

alter table tbl_goods add
    constraint fk_goods_category
    foreign key (cateCode)
        references goods_category(cateCode);

쿼리가 조금 복잡한데, 알아보기 쉽게 쓰면

alter table [ 테이블 이름 ] add
    constraint [ 제약조건 이름 ]
    foreign key ([ 참조할 컬럼 이름 ])
        references [ 참조되는 테이블 이름 ]([ 참조되는 컬럼 이름 ]);

설명이 늦었는데 '참조'라는것은, 참조되는 테이블의 컬럼에 있는 값이 참조하는 테이블의 컬럼에도 있어야만 한다는것 입니다. 만약 참조되는 테이블과 참조하는 테이블의 값이 다르다면 에러가 발생하게됩니다.

상품 테이블의 상품 번호의 자동 입력을 위한 시퀀스를 생성합니다.

src/main/java에 3개의 패키지를 추가합니다.

com.kubg.domain은 VO(Value Object) 패키지. 주로 사용하는 데이터 타입을 저장합니다.
com.kubg.persistence는 DAO(Data Access Object) 패키지. 데이터 베이스와 접속하는 역할입니다.
com.kubg.serevice는 Service 패키지. DAO와 Controller 사이를 연결해주는 역할입니다.

tbl_member 테이블을 기반으로 MemberVO를 생성합니다.

tbl_goods 테이블을 기반으로 GoodsVO를 생성합니다.

root-context.xml에 패키지를 추가하여, 스프링이 패키지를 사용할 수 있도록 합니다.

게시물 수정
  1. goods _ category 의 vo는 필요없는건가요?

    답글삭제
    답글
    1. 안녕하세요?

      goods_category는 당장 필요하지 않아서, 이 게시물에선 테이블만 만들어두고 나중에 VO를 생성합니다.

      삭제
  2. 작성자가 댓글을 삭제했습니다.

    답글삭제
  3. insert into MEMBER_TB(MB_ID, MB_NAME, MB_PASSWORD, MB_PHONE)
    values('아이디','이름','비밀번호','전화번호');
    이 쿼리 테스트 작업을 할때
    명령의 29 행에서 시작하는 중 오류 발생 -
    insert into MEMBER_TB(MB_ID,MB_NAME,MB_PASSWORD,MB_PHONE)
    values('아이디','이름','비밀번호','전화번호')
    오류 보고 -
    ORA-01400: NULL을 ("SPRING"."MEMBER_TB"."MB_ZIPCODE") 안에 삽입할 수 없습니다
    이렇게 null을 사용할수없다고 오류가 뜨는데 뭔가요 ㅠㅠ

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      해당 에러내용을보니, MEMBER_TB 테이블에 다른 컬럼(MB_ZIPCODE)이 있으며, 그 컬럼이 NULL 허용이 아닌것 같습니다.

      해당 컬럼을 NULL 허용으로 바꿔주시거나, 필요하지 않은 컬럼이라면 삭제해주시면 될 것 같습니다.

      삭제
  4. 작성자가 댓글을 삭제했습니다.

    답글삭제
  5. 작성자가 댓글을 삭제했습니다.

    답글삭제
  6. create table tbl_member(
    userId varchar(50) not null,
    userPass varchar(100) not null,
    userName varchar(30) not null,
    userPhone varchar(20) not null,
    userAddr1 varchar(20) not null,
    userAddr2 varchar(50) not null,
    userAddr3 varchar(50) not null,
    regiDate datetime default NOW(),
    verify int default 0,
    primary key(userId)
    );

    전 mysql에서 오류나길래 이렇게 했어요

    답글삭제