SQL - DFD, DB, 문서화작업

Luna·2022년 12월 19일
1

EZEN

목록 보기
7/40
  • SQL 구문, DFD 외워서 쓰기

SQL

  • 리스트 - list
    전달 X
    리턴 no, title, write, writeDate, hit(VO- List)
select no, title, writer, writeDate, hit
from board
order by no desc;
  • 글보기 - view
    전달 {no, inc(조회수)} - 묶어서 Object로 보냄
    리턴 no, title, content, writer, writerDate, hit(VO)
select no, title, content, writer, writerDate, hit
from board
where no = 2;
  • 조회수 증가
update board set hit = hit + 1
where no = 2;
-- 이걸 어떤 조건에서 실행 할건지 말건지 if문으로 씀)
  • 글쓰기 - write
    전달 title, contetnt, writer(VO)
    리턴 int(1행이 삽입되었습니다)
insert into board (no, title, content, writer, pw)
values (board_seq.nextval, '제목', '내용', '작성자', '1111');
  • 글수정 - update
    전달 {no, 0} - VO (조회수는 증가시키지 않는다.)
    리턴 VO
    전달 no, title, content, writer, pw (VO)
    리턴 int
update board set title='제목수정' , content='내용수정' write='작성사수정'
where no = 2 and pw ='1111';
  • 글삭제 - delete
    전달 no, pw
    리턴 int
delete from board
where no = 2 and pw = '1111';

DFD

Main - BoardController - BoardListServiceImpl - BoardDAO
인터페이스 쓰는 이유 : 소스가 간단해진다. 관리가 편하다. 확장성이 좋다.

Class와 갖고있는 method

BoardList

  • Main Class
    public void static void main(String[] args) {}
  • BoardController Class
    public void execute()
  • Execute Class
    public static Object run(ServiceInterface, Object)
  • <<interface>> ServiceInterface
    public Object service(Object obj) throws Exception
  • BoardListServiceImpl implements ServiceInterface Class
    public List<BoardVO> service(Object obj) throws Exception
    obj 값은 넘어가는게 없으니 null로 받는다, 리턴타입 List<BoardVO>Object로 대체 가능
  • <<interface>> BoardDAO
    public List<BoardVO> list() throws Exception;
  • BoardDAOImpl implements BoardDAO Class
    public List<BoardVO> list() throws Exception
  • BoardPrint
    public static void print(List<BoardVO>)

BoardWrite

  • Main Class
    public void static void main(String[] args) {}
  • BoardController Class
    public void execute()
  • Execute Class
    public static Object run(ServiceInterface, Object)
  • <<interface>> ServiceInterface
    public Object service(Object obj) throws Exception
  • BoardWriteServiceImpl implements ServiceInterface Class
    public Integer service(Object obj) throws Exception
    obj 값은 입력받은 글번호(Long no), 리턴타입 IntegerObject로 대체 가능
  • <<interface>> BoardDAO
    public Integer write(BoardVO vo) throws Exception;
  • BoardDAOImpl implements BoardDAO Class
    public Integer write(BoardVO vo) throws Exception

Datebase

설치하기

localhost로 실행하기

  1. 서버 실행
    -작업관리자 - 서비스 들어가서 OracleServiceXE, OracleXETNSListener 실행시키기
    -TNSListener를 통해서 들어가게 됨.
    -Database 웹 관리 포트 번호는 8080 : tomcat 포트와 충돌이 일어난다. 둘 중에 하나 변경 필요.
    -https 443포트 / http 80포트 - 연습 할 때는 80포트 사용
  2. SQL Developer 실행
    -관리자 계정은 SYS, HR 계정은 샘플 데이터가 들어있음. 관리자 계정 롤 : SYSDBA
    -SYS 계정으로 실습하지 않는 것이 좋음. 새로 계정 만들어서 사용하기. 테이블 건들면 실행 안됨.
    -미리 만들어 놓은 JAVA 계정은 일반계정이고 롤은 기본값, 포트번호 1521, SID는 xe
  3. 계정 만들고 권한 주기
    -SQL 01 - 사용자, 테이블 참조
  4. localhose 접속하기
    -새접속 - name 지정 - 만들어놓은 아이디와 비밀번호 입력하고 롤은 기본값 - 테스트 성공 뜨면 접속

DBA 계정으로 접속하기

  1. 방화벽 풀어주기 (DBA의 컴퓨터)
    -검색 - Windows Defender방화벽 - 고급설정 - 인바운드규칙 - 새규칙 - 포트선택 - 다음 - TCP선택 - 특정로컬포트1521- 연결허용 - 다음 - 도메인, 게인, 공용 전부 선택 - 이름:oracel 설명:프로젝트이름 - 마침
    -만들어진 Oracle 속성 눌러서 프로토콜 및 포트 확인 (변경 가능).
  2. DBA의 계정으로 접속하기
    -DBA가 만든 계정과 비밀번호 공유 받아서 DBA 컴퓨터에 접속 한다. (DBA 본인도 접속 필요)
    -사용자 이름과 비밀번호는 DBA가 생성한 계정으로 접속하고, 호스트 이름엔 DBA의 아이피를 입력한다.
    -롤 기본값, 테스트 눌러서 성공 뜨면 접속하기.

    -프로젝트시 dba 계정으로 접속해 제대로 연결이 되는지 확인하면서 해야 한다. 끝나면 접속 해제하기.
    -DBA 입장에서는 local 접속이나 dba 접속이나 동일하다. DBA가 다른 실습 하려면 계정 새로 만들어야 함.

헷갈리는 것 질문하기

DBA의 계정과 내 계정의 이름이 같은 것은 상관 없다. 근데 만약에 같아서 헷갈린다면 내 계정명을 변경 해줘야 하는데 사용자 이름 (user)은 변경을 할 수 없고 drop후에 다시 create를 해줘야 한다. drop하려면 sys계정으로 접속해서 하면 되는데, DBA의 계정과 내 계정의 이름이 같아서(rentcar) 괜히 drop 했다가 DBA의 계정까지 삭제가 될까봐 선생님께 여쭈어봤다. localhostsys계정으로 접속 후 워크시트에서 계정을 drop하면 내 계정만 삭제가 된다. 현재 DBA 계정으로 접속한건 sys계정이 아니므로 DBA의 계정을 drop 한다던지, 비밀번호를 변경(alter)한다던지 계정에 대한 권한(grant)을 바꾼다던지 하는 일은 할 수 없다. 만약에 내가 DBA sys계정의 정보를 전부 알고 있으면 롤값을 SYSDBA로 변경하고 워크시트를 열어서 처리 할 수는 있다. (하지만 나는 DBA가 아니므로 변경하지 않도록 조심하자...!)

  • 접속을 만들었다는 것은 정보를 가지고 접근하겠다는 것
  • 접속 이름은 변수와 같은 개념이라 만약에 접속 이름을 변경하고 싶으면 접속 해제 후 이름 변경 후 저장해주면 된다.
  • 계정 이름은 바꿀 수 없고 삭제하고 새로 만들면 된다.

JSP & Servlet 프로젝트 문서화 작업

테이블 정의서

  • 카페 들어가서 웹커뮤니티_테이블정의서 다운받기
  • 6.게시판에 비밀번호 컬럼 추가하기.
    -컬럼명 : 비밀번호, 컬럼ID :p w, 타입 : varchar2, 길이 : 20, NotNull
  • 오라클 데이터 타입은 블로그 참조
  • 데이터 타입은 보통 NUMBER VARCHAR2 DATE를 많이 사용함.
  • 제약조건 : Not Null, Primary Key, Foreign Key, Unique Key, Check
    NN : Null값이 오면 안된다.
    PK : 중복이 안되고, Null값이 오면 안된다.
    FK : 참조키, 외부키, 외래키 여러가지 이름으로 부를 수 있는데 다른 테이블의 컬럼을 참조하는 기능
    UK : 중복값을 허용하지 않는 제약조건
    CK : 조건에 맞는지 안맞는지 체크를 해주는 제약조건

게시판

게시판 스키마

-- 일반 게시판 스키마 (데이터 저장 구조) 생성

-- 1. 제거 - DROP TABEL, DROP SEQUENCE : 순서는 상관 없음
-- CASCADE CONSTRAINES : 자신의 기본키나 고유키를 참조하는 테이블의 제약조건을 삭제하고 진행
-- TABLE : 데이터를 저장하기 위한 구조
-- 구조를 수정 하기 위해서는 DROP후 CREATE 하면 된다. 우클릭 후 수정하게 되면 쿼리가 남지 않는다.
DROP TABLE BOARD CASCADE CONSTRAINTS;

-- SEQUENCE : 순서번호
DROP SEQUENCE board_seq;

-- 2. 생성 - CREATE TABLE, CREATE SEQUENCE : 순서 상관 없음
-- 한글 한 자당 3byte, VARCHAR2(300)이면 한글로 100자를 쓰겠다는 뜻.
-- VARCHAR2 : 4000byte까지 저장 가능. 길이 필수 지정.
-- NOT NULL : 필수 입력. 데이터가 비어있으면(Null) 안된다.
-- PRIMARY KEY : 주 키. 중복되면 안되고 NULL값이면 안된다. UK+NN
-- SYSDATE : 오라클 시스템의 날짜와 시간
-- HIT : 기본값을 사용한 이유 - HIT에 데이터가 없으면 NULL이 된다.
--      : NULL은 연산 불가. HIT = HIT + 1;
CREATE TABLE BOARD (
    no NUMBER PRIMARY KEY,
    title VARCHAR2(300) NOT NULL,
    content VARCHAR2(2000) NOT NULL,
    writer VARCHAR2(30) NOT NULL,
    writeDate DATE DEFAULT SYSDATE,
    hit NUMBER DEFAULT 0,
    pw VARCHAR2(20)NOT NULL
);

CREATE SEQUENCE board_seq;

-- 3. 샘플데이터
-- seq.nextval -> 다음 숫자(값)를 받아온다. 숫자가 계속 증가. 보통 20개씩 만들어 둔다.
INSERT INTO BOARD (NO, TITLE, CONTENT, WRITER, PW)
VALUES (board_seq.nextval, '제목1', '내용1', '작성자1', '1111');
INSERT INTO BOARD (NO, TITLE, CONTENT, WRITER, PW)
VALUES (board_seq.nextval, '제목2', '내용2', '작성자2', '1111');
INSERT INTO BOARD (NO, TITLE, CONTENT, WRITER, PW)
VALUES (board_seq.nextval, '제목3', '내용3', '작성자3', '1111');
COMMIT;

-- 4. 데이터 검사 (SELECT)
-- * : 모든 데이터 표시 -> 속도가 느려지는 원인이 되기 때문에 현장에서는 사용하지 않는다.
SELECT * FROM BOARD;

게시판 운영 쿼리

-- 게시판 운영 쿼리
-- 단계별로 테스트하고 데이터가 수정(INSERT, UPDATE, DELETE)이 되면 COMMIT한다.

-- 1. 리스트 - 번호, 제목, 작성자, 작성일, 조회수
-- 조건 : 최신글이 맨 위에 오도록 한다.
SELECT no, title, writer, writeDate, hit
FROM BOARD
ORDER BY no DESC;

-- 2. 보기 - 조회수를 먼저 증가 시키고 데이터를 불러온다.
-- 조회수 증가
UPDATE BOARD SET HIT = HIT + 1
WHERE NO=2;
COMMIT;

-- 가져온 데이터 : 번호, 제목, 내용, 작성자, 작성일, 조회수
SELECT no, title, content, writer, writeDate, hit
FROM BOARD
WHERE NO=2;

-- 3. 등록 - 제목, 내용, 작성자, 비밀번호
-- 글번호는 seq에서 받아온다.
INSERT INTO BOARD (NO, TITLE, CONTENT, WRITER, PW)
VALUES (board_seq.nextval, '제목4', '내용4', '작성자4', '1111');
COMMIT;

-- 4. 수정 - 제목, 내용, 작성자, 글번호와 비밀번호가 맞아야 수정한다.
UPDATE BOARD SET TITLE='제목수정', CONTENT='내용수정', WRITER='작성자수정'
WHERE NO=2 AND PW='1111';
COMMIT;

-- 5. 삭제
DELETE FROM BOARD
WHERE NO=2 AND PW='1111';
ROLLBACK;
COMMIT;

현재 위의 쿼리에서는 게시판의 순서를 no컬럼이 오름차순으로 정렬되게 정의되어 있다. 그런데 게시판 기능에 흔하게 있는 공지글은 글을 아무리 계속 추가해도 계속 상단에 고정되어 있다. 이렇게 설정하는 방법은 컬럼을 하나 더 만들어서 공지글에는 '1' 값을 넣고 나머지글에는 '0'값을 넣어 그 컬럼을 오름차순으로 정렬하면 '1'값인 공지는 항상 상단에 고정 되어 있고, 나머지 추가되는 글은 '0' 값이므로 항상 공지글 밑에 no컬럼의 순서대로만 정렬이 된다. 리스트에서 대표이미지 하나만 보이게 하는 것(WHERE 이미지 = 1 아니면 0) 비밀글 설정(WHERE 비밀글 = 1 아니면 0)도 마찬가지로 컬럼을 추가해서 쿼리문을 쓰면 된다.

공지사항

공지사항 스키마

-- 공지사항 스키마

-- 1. 제거 - drop table, drop sequence
DROP TABLE notice CASCADE CONSTRAINTS;

DROP SEQUENCE notice_seq;

-- 2. 생성 - create table, create sequence
CREATE TABLE notice (
    no NUMBER PRIMARY KEY,
    title VARCHAR2(300) NOT NULL,
    content VARCHAR2(2000) NOT NULL,
    startDate DATE DEFAULT SYSDATE,
    endDate DATE DEFAULT '9999-12-30',
    writeDate DATE DEFAULT SYSDATE,
    updateDate DATE DEFAULT SYSDATE
);

CREATE SEQUENCE notice_seq;

-- 3. 샘플데이터
-- 현재 진행중인 공지
INSERT INTO notice (no, title, content, startDate, endDate)
values (notice_seq.nextval, '현재공지제목1', '현재공지내용1', '2022-12-19', '2023-01-18');
-- 예약 공지(관리자에게만 보여야함)
INSERT INTO notice (no, title, content, startDate, endDate)
values (notice_seq.nextval, '예약공지제목2', '예약공지내용2', '2023-01-01', '2023-04-14');
-- 지난 공지
INSERT INTO notice (no, title, content, startDate, endDate)
values (notice_seq.nextval, '지난공지제목3', '지난공지내용3', '2022-11-18', '2022-11-25');
COMMIT;

-- 4. 확인
SELECT * FROM notice;

공지사항 운영쿼리

-- 공지사항 운영 쿼리
-- 1. 리스트(모든공지) / 지난공지 / 현재공지 / 예약공지
SELECT no, title, startDate, endDate, updateDate
from notice
order by no desc;

-- 2. 보기
SELECT no, title, content, startDate, endDate, updateDate
from notice
where no = 3;

-- 3. 등록
INSERT INTO notice (no, title, content, startDate, endDate)
VALUES (notice_seq.nextval, '새로운공지', '새로운내용', '2022-12-19', '2022-12-30');
COMMIT;

-- 4. 수정
UPDATE notice SET title='수정공지', content='수정내용', startDate='2022-12-20', endDate='2023-01-01'
where no = 2;
commit;

-- 5. 삭제
delete from notice
where no = 2;
rollback;
commit;

과제

  • 오라클 11g XE를 집에서 설치하고 게시판 스키마와 운영쿼리 작성 ✔

0개의 댓글