웹 개발

DB 이관

_KH_ 2025. 4. 19. 22:02

중간 프로젝트 때는 MYSQL을 이용했지만 이번에는 ORACLE을 이용하려고 한다.

그러기 위해서는 DBMS 이관이 필요하다.

 

MYSQL → ORACLE

 

테이블 생성문을 수정하면서 가장 크게 고려한 점은 DBMS 간 호환성 및 이식성 !!

DBMS를 저렴한 쪽으로 이관하는 경우가 많기 때문에 최대한 변경사항 없이 옮길 수 있도록 작성하는 것이 좋다.

 

그래서 최대한 SQL 표준 함수를 사용하고 ORACLE이나 MYSQL에서만 사용하는 AUTO_INCREMENT, NOW 등은 사용하지 않으려고 했다.


1. VARHCAR2 대신 VARCHAR 사용 (이식성호환성 고려)

오라클에서는 VARCHAR2를 사용하도록 권장하고 있는 것 같지만 다른 DBMS에는 없어서 호환성이 좋지 않음.

그래서 VARCHAR 사용

 

2. 관리자 여부, 탈퇴 여부 NUMBER(1) 사용

Boolean 자료형이 오라클에는 없기 때문에 NUMBER(1)을 사용해 숫자 1자리만 저장하게 한 후 0, 1로 여부를 저장할 예정이다.

 

3. 자료형 LONG대신 NUMBER

NUMBER(19) == LONG == BIGINT ?

원래 LONG을 사용하고 있었는데 MySQL에서는 BIGINT에 해당한다고 한다.

근데 오라클에는 BIGINT가 없기 때문에 LONG과 자릿수가 동일한 NUMBER(19)를 사용하기로 결정했다.

 

4. Sequence 사용 

전에는 IFNULL(MAX)+1을 통해서 수동 증가시켰는데 이번에는 시퀀스를 사용하려고 한다.

왜냐하면 원래처럼 구현하면 동시성 제어가 안되기 때문이다.

찾아보니 뭘 따로 파서.. 제어하면 된다는데.. 넘 복잡해지니까 시퀀스 사용하기로

 

5. DATE 저장 시 NOW 사용 X

오라클에는 NOW가 없어서 변경했다


[ 변경 전 MySQL ]

-- 1. MEMBER 테이블
CREATE TABLE MEMBER (
    MEMBER_NUMBER BIGINT PRIMARY KEY,
    MEMBER_ID VARCHAR(15) NOT NULL,
    MEMBER_PASSWORD VARCHAR(15) NOT NULL,
    MEMBER_NAME VARCHAR(15) NOT NULL,
    MEMBER_BIRTH DATE NOT NULL,
    MEMBER_PHONE_NUMBER VARCHAR(20) NOT NULL,
    MEMBER_ADDRESS_MAIN VARCHAR(200),
    MEMBER_ADDRESS_DETAIL VARCHAR(100),
    MEMBER_EMAIL_ID VARCHAR(15) NOT NULL,
    MEMBER_EMAIL_DOMAIN VARCHAR(15) NOT NULL,
    MEMBER_REGISTER_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    MEMBER_IS_ADMIN TINYINT DEFAULT 1,
    MEMBER_IS_WITHDRAW TINYINT DEFAULT 1
);

-- 2. PRODUCT_SINGLE 테이블
CREATE TABLE PRODUCT_SINGLE(
PRODUCT_SINGLE_NUMBER BIGINT PRIMARY KEY,
PRODUCT_SINGLE_NAME VARCHAR(20) NOT NULL,
PRODUCT_SINGLE_PRICE INT NOT NULL,
PRODUCT_SINGLE_STOCK INT NOT NULL,
PRODUCT_SINGLE_IMAGE VARCHAR(300) NOT NULL,
PRODUCT_SINGLE_STORE VARCHAR(20) NOT NULL,
PRODUCT_SINGLE_CATEGORY VARCHAR(20) NOT NULL,
PRODUCT_SINGLE_INFORMATION VARCHAR(100)
);


-- 3. PRODUCT_COMBO 테이블
CREATE TABLE PRODUCT_COMBO(
PRODUCT_COMBO_NUMBER BIGINT PRIMARY KEY,
PRODUCT_COMBO_NAME VARCHAR(20) NOT NULL,
PRODUCT_COMBO_IMAGE VARCHAR(300),
PRODUCT_COMBO_STORE INT,
PRODUCT_COMBO_CATEGORY VARCHAR(20),
PRODUCT_COMBO_INFORMATION VARCHAR(200) NOT NULL,
);

-- 4. PRODUCT_COMBO_COMPONENT 테이블
CREATE TABLE PRODUCT_COMBO_COMPONENT(
PRODUCT_COMBO_COMPONENT_NUMBER BIGINT PRIMARY KEY,
PRODUCT_COMBO_COMPONENT_ONE BIGINT NOT NULL,
PRODUCT_COMBO_COMPONENT_TWO BIGINT NOT NULL,
PRODUCT_COMBO_COMPONENT_THREE BIGINT,
PRODUCT_COMBO_NUMBER BIGINT,
PRODUCT_SINGLE_NUMBER BIGINT
);

-- 5. REVIEW 테이블
 CREATE TABLE REVIEW(
REVIEW_NUMBER BIGINT PRIMARY KEY,
REVIEW_SCORE INT NOT NULL,
REVIEW_REGISTER_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
REVIEW_CONTENT VARCHAR(200),
MEMBER_NUMBER BIGINT NOT NULL,
PRODUCT_COMBO_NUMBER BIGINT 
);

-- 6. BOARD_COMBO 테이블
CREATE TABLE BOARD_COMBO(
BOARD_COMBO_NUMBER BIGINT PRIMARY KEY,
BOARD_COMBO_TITLE VARCHAR(100) NOT NULL,
BOARD_COMBO_CONTENT TEXT,
BOARD_COMBO_REGISTER_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
BOARD_COMBO_VIEW_COUNT BIGINT DEFAULT 0,
MEMBER_NUMBER BIGINT
);

-- 7. BOARD_COMBO_LIKED 테이블
CREATE TABLE BOARD_COMBO_LIKED(
BOARD_COMBO_LIKED_NUMBER BIGINT PRIMARY KEY,
MEMBER_NUMBER BIGINT NOT NULL,
BOARD_COMBO_NUMBER BIGINT NOT NULL
);

-- 8. PURCHASE 테이블
CREATE TABLE PURCHASE(
PURCHASE_NUMBER BIGINT PRIMARY KEY,
PURCHASE_TERMINAL_ID VARCHAR(20) NOT NULL,
PURCHASE_TOTAL_PRICE BIGINT NOT NULL,
MEMBER_NUMBER BIGINT
);

-- 9. PURCHASE_DETAIL 테이블 
CREATE TABLE PURCHASE_DETAIL(
PURCHASE_DETAIL_NUMBER BIGINT PRIMARY KEY,
PURCHASE_PRODUCT_COUNT BIGINT NOT NULL,
PRODUCT_SINGLE_NUMBER BIGINT,
PRODUCT_COMBO_NUMBER BIGINT,
PURCHASE_NUMBER BIGINT
);

[ 변경 후 Oracle ]

-- 1. MEMBER 테이블
CREATE TABLE MEMBER (
    MEMBER_NUMBER NUMBER(19) PRIMARY KEY,
    MEMBER_ID VARCHAR(15) NOT NULL,
    MEMBER_PASSWORD VARCHAR(15) NOT NULL,
    MEMBER_NAME VARCHAR(15) NOT NULL,
    MEMBER_BIRTH DATE NOT NULL,
    MEMBER_PHONE_NUMBER VARCHAR(20) NOT NULL,
    MEMBER_ADDRESS_MAIN VARCHAR(200),
    MEMBER_ADDRESS_DETAIL VARCHAR(100),
    MEMBER_EMAIL_ID VARCHAR(15) NOT NULL,
    MEMBER_EMAIL_DOMAIN VARCHAR(15) NOT NULL,
    MEMBER_REGISTER_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    MEMBER_IS_ADMIN NUMBER(1) DEFAULT 1,
    MEMBER_IS_WITHDRAW NUMBER(1) DEFAULT 1
);

-- 2. PRODUCT_SINGLE 테이블
CREATE TABLE PRODUCT_SINGLE(
    PRODUCT_SINGLE_NUMBER NUMBER(19) PRIMARY KEY,
    PRODUCT_SINGLE_NAME VARCHAR(20) NOT NULL,
    PRODUCT_SINGLE_PRICE NUMBER NOT NULL,
    PRODUCT_SINGLE_STOCK NUMBER NOT NULL,
    PRODUCT_SINGLE_IMAGE VARCHAR(300) NOT NULL,
    PRODUCT_SINGLE_STORE VARCHAR(20) NOT NULL,
    PRODUCT_SINGLE_CATEGORY VARCHAR(20) NOT NULL,
    PRODUCT_SINGLE_INFORMATION VARCHAR(100)
);

-- 3. PRODUCT_COMBO 테이블
CREATE TABLE PRODUCT_COMBO(
    PRODUCT_COMBO_NUMBER NUMBER(19) PRIMARY KEY,
    PRODUCT_COMBO_NAME VARCHAR(20) NOT NULL,
    PRODUCT_COMBO_IMAGE VARCHAR(300),
    PRODUCT_COMBO_STORE NUMBER,
    PRODUCT_COMBO_CATEGORY VARCHAR(20),
    PRODUCT_COMBO_INFORMATION VARCHAR(200) NOT NULL
);

-- 4. PRODUCT_COMBO_COMPONENT 테이블
CREATE TABLE PRODUCT_COMBO_COMPONENT(
    PRODUCT_COMBO_COMPONENT_NUMBER NUMBER(19) PRIMARY KEY,
    PRODUCT_COMBO_COMPONENT_ONE NUMBER(19) NOT NULL,
    PRODUCT_COMBO_COMPONENT_TWO NUMBER(19) NOT NULL,
    PRODUCT_COMBO_COMPONENT_THREE NUMBER(19),
    PRODUCT_COMBO_NUMBER NUMBER(19),
    PRODUCT_SINGLE_NUMBER NUMBER(19)
);

-- 5. REVIEW 테이블
CREATE TABLE REVIEW(
    REVIEW_NUMBER NUMBER(19) PRIMARY KEY,
    REVIEW_SCORE NUMBER NOT NULL,
    REVIEW_REGISTER_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    REVIEW_CONTENT VARCHAR(200),
    MEMBER_NUMBER NUMBER(19) NOT NULL,
    PRODUCT_COMBO_NUMBER NUMBER(19)
);

-- 6. BOARD_COMBO 테이블
CREATE TABLE BOARD_COMBO(
    BOARD_COMBO_NUMBER NUMBER(19) PRIMARY KEY,
    BOARD_COMBO_TITLE VARCHAR(100) NOT NULL,
    BOARD_COMBO_CONTENT CLOB,
    BOARD_COMBO_REGISTER_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    BOARD_COMBO_VIEW_COUNT NUMBER(19) DEFAULT 0,
    MEMBER_NUMBER NUMBER(19)
);

-- 7. BOARD_COMBO_LIKED 테이블
CREATE TABLE BOARD_COMBO_LIKED(
    BOARD_COMBO_LIKED_NUMBER NUMBER(19) PRIMARY KEY,
    MEMBER_NUMBER NUMBER(19) NOT NULL,
    BOARD_COMBO_NUMBER NUMBER(19) NOT NULL
);

-- 8. PURCHASE 테이블
CREATE TABLE PURCHASE(
    PURCHASE_NUMBER NUMBER(19) PRIMARY KEY,
    PURCHASE_TERMINAL_ID VARCHAR(20) NOT NULL,
    PURCHASE_TOTAL_PRICE NUMBER(19) NOT NULL,
    MEMBER_NUMBER NUMBER(19)
);

-- 9. PURCHASE_DETAIL 테이블 
CREATE TABLE PURCHASE_DETAIL(
    PURCHASE_DETAIL_NUMBER NUMBER(19) PRIMARY KEY,
    PURCHASE_PRODUCT_COUNT NUMBER(19) NOT NULL,
    PRODUCT_SINGLE_NUMBER NUMBER(19),
    PRODUCT_COMBO_NUMBER NUMBER(19),
    PURCHASE_NUMBER NUMBER(19)
);

 

'웹 개발' 카테고리의 다른 글

JSP/Servlet → Spring Boot 이관 중 배운 점  (0) 2025.04.21
web.xml, applicationContext.xml  (0) 2025.04.20
[Spring] 2일차  (1) 2025.04.18
[Spring] 1일차  (0) 2025.04.16
싱글톤 패턴이란?  (0) 2025.04.15