본문 바로가기
05_Server (04. JSP 프로그래밍 구현)

DB설계 및 구축 (+ 엑셀로 DB에 한번에 넣기)

by moca7 2024. 9. 2.

 

 

ㅁ DB도 구축을 해야 한다.

- 이 사이트에 필요한 데이터들 보관할 DB를 구축해야 한다.

- 화면 구현한 것들을 하나씩 열어보면서 DB 설계를 진행한다.

이런 데이터들이 화면에 보여진다는 것은 이런 데이터들을 보관하는 컬럼이 필요하다는 소리다.

 

 

https://www.erdcloud.com/

- DB 설계는 이 사이트에서 진행하면 된다. 설치 없이 웹 상에서 바로 가능.

- 팀으로 다같이 동시 작업도 가능하다. 팀을 생성하고 초대하면 된다. 

- 그냥 클릭클릭 해서 배치하면 된다. 

- 그리고 라이브러리가 있어서 다른사람의 작업물들을 볼 수 있다. 

- 여기는 dbms 상관없이 설계하는 곳이라 오라클 아니고 mysql이나 마리아db 쓰면 오라클 컬럼명과는 좀 다를 수 있다.

- erd는 Entity-Relation Diagram.

 각각의 테이블간의 관계 표시를 도식화시켜놓은 것이다.

 

 

 

ㅁ 화면 구현한 것을 기반으로 DB설계 진행

- 어떤 테이블이 필요한지는 작성하기 페이지 위주로 보면 된다.

"회원가입페이지.html" 열어서 어떤 값들을 입력받는지 확인. 이 값들을 보관시킬 테이블이 필요하다.

 

 

- 4번째 테이블 모양 누르면 entity를 만들 수 있다.

- db설계는 개념적 설계 -> 논리적 설계 -> 물리적 설계 순서다.

논리 설계 당시에는 그냥 한글로 내가 어떤 테이블, 어떤 컬럼이 필요한지 작성하면 된다.

물리 설계 시에는 실제 이제 테이블명, 컬럼명을 뭘로 할건지, 제약조건 등을 작성한다.

- erdcloud는 논리 설계, 물리 설계를 다 진행할 수 있다.

entity의 왼쪽이 논리 설계, 오른쪽이 물리 설계다.

- 지금 논리 설계, 물리 설계가 다 보이고 있다. 

왼쪽 메뉴의 L, P 메뉴로 선택적으로 보이게 할 수 있다.

 

 

 

- 식별자로 회원번호가 필요하다. 중복되지 않고 필수적으로 존재한다. 이건 PK다.

 

- 이 테이블에 PK 컬럼을 추가하고 싶으면 노란색 플러스를 누르면 된다.

파란색 플러스는 그냥 일반 컬럼 추가다.

 

- 왼쪽 key는 논리 설계, 오른쪽 key는 물리 설계다.

논리에는 한글로 쓴다고 생각하면 된다. 물리에는 실제 어떤 컬럼명으로 쓸건지.

- 옆에는 도메인과 타입이 보이는데 입력 가능한게 더 있다.

회원 프로필 아이콘 옆의 톱니바퀴 설정 모양 눌러서 도메인은 체크 해제하고 나머지는 다 체크한다.

 

- type은 이 컬럼을 어떤 타입으로 줄 건지. 오라클에서의 컬럼의 타입.

물리설계 단계에서 하는건데 그냥 같이 진행한다. 

- 타입은 NUMBER, NULL은 PK니까 당연히 NOT NULL, 기본값도 PK니까 부여할 게 없다.

- 코멘트는 이따가 내보내기 기능으로 테이블 생성문이 내보내질 텐데 이때 COMMENT ON COLUMN 부분도 내보내진다. 

 

 

 

key가 아니고 USER_NO이다.

 

- 한 줄 다 쓰고 엔터치면 자동으로 다음 줄이 생긴다.

- 회원 아이디는 당연히 화면 구현할 때도 입력받을 때 필수로 받았었으니 NOT NULL.

- 참고로 설계단계에서는 NOT NULL 외의 제약조건을 설정할 수 없다.

UNIQUE나 CHECK 등은 따로 써야 한다.

- '관심분야'는 컴마로 구분한 하나의 문자열로 기록할 예정이다.

- '회원가입일'은 따로 입력받지 않고 DB에 데이터가 INSERT된 날짜로 한다.

기본값을 SYSDATE로 해놓으면 굳이 내가 SYSDATE 안써도 자동으로 입력된다.

- '정보수정일'은 어떤 사이트는 최종 정보 수정일이 나오는 경우도 있다.

- '회원상태'에서 기본값으로 문자 U를 줄 때 그냥 U 주면 안 되고 'U' 줘야 한다. (문자열 형식으로)

- 화면구현에서 필요해 보이는 컬럼들에 추가적으로 필요한 컬럼들을 추가한다. 

 

 

 

- 하단의 Export로 내보내기할 수 있다. 테이블 생성을 직접할 필요가 없다.

설계가 잘 되어있으면 개발 시간을 단축시킬 수 있다. 

 

 

- Oracle을 선택하고 SQL Preview로 미리보기하면 테이블 생성 구문이 나온다. 

 

 

 

 

ㅁ 공지사항쪽 데이터도 DB 설계한다.

- 공지사항 작성 페이지 보면 제목과 내용이 있다. 

- 공지사항 목록 페이지 보면 번호, 작성자, 작성일도 있다.

- 공지사항 테이블을 db설계한다.

 

 

- 항상 게시글은 글 번호가 PK로 되어있어야 한다.

- VARCHAR2에 제시할 수 있는 MAXIMUM BYTE는 4천이다. 

- 작성자 컬럼은 일반 컬럼이 아니라 무조건 MEMBER 테이블에 존재하는 데이터만 들어와야 한다. 

그래서 외래키 제약조건을 부여한다. 

회원 테이블이 부모 테이블이고 공지사항 테이블이 자식 테이블이 된다. 

 

- 왼쪽의 여러 선 모양 중 한 개 또는 여러개 라고 적힌 선을 사용한다. 

 

 

- 부모 테이블을 먼저 클릭하고 자식 테이블을 클릭하면 연결된다.

- 식별관계 혹은 비식별관계를 선택하라고 뜨는데 지금은 무조건 비식별관계를 선택한다. 

 

 

- 이러면 저 테이블에 존재하는 PK 컬럼이 이 테이블의 외래키 제약 조건 컬럼으로 들어온다. 

- 노란색 키가 PK를 의미하고 분홍색 키가 FK를 의미한다. 

- 회원 번호만 있으면 조인해서 회원 아이디 등을 알아낼 수 있다.

 

 

 

 

- 만약 식별관계를 선택하면 FK로 추가되면서 동시에 자식 테이블의 PK로도 추가된다.

두개의 키가 묶여서 복합키로 PK가 된다.

- 기존의 PK 컬럼 하나만으로도 충분하기 때문에 굳이 FK가 걸려있는 컬럼을 PK로 같이 묶을 필요가 없으면 비식별관계를 사용한다.

 

 

 

 

- FK로 들어온 컬럼을 수정한다. 

컬럼명은 수정해도 되지만 타입은 바꾸면 안 된다.

NOT NULL은 판단해서 바꿀 수도 있는데 글 작성할 때 작성자 번호가 항상 필요하니 NOT NULL로 둔다.

- '글상태'는 처음에는 유효한 글이지만 나중에 관리자가 해당 게시글을 삭제할 수 있다.

그런데 항상 삭제는 아예 데이터를 날려보내지 않고 항상 일정 기간 동안 보관해 두시는게 제일 좋다.

관리자가 해당 공지사항을 삭제하는 요청을 보내면 '글상태'를 바꾼다.

(삭제요청시 DELETE가 아니라 UPDATE)

- '글상태' 컬럼의 기본값은 처음에는 유효한 상태이므로 'Y'를 준다. 

 

 

 

 

ㅁ 일반게시판 DB 설계

- 일반 게시글 작성 페이지를 보니 카테고리, 제목, 내용, 첨부파일이 있다.

- 만약 카테고리를 동적으로 추가, 수정, 삭제한다면(카테고리가 정적이 아니라 동적으로 바뀔 예정이라면) 

그때는 이 카테고리에 대한 정보를 따로 보관하는 테이블이 있어야 한다.

그래야 관리자 측에서 그걸 따로 관리하는 기능도 넣을 수 있다.

수업 시간에 그 기능까지는 안 한다. 그냥 이렇게 할 수도 있다.

- 그래도 그런 기능이 있을 수도 있으니 카테고리에 대한 데이터를 보관하는 테이블을 따로 만든다.

 

 

- 카테고리 테이블을 만든다. PK는 카테고리번호 컬럼을 만든다.

- 만약 관리자측에서 이 카테고리를 관리하는 기능이 들어간다면 어떤 관리자가 이 카테고리를 등록했는지 등록자명, 등록일 등의 컬럼이 필요하다. 근데 그거는 기능 구현을 안 할 예정이라 이렇게만 둔다.

- 카테고리는 정적으로 데이터 몇개만 담아두고 시작할 예정이다.

 

 

 

- 게시글 테이블을 만든다. 

항상 게시글에는 글 번호가 무조건 식별자로 사용된다.

공지사항 번호, 게시글 번호 등은 시퀀스를 활용해서 겹치지 않게끔 부여해야 한다.

- 게시글이 일반 게시글이 있고 사진 게시글이 있다.

일반 게시글에 대한 데이터, 사진 게시글에 대한 데이터를 한 테이블에 담는다.

왜냐면 입력받을 정보가 비슷하기 때문에.

대신 일반게시글인지 사진게시글인지 구분할 수 있는 컬럼을 주는게 좋다. '글유형' 컬럼 만듦.

 

 

 

- 게시글 테이블의 카테고리 컬럼은 카테고리 테이블에 존재하는 값만 들어와야 한다.

카테고리 테이블과 비식별관계로 연결해서 fk 컬럼을 만든다.

- 카테고리 번호만 있으면 나중에 조회할 때 조인으로 카테고리명을 알아낼 수 있다.  

- 근데 게시글 테이블의 카테고리 컬럼은 NULL 가능으로 바꾼다.

나중에 사진 게시글 작성 시에는 카테고리를 선택하지 않을 수 있다.

 

 

 

- 누가 작성했는지도 데이터가 필요하다. 회원 테이블과도 연결해서 회원번호를 가져온다. 

회원번호를 글작성자번호로, KEY를 BOARD_WRITER로 수정한다.

 

 

 

- 조회수 컬럼. 초기값 0을 준다.

- 첨부파일은 이따가 설명한다. 

 

 

============================================================================

 

 

ㅁ 첨부파일

- 일반 게시글 작성 페이지를 보면 첨부파일 하나 업로드 가능하다.

하나의 게시글에 하나의 첨부파일이기 때문에 따지고 보면 1대1 관계이다.

- 그럼 사실 게시글 테이블에다가 현재 첨부 파일에 대한 정보를 바로 기술할 수 있다.

한 게시글에 하나의 첨부파일이기 때문에.

- 사진 게시글은 다중 첨부파일 업로드를 지원한다. 1대다 관계이다.

그런데 게시글 테이블에 일반 게시글과 사진 게시글 데이터를 한번에 담는다.

그때는 게시글 테이블에 '첨부파일' 컬럼 하나 준다고 모든 정보를 표현할 수 없다. 

1대다 관계는 테이블을 쪼개야 한다.

- 결과적으로 게시글 테이블에 '첨부파일' 컬럼을 주지 않고, 첨부파일 테이블을 별도로 만든다.

 

 

- 첨부파일 그 자체를 DB에 기록할 수는 없다. 파일 그 자체는 서버에 업로드를 시키고 대신 서버의 어떤 폴더에 저장을 시켰는지 이때 첨부파일명은 뭐고 실제 저장된 파일명은 뭔지 그런 텍스트 정보만 DB에 보관시킬 수 있다.

- 이 첨부파일이 어떤 게시글의 것인지를 표현해야 한다. 1대다 관계. 외래키로 '게시글' 테이블의 '글번호' 컬럼을 가져온다. 

'참조글번호', 'REF_BODARD_NO', '참조게시글번호'로 수정한다.

- 이렇게 하면 조인을 해서 특정 게시글에 첨부되어 있는 첨부파일들도 같이 가져올 수 있다.

 

 

 

- 그리고 또 보관해야할 게 현재 업로드한 첨부파일의 원본을 기록해야 한다.

'일반게시판상세페이지.html'를 라이브 서버로 열어보면 일반게시글을 상세조회하는 창에서 첨부파일에 첨부파일 원본명이 보이기 때문이다.

- '파일원본명' 컬럼을 추가한다. null은 그냥 뭐 null로 줬다. 혹시 모르니.

- 파일원본명을 null 허용한 이유는 

'파일원본명' 컬럼을 추가한 이유 자체가 다운로드할 때 첨부파일 원본명이 보여지고 그걸 클릭하기 때문인데,

첨부파일을 다운로드하지 않고 보여지기만 할 때는 실제 업로드된 파일만 있으면 된다. 

그래서 그럴 때는 null이 들어갈 수도 있기 때문에 null을 허용한 거였고, 실제 업로드된 파일명은 무조건 기록을 해야 한다.

 

- 실제 파일은 서버에 저장된다. 그런데 파일이 저장될 때는 원본명 그대로 저장되면 안된다. 

같은 이름의 파일이 업로드될 수 있고, 특수문자나 공백도 들어올 수 있는데 실제 서버에 저장할 때는 특수문자라든가 공백같은게 절대 있어서는 안 된다. 

파일을 업로드하는(파일을 서버에 저장) 과정을 할 때는 파일명을 수정해서 문제되지 않을만한 이름으로 저장을 시켜야 한다.

- '실제업로드된파일명' 컬럼을 추가한다. 파일원본명이 아닌 수정된 파일명이다.

 

- 파일이 어떤 경로에 저장됐는지, 즉 어떤 폴더에 저장됐는지 업로드된 경로를 보관하는 '업로드된경로' 컬럼을 둔다. 중요하다.

- '업로드된경로'랑 '실제업로드된파일명' 이 두 개 컬럼이 있어야만 해당 파일을 찾을 수가 있다. 

 

- 언제 업로드되었는지도 기록하면 좋다. '업로드일' 컬럼 추가.

 

- '첨부파일레벨' 컬럼을 둔다. 

사진 게시글같은 경우는 다중 첨부파일 업로드를 한다. 그래서 대표 이미지 하나랑 상세 이미지 여러개를 입력되게 한다.

그래서 첨부파일들이 대표 이미지인지 상세 이미지인지 구분할 수 있어야 한다.

- '첨부파일레벨'은 null을 허용한다.

왜냐면 얘는 사진 게시글일 때만 사용할 컬럼이기 때문에 일반 게시글 때는 필요 없다.

 

- '첨부파일상태' 컬럼을 둔다. 

Y는 유효한 첨부파일, N은 삭제된 첨부파일.

 

 

 

 

=======================================================

 

 

ㅁ 나중에 댓글 기능도 구현한다.

- 그거는 나중에 기능 구현할 때 화면 구현도 같이 한다.

- 댓글 테이블을 미리 만들어 둔다.

 

 

- PK '댓글번호' 컬럼을 둔다. 댓글 고유 번호는 이것도 시퀀스로 넣으면 된다. 

- 누가 작성했는지는 멤버 테이블에서 회원번호 컬럼을 가져오고 FK 제약조건을 준다.

'댓글작성자번호' 등으로 수정한다.

- 이 댓글이 어느 게시글에 달려있는 댓글인지 참조할 게시글 번호도 필요하다.

그때도 당연히 '게시글' 테이블에 있는 게시글의 번호만 들어와야 한다.

'글번호' 컬럼을 '참조게시글번호'로 수정한다.

- 마지막으로 '댓글상태' 컬럼. 

지금은 유효한 글이냐, 삭제한 글이냐만 정해놓고 있는데 나중에는 관리자가 블라인드처리같은 것도 할 수 있다.

 

 

 

=================================================================

 

 

 

- 다 완성되었으면 각 서비스별로 관련된 테이블들을 색깔을 다르게 주는 것도 좋다.

 

 

 

- 게시글 관련 4개의 테이블은 주황색으로 뒀다.

 

 

- 화면 설계 다 끝나고 DB설계할 때 erdcloud.com 와서 이렇게 하면 된다.

- 팀들과 동시에 작업할 수 있다.

- 테이블 아래 5번째 아이콘으로 메모를 추가해놓을 수도 있다. 

 

 

 

ㅁ 작업이 다 끝났으니 테이블 생성 구문을 내보낸다.

- DB 스크립트(데이터베이스를 생성하고, 테이블을 만들거나 수정하고, 데이터를 삽입, 업데이트, 삭제하는 등의 작업을 수행)를 얘가 만들어준다.

- export - "오라클" 선택 - 'PK 제약조건 추가', 'FK 제약조건 추가', '비식별 제약조건 추가' 3개 선택 - SQL 다운로드

- '연습용.sql'로 받아지는데 'DB스크립트'로 바꾼다.

이 스크립트만 실행하면 db가 구축된다.

 

 

 

 

 

===================================================================================

 

 

[이제 DB 구축]

 

 

ㅁ sql developer 실행

- 새로운 계정을 만든다. 

이전의 계정들은 접속창에서 지운다. 여기서 지운다고 계정이 사라지는 것은 아니다. 나중에 다시 접속 가능하다.

- 관리자 계정으로 접속해서 워크시트를 킨다.

 

- 유저를 만들고 권한을 부여한다.

- SERVER라는 새로운 계정으로 접속한다. 계정명은 대소문자를 가리지 않는다. 비밀번호는 대소문자를 가린다.

 

 

- 비번도 SERVER로 함. 비밀번호 저장 체크하고 색깔 지정하고 이름 바꾸고 '접속' 클릭.

 

 

- erdcloud에서 설계한걸 가지고 받은 DB 스크립트를 새로운 계정의 시트에 드래그앤 드롭으로 연다.

- 제약조건명을 자동으로 붙여주는데 너무 길어서 실행시 오류가 날 수도 있다.

혹시 나중에 실행했을 때 이 라인에 오류가 난다면 제약 조건명이 너무 길 때가 있다. 

- 상단 위의 접속 계정을 방금 만든 계정으로 선택하고, 스크립트 전체실행한다.

 

 

 

 

- 엄청나게 긴 오류 발생.

- 오류가 발생했을 때는 테이블을 싹 삭제했다가 다시 생성하는 것이 좋다. 

- 오류 이유 1. 오라클로 다운받은 줄 알았는데 아니었음. 오라클을 선택하고, 미리보기 안누르고 다운했더니 지금 위와 같이 따옴표가 하나다. 근데 오라클 선택하고 미리보기 누르고 다운했더니 따옴표 두개인 오라클 구문으로 잘 받아졌음.

- 오류 이유 2. 오류가 그래도 났었는데, 다른 테이블은 다 잘 만들어졌는데 MEMBER 테이블만 문제였다.

오류 이유가 뭔지는 메시지만 보고는 알기 어려웠는데 MEMBER 테이블이 생성되지 않고 있었다. 

위에서 보듯이 'CREATE'도 파란색이어야 하는데 검은색이다. 자동으로 다운받아져서 이런 오류가 종종 뜬다.

아무튼 띄어쓰기 했더니 색깔 파란색돼서 실행해봤는데 여전히 오류.

띄어쓰기 한 칸 한거 지우고 실행했더니 오류 안 남. (CREATE 지우고 다시 써보길)

- 선생님도 의미없는 오류 맨 첫줄에 발생했는데 별 의미는 없었음. 

스크립트 출력한걸 쭉 보면서 오류가 찍혀있지 않아야 한다. 

 

 

 

-----------------해당 계정 내에 존재하는 DB 객체들 삭제하는 PLSQL문------------------
-- 해당 계정의 모든 트리거 삭제
BEGIN
FOR C IN (SELECT * FROM USER_TRIGGERS) LOOP
  EXECUTE IMMEDIATE 'DROP TRIGGER '||C.TRIGGER_NAME;
END LOOP;
END;
/
--해당 계정의 모든테이블 및 제약조건 삭제
BEGIN
    FOR C IN (SELECT * FROM USER_TABLES) LOOP
    EXECUTE IMMEDIATE ('DROP TABLE "'||C.TABLE_NAME||'" CASCADE CONSTRAINTS');
    END LOOP;
END;
/
--해당 계정의 모든 시퀀스 삭제
BEGIN
FOR C IN (SELECT * FROM USER_SEQUENCES) LOOP
  EXECUTE IMMEDIATE 'DROP SEQUENCE '||C.SEQUENCE_NAME;
END LOOP;
END;
/
--해당 계정의 모든 뷰 삭제
BEGIN
FOR C IN (SELECT * FROM USER_VIEWS) LOOP
  EXECUTE IMMEDIATE 'DROP VIEW '||C.VIEW_NAME;
END LOOP;
END;
/
------------------------------------------------------------------

 

- 이 구문들을 상단에 복붙한다. 

이 구문들을 상단에 쓰고 실행하면 이 구문들이 먼저 다 실행되고 테이블 생성 구문들이 실행된다.

항상 위 구문들을 상단에 붙여넣기해서 써라.

이 스크립트만 가지고 있으면 어느 PC든 동일한 DB로 세팅할 수 있다.

이거 실행하면 기존에 있는것들 다 날리고 새로 실행된다.

 

 

============================================================================

 

 

ㅁ 이제 테이블이 만들어졌으니 샘플데이터를 추가한다.

- 처음 구현했을 때와 생각이 달라져서 특정 테이블에 컬럼을 추가한다. 그러면 ALTER 구문을 쓰고 모든 팀원들이 똑같은 DB를 유지해야 한다. 파일을 항상 최신화시켜야 한다.

- 모든 사람들이 이 스크립트 파일만 실행하면 동일한 DB가 세팅되게끔 최신화 작업을 해줘야 한다.

 

 

ㅁ 시퀀스 생성구문, 샘플데이터 추가

- "DB객체삭제구문 + DB생성구문" 뒤에 추가로 작성한다.

- 시퀀스 하나로 모든 테이블에 다 써서는 안 된다.테이블당 시퀀스도 하나씩 둬야 한다.

 

 

 

- 샘플데이터 넣을 때도 시퀀스를 사용해서 넣어야 한다.

- 취미는 컴마로 연결되게끔 한다.

입력받은 값을 db로 보낼 때 String.join(',', String배열)해서 한 문자열로 합치면 될듯.

- 공지사항 게시글을 작성하는 사람은 관리자다. 관리자는 두명인데 각각 회원번호가 1, 2니까, 공지사항 테이블에도 1, 2만 들어올 수 있다. check 제약조건 줘야 되나?

- 샘플데이터를 넣고 나서는 항상 커밋을 해야 기능 쪽에서 볼 수가 있다!!!!!!!!!

- 그리고 테이블에 UNIQUE나 CHECK 제약조건도 걸어줘야 한다. 여기서는 안 걸었음. 

- 이렇게까지 작성해서 붙여주고 스크립트 전체실행한다. 

로그에 오류 없는지 쭉 확인하고 마지막에 커밋까지 잘 되어있어야 한다.

테이블들 열어서 데이터들도 정상적으로 들어갔는지 확인한다.

- DB 구축 까지 끝났으면 이제 웹 어플리케이션 제작을 하면 된다. 

웹 사이트 제작을 하기 위해 새로 이클립스로 프로젝트를 생성한다.

 

 

ㅁ 이렇게 해서 화면 구현, DB 설계 및 구축까지 끝났다.

- DB설계 및 DB구축
- 프로젝트 생성 및 index 페이지 띄우기
- 회원서비스 개발 세팅

 

 

 

 

=====================================================================================

 

 

[일반게시글서비스 샘플 데이터 넣기]

 

 

ㅁ 회원과 공지사항 테이블 말고, 게시글 테이블(BOARD)에도 샘플데이터를 넣는다.

 

- 다수의 샘플 데이터가 담겨있어야 페이징처리를 할 수 있다. 

- 100개 넘게 데이터를 INSERT할 예정인데 일일이 100개 넘는 INSERT문을 쓰지 않고 엑셀로 데이터 작업을 하고, 

엑셀에 기록된 데이터를 DB에 한번에 INSERT한다.

- 데이터 임포트는 sql developer에서 제공하는 기능이다.

sql문 관련된 다른 프로그램을 쓰면 이런 기능이 지원되지 않을 수 있다.

 

 

 

 

ㅁ DB에 엑셀로 데이터 한번에 넣기

- 엑셀이 없으므로 구글 스프레드 시트로 작업하고 엑셀파일로 내보낸다.

 

 

- BOARD 테이블에 일반게시글, 사진게시글을 둘 다 담고 BOARD_TYPE으로 구분하게끔 설계되어 있다.

- CATEGORY_NO는 카테고리 번호에 대한 데이터인데 CATEGORY 테이블에 존재한다.

 

 

 

 

 

- CATEGORY 테이블이다. 그런데 여기도 데이터가 현재 아무것도 없다.

- CATEGORY 테이블에 데이터를 넣고, 그 데이터를 참조해서 BOARD 테이블에 데이터를 넣을 예정이다.

 

 

 

 

 

 

 

- 새 스프레드 시트를 만들고, 시트이름을 더블클릭해서 CATEGORY로 바꾼다.

 

 

 

 

 

 

- 첫번째 행에 컬럼명을 작성한다.

 

 

 

 

 

- 카테고리 정보는 화면구현할 때 이렇게 정해놨었다.

 

 

 

 

 

 

- 각각의 카테고리를 식별하는 카테고리 번호는 시퀀스를 사용하지 않고 정적으로 데이터를 넣어둔다.

카테고리 번호는 시퀀스를 만들지도 않았었다.

- 나중에 관리자가 카테고리를 관리하는 기능이 있다면 카테고리가 추가, 수정, 삭제될 수 있다. 

 

 

 

 

 

 

 

- 새 시트를 만들고 BOARD라는 이름을 준다. 

DB에서 컬럼들을 가져와서 1행에 쭉 작성한다.

 

- 샘플데이터를 넣을 때도 시퀀스를 써서 넣는다.

샘플데이터에 정적으로 1을 넣었는데 나중에 INSERT할 때 시퀀스가 1부터 시작하면 PK가 겹쳐서 오류난다.

- 게시글 유형은 일단 다 1(일반게시글)로 한다.

- CATEGORY_NO는 CATEGORY 테이블에 있는 번호만 작성한다. 

무작위로 몇개 작성하고 복붙한다. 

- 총 115행까지 데이터를 넣었다. 첫행은 컬럼명이므로 114개의 데이터다.

 

 

 

 

 

 

 

- BOARD_WRITER는 외래키 제약조건이 걸려있다. 

BOARD_WRITER는 회원 아이디가 아니고 일반게시글 작성자의 회원 번호다.

MEMBER 테이블에 존재하는 회원번호만 들어가야 한다. 

- BOARD_WRITER는 각자 DB의 MEMBER 테이블을 확인해서 거기에 있는 회원번호로 랜덤으로 작성한다.

 

- 조회수(BOARD_COUNT)는 다 0으로 해놓는다.

- 작성일(REGIST_DATE)는 샘플 데이터로 2024-05-01부터 1씩 다 늘어나게끔 한다. 

- 상태(STATUS)는 기본값이 'Y'로 되어있긴 한데, 일단 다 Y로 적어놓는다.

 

 

 

 

 

 

 

- '파일' - '다운로드' 에서 엑셀파일로 다운받는다.

 

 

 

 

ㅁ sql developer

 

 

- sql devloper에서 CATEGORY 테이블 우클릭 - '데이터 임포트'를 누른다.

 

 

 

 

- '찾아보기'로 import할 엑셀 파일을 선택한다.

이 엑셀 파일에는 시트가 2개 있다. 

- 'CATEGORY'를 먼저 선택하고 '다음'을 누른다.

 

 

 

 

- 임포트 방식이 '삽입'으로 되어있다. 뭐 할거없이 바로 '다음'을 누른다.

 

 

 

 

 

- 선택된 열에 자동으로 두 컬럼이 들어가 있다. 뭐 할거없이 바로 '다음'을 누른다.

 

 

 

 

 

- 어떤 컬럼에 어떤 데이터가 들어갈지 볼 수 있다. 

- 딱히 경고표시같은 게 없다. 바로 '다음'을 누른다.

 

 

 

 

- 바로 '완료'를 누른다.

 

 

 

- 이런 창이 뜬다. 

 

 

 

 

- CATEGORY 테이블에 데이터가 성공적으로 들어가 있다. 

 

 

 

 

ㅁ BOARD 테이블에도 똑같이 데이터 임포트 한다.

 

 

 

- 그런데 CATEGORY 테이블에 데이터 임포트할 때와 다르게 경고가 떠있다.

BOARD_NO 컬럼이 현재 NUMBER 타입으로 되어있는데 시퀀스 구문을 작성해서 경고가 떠있다.

이건 무시해도 된다.

 

 

 

 

 

- 날짜는 그래도 한번 확인해본다.

아래의 '데이터'에 보여지는 날짜 형식과 위의 '대상 테이블 열'의 형식이 맞는지를 확인한다.

 

 

 

 

- '다음'을 누르고 '완료'를 누르면 위와 같이 오류가 뜬다. '예(Y)'를 누른다.

 

 

 

 

 

 

- INSERT 문들이 보여진다. 

- BOARD 테이블을 확인해보면 데이터가 들어가 있지 않은 텅 빈 상태다.

- '스크립트 실행'으로 전체구문을 실행하면 BOARD 테이블에 114개의 데이터가 정상적으로 INSERT 된다. 

 

- 그러고 나서 반드시 'COMMIT;' 까지 한다. 

DML문을 실행하고 커밋하지 않으면 데이터가 조회되지 않는다.

 

 

 

 

- 엑셀에는 CHAR 타입의 STATUS 컬럼에 그냥 Y로 썼지만 자동으로 따옴표로 감싸져 있다.

제목과 내용도 따옴표가 자동으로 감싸져 있다.

 

 

 

 

===============================================================================

 

 

 

ㅁ 데이터 익스포트

- sql developer에서 백업을 위해 데이터 익스포트를 할 수 있다. 

- 다른 pc에서 현재 db 상태 그대로 세팅(테이블, 시퀀스, 데이터)을 하고 싶다면

현재 이 db 상태를 그대로 구축해주는 구문을 내보낼 수 있다.

- 모든 팀원이 동일한 db를 가져야 한다.

 

 

 

 

 

- '도구' - '데이터베이스 익스포트'를 클릭한다.

 

 

 

 

 

 

- 어떤 계정을 내보내기 할건지 '접속'에서 계정을 선택한다.

- 'DDL 익스포트'에서 '스키마 표시', '저장 영역', '테이블스페이스'는 체크되어있는데 체크 해제한다.

저 세개는 들어가 있으면 제대로 작동이 안된다.

데이터베이스 환경에 따라 필요 없거나 맞지 않을 수 있다.

 

- ".sql" 파일로 내보내진다. 어느 경로에 어떤 이름으로 내보낼건지를 '찾아보기'로 선택한다.

 

 

 

 

 

- 날짜도 써서 작성해주고 '다음'을 누른다.

 

 

 

- 곧바로 '다음'을 누른다.

 

 

 

 

 

- 곧바로 '다음'을 누른다. 

 

 

 

 

 

- 곧바로 '다음'을 누른다.

 

 

 

 

 

- 곧바로 '완료'를 누른다.

 

 

 

 

- 이런식으로 파일이 만들어진다. 

시퀀스 생성문, 테이블 생성문, 데이터 INSERT문 등 다 내보내진다.

- 시퀀스도 친절하게 114까지 있으므로 115부터 시작되게끔 만들어진다. 

 

 

 

 

- 그런데 생성문만 있고 기존에 있는걸 삭제하는 구문은 없어서 이걸 맨 위에 복붙해놓는다.

- 이렇게 DB 스크립트를 구성해야 한다.