[인공지능사관학교: 자연어분석A반] Node.js (9) / 시험 / DB 특강

Suhyeon Lee·2025년 9월 10일

목차

Ⅰ. 오전 수업
	A. 1교시
		1. 지난 시간 복습
		2. 로그인 구현
	B. 2교시
		1. 로그인 구현(cont.)
	C. 3교시
		1. 탈퇴 로직 보완

Ⅱ. 오후 수업
	4-6교시 시험

Ⅲ. CAREER UP
	DB 특강

Ⅳ. 하루 돌아보기




Ⅰ. 오전 수업

A. 1교시

1. 지난 시간 복습

  • Overview
    • router 분리
      • 화면 관리(페이지를 돌려주는 역할 담당): pageRouter.js
      • DB 통신: dbRouter.js
    • join.html
      • 프론트에서 바로 DB로 값을 넘기는 거 아님 → 반드시 node 서버를 거쳐서 연결되어야 함!
  • 'DB 서버(MySQL) - Express node 서버' 통신
    • post로 받아온 데이터를 DB에 넣는 로직
    • app.js에 post 통신 데이터 처리하는 걸 넣어놓았기 때문에 dbRouter에서 그냥 바로 데이터 받아서 사용하면 됨
      • console.log(req.body);
      • let {id,pw,nick} = req.body;: 객체 비구조화(구조분해) 할당(destructuring assignment)
    • DB 연결 프로세스 3가지
      • DB SQL문 작성
      • 값이 필요한 경우 JS의 값 + SQL 합치기
      • 연결 정보를 가지고 SQL문 실행

DB 연결할 때 위에서 소개한 프로세스만 있는 건 아님! 더 간단한 방법도 있고 더 권장되는 방법도 따로 있음(쿼리만 관리하는 파일을 만들어 쿼리문을 따로 관리하는 방식)

  • config 폴더
    • 설정 담닫
    • 데이터베이스 연결 정보, API 키, 환경 설정 등 다양한 설정을 모듈화하여 저장

TIP
모듈은 모두 exports 해주기
항상 '값'(e.g., conn, router, …)을 리턴하기: module.exports = conn

  • SQL문과 JS 데이터 합치기
    • 반드시 "배열"로 값을 넣어줘야 함: [id, pw, nick]
  • SQL문 실행
    • 값을 받아 올 변수 두 가지 필수: err, rows
    • rows.affectedRows의 값에 따른 조건문
  • redirect vs. sendFile
    • sendFile은 경로가 변하지 않기 때문에 여기서 쓰면 절대 안 됨
    • 파일명을 노출시키는 행위는 지양 → 경로 이동을 활용하자!
      • 기본 수준의 보안(표준 보안)이니 꼭 지켜주기

비구조화 할당(Destructuring Assignment) = 구조 분해 할당
배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 할당하는 JavaScript 표현식(expression)입니다. 이 기능을 통해 필요한 값을 구조에서 쉽게 추출하고 변수에 할당할 수 있으며, 코드의 가독성을 높이고 라인 수를 줄여 유지보수를 용이하게 하는 데 사용됩니다.
간단하게 정리하면 배열 [], 혹은 객체 {} 안의 값을 편하게 꺼내 쓸 수 있는 문법입니다.

  • 주요 특징
    • 배열 비구조화: 배열의 요소들을 순서대로 변수에 할당합니다.
      • const [a, b] = [1, 2]; // a는 1, b는 2가 됩니다
    • 객체 비구조화: 객체의 프로퍼티 이름과 동일한 변수에 해당 값을 할당합니다.
      • const { x, y } = { x: 1, y: 2 }; // x는 1, y는 2가 됩니다
    • 코드 간결성: 여러 값을 한 번에 할당할 수 있어 코드를 간결하게 만듭니다.
    • 가독성 향상: 변수 이름을 명확하게 사용하여 코드의 의도를 더 쉽게 파악할 수 있게 합니다.
  • 예시
    var [a1, a2, ...rest_a] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    console.log(a1); // 1
    console.log(a2); // 2
    console.log(rest_a); // [3, 4, 5, 6, 7, 8, 9]
    • 전개 연산자( ... )를 사용하여 좌항에서 명시적으로 할당되지 않은 나머지 배열 값들을 사용할 수 있고 var, let, const를 사용해 변수들의 유효 범위를 명시적으로 선언할 수 있습니다.

2. 로그인 구현

  1. app.js → pageRouter.js → main.html
    • a 태그로 로그인 경로 만들기
  2. app.js → pageRouter.js
    • 로그인 페이지 처리 로직 만들기
  3. public 폴더 → login.html 생성
    • form 태그
      • 로그인은 보안이 중요하니까 post로 데이터 보내기
      • post 형식 → body-parser, req.body 연상하기!
      • 의미가 같은 태그끼리는 동일한 name을 사용하는 게 효율적 → join, login 모두 똑같은 DB에 있는 똑같은 id,pw이기 때문에 동일한 이름을 쓰자! (같은 친구는 이름 통일해주기)
    • 최종 뼈대
  4. app.js → dbRouter.js
    • '/login' 받는 로직 뼈대 만들기
      • 한글로 로직 먼저 적고 코드로 구현하는 걸 추천: 값 받고, sql문 만들고, db랑 연결해서 쿼리문 보내고, 결과 받아서 사용자에게 돌려주기

대부분의 코드는 마지막 지점이 핵심 포인트: 우리는 dbRouter.js가 핵심!


B. 2교시

1. 로그인 구현 (cont.)

  • SQL문 작성
    • let sql = "select * from member where id=? and pw=?";
  • JS의 값 + SQL 합치기
    • 응답 결과
      • 실제 회원 정보를 리턴 → 타입: 배열
      • 네모 친 건 회원 가입: rows 출력 비교용
  • 연결 정보를 가지고 SQL문 실행
    • 조건문: rows의 길이를 활용
      • 회원 가입에서는 affectedRows 활용했었음
      • 길이(rows.length) 아니고 rows로 하면? 항상 참인 조건문이 되어버려서 안 됨(회원 조회 안 될 때는 빈 배열을 돌려주기 때문)
    • 로직 작동 확인

2. 회원 정보 수정 & 회원 탈퇴

  1. main.html
  2. public 폴더
    • update.html: 닉네임 수정 가능한 페이지
    • delete.html: 회원 탈퇴 페이지
  3. routes
    • pageRouter.js
    • dbRouter.js

작업 순서

  1. pageRouter 연결하기
// 회원 정보 수정 페이지 처리 로직
router.get("/update",(req,res)=>{
    res.sendFile(filePath+"/update.html");
});

// 회원 정보 삭제 페이지 처리 로직
router.get("/delete",(req,res)=>{
    res.sendFile(filePath+"/delete.html");
});
  1. form 태그 action 경로 설정하기

    • update.html
      • action="http://localhost:3000/db/update"
    • delete.html
      • action="http://localhost:3000/db/delete"
  2. dbRouter 연결하기

// 회원 수정 로직
// * 팁 : DB에 값을 넘겨줄 때 넘겨주는 값의 순서를 반드시 체크하자(쿼리문 물음표 순서대로 넣기)
// * 팁 2: 값이 변화면 rows는 "영향"을 받는다 → 영향 받으면 메인으로, 아니면 업데이트로 이동
router.post("/update",(req,res)=>{
    let {id,pw,nick} = req.body;
    let sql = "update member set nick=? where id=? and pw=?;";
    conn.query(sql,[nick,id,pw],(err,rows)=>{
        console.log(rows);
        if(rows.affectedRows>0){
            res.redirect('/');
        }else{
            res.redirect("/update");
        };
    });
});

// 회원 탈퇴 로직
// 탈퇴가 되면 메인으로, 안 되면 탈퇴 페이지로 이동
router.post("/delete",(req,res)=>{
    let {id,pw} = req.body;
    let sql = "delete from member where id=? and pw=?;";
    conn.query(sql,[id,pw],(err,rows)=>{
        console.log(rows);
        if(rows.affectedRows>0){
            res.redirect('/');
        }else{
            res.redirect("/delete");
        };
    });
});

C. 3교시

1. 탈퇴 로직 보완

  • 탈퇴하기 전 정말 탈퇴하겠는지 묻는 내용 넣기
  1. delete.html
  2. pageRouter.js
  3. dbRouter.js
  4. 수정해야 할 내용 찾기
  • 사용자의 상태가 바뀌었으니 alert 넣어줘야 함 → DB에 변화가 발생하면 == 사용자의 상태가 바뀌면 alert을 보내는 게 권장 사항임
    • alert 보내는 걸 구현하려면 서버 쪽에서 입력해야 하고 정석 로직은 좀 복잡하다고 함 (함수를 여러 개 불러야 한다고 함)
  • 회원 탈퇴를 다시 한번 묻는 로직이 필요함: confirm 함수
  1. confirm 함수 구현 → delete.html에 이벤트 객체 만들기
    • form 태그 기본 이벤트: 버튼이나 submit을 누르면 데이터 즉시 전송
    • 할 일: 사용자에게 확인 작업 진행 → 동의를 하면 삭제 → 취소를 하면 전송 X
    • 이벤트 구현을 위해 잠시 action 경로 바꿔두기
      • 이벤트 객체 e: event의 e임
      • console.log(e) 결과는 아래와 같음 → 어떤 이벤트인지 확인 가능!
    • 원래 가지고 있던 고유 이벤트를 막겠다: e.preventDefault();
      • 다시 action 경로를 원래대로 돌리고 실행해보면 submit이 작동하지 않는 걸 확인할 수 있음
    • 최종
      • 사용자가 확인을 누르면(choice=true) if문 작동하지 않음: !choice는 false니까 → submit 진행되고 dbRouter 동작해 db에서 삭제 진행한 뒤 메인 페이지로 이동함
      • 사용자가 취소를 누르면(choice=false) if문 작동 → 작성한 내용이 제출되지 않고 멈춤(e.preventDefault();) → delete 페이지에 그대로 머물러 있음

인라인 방식으로 써도 OK

  • 내일부터는 동적 페이지 생성 → SSR(Server-Side Rendering)
    • 동적 페이지 예시
      • 사용자가 보는 페이지를 다 다르게 만들자! → views 폴더 사용
  • 프로젝트 파일 코드 공유 팁
    • vscode explorer로 drag&drop
      • copy folder 선택
    • terminal에서 npm i
      • package.json에 적혀 있는 모듈들을 다운로드하겠다는 의미

alert를 구현해보고 싶어서

router.post("/update",(req,res)=>{
    let {id,pw,nick} = req.body;
    let sql = "update member set nick=? where id=? and pw=?;";
    conn.query(sql,[nick,id,pw],(err,rows)=>{
        console.log(rows);
        if(rows.affectedRows>0){
            res.send("<script>alert('수정이 완료되었습니다!')</script>");
            res.redirect('/');
        }else{
            res.redirect("/update");
        };
    });
});

이렇게 했더니 alert만 뜨고 경로 이동이 안 되서 찾아봤음:

  • res.send()와 res.redirect()를 한 요청에서 동시에 호출하면 첫 번째 응답만 전송되고, 두 번째는 무시
    • 한 번의 요청에 대해 클라이언트로 응답을 “한 번만” 보낼 수 있기 때문
  • Express 공식문서에는 응답 객체가 end/send/redirect 중 하나로만 한 번 종료되어야 함이 명시되어 있음
    • alert를 보내면서 리다이렉트 하려면, 한 가지 방법만 선택해야 함
    • 서버에서 직접 alert와 리다이렉트를 동시에 처리하려면 클라이언트 측 자바스크립트를 사용하는 것이 일반적
      • res.send("<script>alert('수정이 완료되었습니다!'); location.href='/'</script>");
  • 요약
    • 한 번에 res.send 혹은 res.redirect 둘 중 하나만 사용할 수 있음
    • 경고창 + 리다이렉트가 모두 필요하다면 <script> 방식으로 처리



Ⅱ. 오후 수업

4-6교시 시험





Ⅲ. CAREER UP

DB 특강

복습

  • SELECT 문
    • SQL 순서에 따른 실행 원리
      • FROM 뒤에는 테이블만~

DDL

  1. DDL이란?
  2. 테이블의 자료형
  3. 테이블 생성하기
  4. 테이블 삭제하기

DDL(Data Definition Language)

  • 데이터 정의어
  • 테이블과 같은 데이터 저장소 객체(저장 공간)의 생성/수정/삭제
    • CREATE : 새로운 저장소 객체를 생성
    • ALTER : 테이블을 컬럼(열) 단위로 수정
    • DROP : 테이블 객체와 데이터까지 전부 삭제
    • RENAME : 컬럼의 이름을 변경
    • TRUNCATE : 테이블 내부 데이터와 저장 공간 까지만 삭제

오늘 수업에서는 CREATE, ALTER, DROP만 다룸

테이블의 자료형

  • 자료형 = DATA TYPE = 데이터를 저장하는 형식
  • 자료형을 지정하는 이유?
    • 효과적인 저장을 위해
    • 가장 큰 이유: 효율성!
      • 자료형에 따라서 테이블의 저장 공간을 효율적으로 관리할 수 있고, 연산을 위한 알고리즘도 최적화할 수 있다.
      • 예: 2+3 계산 → 2가 문자인지 숫자인지 날짜인지 확인해야 함 → 비효율
  • 테이블을 생성하는데 필요한 자료형
    • VARCHAR2(n)
      • 문자형 데이터 타입 (CHAR, NCHAR, LONG 등등...)
      • variable character
    • NUMBER(n , m)
      • 숫자형 데이터 타입 (FLOAT, BINARY_FLOAT 등등...)
    • DATE
      • 날짜형 데이터 타입 (TIMESTAMP)

TIP: 위 3개의 대표적인 자료형만 알아도 무난하게 사용 가능!

  • VARCHAR2(n)
    • VARCHAR2(n): 가변형 문자열 → 남는 칸은 다른 쪽에서 이용할 수 있게 넘겨줌
    • CHAR(n): 고정형 문자열 → 비어있는 칸 그대로 가지고 있음 → 비효율적
  • NUMBER
    • 요즘은 괄호 빼고 쓴다고 함
  • DATE
    • 날짜 값을 입력받음
    • TIMESTAMP라는 자료형도 존재
      • 둘 다 날짜 자료형이며 TIMESTAMP가 좀 더 구체적인 시간을 저장

테이블 생성하기

  • CREATE
    • 새로운 객체(OBJECT) 를 생성할 때 사용하는 명령어
      • 테이블 생성: CREATE TABLE ...
      • 사용자 계정 생성: CREATE USER ...
      • 시퀀스 생성: CREATE SEQUENCE ...
      • 뷰 생성: CREATE VIEW ...
  • 테이블 생성 문법 분석
    • CREATE TABLE 테이블명 ( 컬럼명 + 자료형 + DEFAULT로 지정할 값 + 제약조건);
      • DEFAULT로 지정할 값, 제약조건은 생략 가능
-- oracle
CREATE TABLE QUIZ_TABLE(
Q_ID NUMBER(3,0) NOT NULL
, Q_CONTENT VARCHAR2(200) NOT NULL
, Q_ANSWER VARCHAR(100)
, REG_DATE DATE DEFAULT SYSDATE
, Q_BINGO VARCHAR(100) DEFAULT ‘O’
);

--MySQL
CREATE TABLE QUIZ_TABLE (
  Q_ID INT NOT NULL
  , Q_CONTENT VARCHAR(200) NOT NULL
  , Q_ANSWER VARCHAR(100)
  , REG_DATE DATETIME DEFAULT CURRENT_TIMESTAMP
  , Q_BINGO VARCHAR(100) DEFAULT 'O'
);
  • 기본
  • 옵션
    • SYSDATE: 시스템의 현재 시간
  • 첫 시간에 생성했던 직원 테이블 DDL
    • 테이블 생성 정보 조회 : SHIFT + F4
  • 테이블 생성 시 테이블 이름 규칙
    1. 대소문자 구분 X → 대문자로 변형
      • create table aAa .. => AAA 테이블생성
    2. 테이블 명 중복 불가
      • create table AAA ... => 에러! 기존 객체가 있습니다.
    3. 한 테이블 내에서 중복되는 컬럼 명 사용 불가
    4. 문자로 시작해야 하며, 예약어 사용 불가
      • 테이블 이름으로 사용 가능한 문자 : a-z , A-Z , 0-9 , ᄀ-ᄒ
      • 특수문자는 _ , $ , # 만 사용가능

테이블 삭제하기

  • DROP
    • 테이블 및 제약조건을 삭제할 때 사용하는 명령어
      • 테이블을 삭제: DROP TABLE ..
      • 테이블의 제약조건까지 함께 삭제: DROP TABLE .. CASCADE CONSTRAINTS
  • DROP TABLE 테이블명 [ CASCADE CONSTRAINTS ]
    • 테이블 영구 삭제 CASCADE CONSTRAINTS 옵션을 추가하면 관련 관계선(FK)도 모두 삭제 가능

제약조건(CONSTRAINTS)

  • 테이블에 입력 가능한 데이터를 조건으로 제약하는 것
    • NOT NULL
    • UNIQUE KEY (UK)
    • CHECK
    • ★ PRIMARY KEY (PK) ★
    • ★ FOREIGN KEY (FK) ★
  • NOT NULL
    • 컬럼이 비어있거나 NULL 값이 들어오지 않도록 하는 조건
    • 정보가 꼭 필요한 컬럼에 사용
      • 예: 직원 테이블의 사원 이름
    • 문법
      • 이미 만들어져 있는 테이블에 제약조건 걸기: ALTER TABLE 테이블명 MODIFY COLUMN 컬럼명 + 자료형 + NOT NULL ;
      • 테이블을 만들면서 처음부터 제약조건 걸기: CREATE TABLE 테이블명 ( 컬럼명 + 자료형 + NOT NULL );
    • 예시
-- Oracle
ALTER TABLE QUIZ_TABLE MODIFY COLUMN Q_ANSWER VARCHAR(100) NOT NULL ;

CREATE TABLE QUIZ_TABLE(
Q_ID NUMBER(3, 0) PRIMARY KEY ,
Q_CONTENT VARCHAR2(200) UNIQUE ,
Q_ANSWER VARCHAR(100) NOT NULL,
REG_DATE DATE DEFAULT SYSDATE ,
Q_BINGO VARCHAR(100) DEFAULT ‘O’
) ;
  • UNIQUE KEY(UK) : UNIQUE
    • 하나의 컬럼에 중복되는 튜플이 존재할 수 없도록 하는 조건
    • 문법
      • ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 UNIQUE ( 컬럼 ) ;
      • CREATE TABLE 테이블명 ( 컬럼명 + 자료형 + UNIQUE )
    • 예시
-- Oracle
ALTER TABLE QUIZ_TABLE ADD CONSTRAINT UK_QUIZ_TABLE UNIQUE(Q_CONTENT) ;

CREATE TABLE QUIZ_TABLE(
Q_ID NUMBER(3, 0) PRIMARY KEY ,
Q_CONTENT VARCHAR2(200) UNIQUE ,
Q_ANSWER VARCHAR(100) NOT NULL,
REG_DATE DATE DEFAULT SYSDATE ,
Q_BINGO VARCHAR(100) DEFAULT ‘O’
) ;
  • CHECK
    • 특정 컬럼에 데이터를 입력할 때 조건에 해당하는 데이터만 입력할 수 있도록 제약
      • 일관되게 데이터를 넣고 싶을 때 주로 사용
    • CHECK 조건에 만족하는 정보만 튜플에 입력 가능
      • 예) 성별, O/X 퀴즈 결과, 학점 등
    • 문법
      • ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 CHECK ( 조건 OR 범위 ) ;
      • CONSTRAINT 제약조건이름 CHECK ( 조건 OR 범위 );
-- Oracle
ALTER TABLE QUIZ_TABLE ADD CONSTRAINT Q_BINGO_CK CHECK (Q_BINGO IN (‘O’, ‘X’) ) ;

CREATE TABLE QUIZ_TABLE(
Q_ID NUMBER(3, 0) PRIMARY KEY ,
Q_CONTENT VARCHAR2(200) UNIQUE ,
Q_ANSWER VARCHAR(100) NOT NULL,
REG_DATE DATE DEFAULT SYSDATE ,
Q_BINGO VARCHAR(100) DEFAULT ‘O’
CONSTRAINT Q_BINGO_CK CHECK (Q_BINGO IN(‘O’, ‘X’) )
) ;

새로운 휴대폰을 맞추려고 방문한 휴대폰 매장에서는 내 정보를 어떻게 찾을까? → 핸드폰 번호
라일락 회사의 ‘이지은’ 사원의 연봉 정보를 찾으려면 어떤 정보를 기준으로 찾을까? → 사번
한국대학교의 ‘김민수’ 학생을 찾기 위해서는 DB의 어떤 컬럼을 기준으로 찾을까? → 학번

  • PRIMARY KEY (PK) : NOT NULL + UNIQUE ★★★
    • 식별자 규칙을 물리적 모델링 한 것
    • 기본 키, 주 키, 프라이머리 키라고도 부름
    • 보통 튜플(행)이 지닌 유일하고 고유한 특징인 컬럼을 PK로 지정
    • NULL값 입력 불가, 중복 불가의 특징
    • 특정 컬럼을 식별자로 만들면 자동으로 NOT NULL + UNIQUE 성질을 가짐
    • 문법
      • ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 PRIMARY KEY ( 컬럼 ) ;
      • CREATE TABLE 테이블명 ( 컬럼명 + 자료형 + PRIMARY KEY );
-- Oracle
ALTER TABLE QUIZ_TABLE ADD CONSTRAINT PK_QUIZ_TABLE PRIMARY KEY(Q_ID);
-- 이제 QUIZ_TABLE의 Q_ID에는
중복 값과 NULL 값 입력 불가!

CREATE TABLE QUIZ_TABLE(
Q_ID NUMBER(3, 0) PRIMARY KEY ,
Q_CONTENT VARCHAR2(200) UNIQUE ,
Q_ANSWER VARCHAR(100) NOT NULL,
REG_DATE DATE DEFAULT SYSDATE ,
Q_BINGO VARCHAR(100) DEFAULT ‘O’
) ;
  • FOREIGN KEY (FK)

    • 다른 테이블에 있는 기본 키(PRIMARY KEY)를 참조하는 컬럼을 외래 키(FK, FOREIGN KEY)로 지정

    • 데이터 무결성을 지원

    • 참조하는 테이블의 기본 키 값과 반드시 동일한 값으로 구성되어야 함

      • 예시
      • A 테이블: 부모 테이블 → PK 존재
      • B 테이블: 자식 테이블 → FK 존재
    • 문법

      -- 1
      ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명
      FOREIGN KEY ( 참조받을 컬럼 ) REFERENCES 참조할 테이블(참조할 컬럼) ;
      
      -- 2
      CREATE TABLE 테이블명 ( 생성할 컬럼 정보 , CONSTRAINT 제약조건명
      FOREIGN KEY (참조받을 컬럼) REFERENCES 참조할 테이블(참조할 컬럼) ) ;
    • 예시

-- Oracle
ALTER TABLE QUIZ_TABLE2 ADD CONSTRAINT TABLE1_TABLE_2_FK
FOREIGN KEY(Q_ID) REFERENCES QUIZ_TABLE (Q_ID) ;

CREATE TABLE QUIZ_TABLE2 (
Q_ID NUMBER(3,0) ,
Q_REAL VARCHAR2(200) ,
CONSTRAINT TABLE1_TABLE2_FK FOREIGN KEY (Q_ID)
REFERENCES QUIZ_TABLE (Q_ID)
) ;

DML

  1. DML이란?
  2. DML 문법
  3. DML 실습

DML(Data Manipulation Language)

  • 데이터 조작어
  • 테이블에 원하는 데이터를 입력/수정/삭제하는 역할
    • INSERT : 테이블에 새로운 데이터를 입력
    • UPDATE : 테이블에 있는 기존 데이터를 새로운 내용으로 수정
    • DELETE : 테이블에 있는 기존 데이터를 삭제
    • SELECT : 테이블에 있는 데이터를 조회

DML 문법: INSERT

  • 테이블에 새로운 데이터를 튜플(행) 단위로 입력
    • INSERT INTO … VALUES …
      • INSERT INTO 테이블명 ( COLUMN_LIST ) VALUES ( COLUMN_LIST에 입력할 값 리스트);
    • 예시
      • INSERT INTO 수강생정보 (학생ID, 학생이름, 소속반) VALUES ('S0088', '김민수', 'H')
  • INSERT 사용 시 주의사항
    1. 식별자(Primary Key)에 NULL값이나 중복 값 입력 불가
      • 식별자(PRIMARY KEY)는 NOT NULL과 중복 입력 불가의 특징을 가지고 있다.
    2. 입력 값이 컬럼의 기존 자료형과 일치해야 함
    3. 소괄호 및 COMMA 사용 주의
    4. INSERT 문에 언급하지 않은 컬럼 정보는 NULL값 자동 입력
      • 테이블의 사각형 형태를 유지하기 위함
    5. COLUMN_LIST 의 개수와 COLUMN_LIST에 입력할 값 리스트의 개수가 같아야 함
    6. 테이블의 컬럼 정보를 모두 일치시키면 COLUMN_LIST를 쓰지 않아도 실행 가능

DML 문법: UPDATE

  • 테이블에 있는 기존 데이터를 새로운 내용으로 수정
  • 문법
    • UPDATE … SET … WHERE …
      • UPDATE 테이블명 SET 바꿀컬럼 = 바꿀값 WHERE 바꾸고싶은행조건;
  • 주의사항
    1. WHERE의 조건에 해당하는 튜플이 없으면 정확한 수정 불가
    2. WHERE문을 입력하지 않으면 모든 행의 데이터 전체 수정
  • WHERE 절에 바꾸고 싶은 행의 조건을 입력할 수 있으며, 따로 입력하지 않으면 모든 행의 데이터가 변경되어 버리므로 주의!
  • 여러 컬럼의 값을 동시에 수정할 수 있으며, WHERE의 조건에 해당하는 튜플이 없으면 정확한 수정 불가

DML 문법: DELETE

  • 테이블에 있는 기존 데이터를 튜플(행) 단위로 삭제
  • 문법
    • DELETE FROM … WHERE …
      • DELETE FROM 테이블명 WHERE 삭제하고 싶은 행조건 ;
  • 주의 사항
    1. 자식 테이블이 존재하는 식별자(PRIMARY KEY) 컬럼은 단순한 삭제 불가능
    2. 다중 행 삭제가 가능하므로 WHERE 문에 정확한 조건 입력
  • 예시
    • WHERE 뒤에 삭제할 행의 조건 지정 WHERE문을 쓰지 않으면 모든 행 삭제
    • COMMIT 전에는 데이터 원상복구 가능
      (이 부분은 TCL에서 자세히)

DML 실습

주의: 각 문제를 잘 풀었다면, COMMIT; 명령어 실행
그래야 테이블에 수정된 내용이 제대로 반영됨
만약 내용 수정에 실수하였다면 ROLLBACK; 명령어 실행
사용하면 최근에 사용한 COMMIT 명령어 이전으로 복구 가능

  1. 오늘 새로운 직원이 입사하였습니다. 아래 데이터를 확인하여 직원 테이블에 정보를 입력해주세요.
자바에서 넘어온 데이터
(입력되지 않은 성별 컬럼의 경우 NULL 값이 들어가도록 해주세요.)

직원ID : 'A1000'
패스워드 : 'hello1000'
이름 : '신캐릭'
나이 : 29
입사일시 : 현재시점을 넣을 수 있게 SYSDATE 로 값 대입
주민등록번호 : '950120-1566221'
연봉 : 3500
부서id : 'D006'
  1. 위에서 입력한 'A1000' 직원의 정보를 수정해주세요.
【수정할 데이터】

성별 : '남'
부서ID : 'D005'
패스워드 : 'hello1000!!!'
  1. 위에서 입력한 'A1000' 직원이 오늘 퇴사를 하였습니다. 해당 직원정보를 직원 테이블에서 삭제(DELETE) 해주세요.

  2. 퇴사한 A1000 대신에 새로운 직원이 입사를 하였습니다. 이번에는 직원정보와 함께 연락처 정보와 주소 정보가 함께 들어왔습니다. 반드시 아래의 순서로 데이터를 INSERT 해주세요.
    (1)직원 테이블 -> (2)직원연락처 테이블 -> (3)직원주소 테이블

직원ID : 'A2000'
패스워드 : 'hello222'
이름 : '이홍시'
나이 : 40
입사일시 : 현재시점을 넣을 수 있게 SYSDATE 로 값을 넣어주세요.
주민등록번호 : '830220-1566221'
연봉 : 5600
부서id : 'D006'
핸드폰번호 : '010-5959-1111'
집주소 : '운천로 123'

TIP: 결과적으로 3개의 테이블에 한 행씩 입력되어야 합니다.
3개의 테이블에 데이터가 모두 입력되면 COMMIT; 를 해주세요.
힌트: 핸드폰번호는 구분코드를 '휴대폰' 으로 입력
집주소는 구분코드를 '집' 으로 입력
  1. 2023년을 맞이해 성적표 테이블의 모든 데이터를 초기화하려고 합니다.
    성적표 테이블의 모든 데이터를 삭제해주세요.

  2. 직원ID가 'A2000' 인 직원의 집전화 번호는 '062-123-1111' 입니다.
    이 데이터를 직원연락처 테이블에 입력해주세요.

  3. 직원 'A2000' 이 가지고 있는 휴대폰 연락처는 '010-5959-1111' 입니다.
    그런데 이번에 휴대폰을 바꿔서 번호가 '010-3333-5959' 로 변경이 되었습니다.
    변경된 핸드폰 번호가 반영되도록 휴대폰 연락처를 수정해주세요.

  4. 직원 테이블에서 직원ID 가 'A0011' 인 대상을 삭제해주세요

  5. 수강생 S0001 이 최근 시험에서 국어 , 수학 , 영어 점수를 각각 90 , 85 , 70 점
    맞았습니다.
    이 정보를 성적표 테이블에 INSERT 해주세요.

예) 학생ID는 문자형 , 과목은 문자형 , 성적은 숫자형 컬럼입니다.
S0001 국어 90
S0001 수학 85
S0001 영어 70
  1. 수강생 S0001 이 본 시험에서 영어 과목에 문제가 생겨 처리 결과, 70 점에서 80 점으로 점수가 상승했습니다. 이를 반영하기 위해 S0001 학생의 영어 성적을 80으로 변경해주세요.




하루 돌아보기

👍 잘한 점

  • 수업 참여 열심히 했음
  • 시험도 잘 본듯?
  • 공모전 준비
  • 해커톤 준비
    • 오늘 해야할 일 다 했다!

👎 아쉬웠던 점

  • 리눅스 공부 시간을 못 빼고 있음

🔬 개선점

  • 자기 전까지 리눅스 시험 공부하기
profile
2 B R 0 2 B

0개의 댓글