[새싹 x 코딩온] 웹 풀스택 영등포 5기 6주차 회고 - 1

용가리🐉·2023년 11월 22일
0
post-thumbnail

📌 body-parser

데이터를 쉽게 처리할 수 있도록 도와주는 라이브러리
이전 글에서의 body-parser

  • POST로 정보를 전송할 때 요청의 body(req.body)로 받을 수 있게 도와 줌
  • express 4.x부터 body-parser가 내장되어 있어 별도의 설치 필요 X
  • 멀티파트(이미지, 동영상, 파일 등) 데이터 처리 Xmulter 사용
// app.js에서 body-parser 설정
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

📌 multer

📣 파일 업로드

  • 클라이언트에서 서버로 데이터 전송하는 방법 : 텍스트, 파일
<input type="file" name="userfile"/>
<!-- { userfile: 'img2.png', title: '이미지' } -->

📣 multer 미들웨어

파일 업로드를 위해 사용되는 미들웨어

  • express 서버를 구축할 때 가장 많이 사용되는 미들웨어
// multer 설치
npm install multer

// app.js에 multer 불러오기
const multer = require('multer');

📣 클라이언트 준비

  • form 태그의 enctype 속성으로 "multipart/form-data" 반드시 설정

📣 파일 업로드 경로 설정

  • dest : 파일을 업로드하고 서버 측에서 그 파일이 저장될 경로를 지정하는 속성
// app.js
const multer = require('multer');
const upload = multer({
  dest: 'uploads/',
});

📣 multer - 하나의 파일 업로드

  • single() : 하나의 파일 업로드
// app.js
const multer = require('multer');
const upload = multer({
  dest: 'uploads/',
});

app.post('/upload', upload.single('userfile'), function (req, res) {
  console.log(req.file); // req.file : 파일 업로드 성공 결과 (파일 정보)
  console.log(req.body); // req.body : title 데이터 정보 확인 가능
  res.send('Upload!!');
});
  • uploads/ 폴더가 새로 생김을 확인할 수 있음!
  • 터미널에서 req.file 객체와 req.body 객체 확인 가능

📣 multer 세부 설정

  • 앞서 지정한 경로를 제외하고, 파일명, 파일 크기 등 직접 지정 및 제어 가능

  • storage : 저장할 공간에 대한 정보
    -diskStorage : 파일을 디스크에 저장하기 위한 모든 제어 기능을 제공

    • destination : 저장할 경로
    • filename : 파일명
  • limits : 파일 제한

    • fileSize : 파일 사이즈 제한
// app.js
const uploadDetail = multer({
  storage: multer.diskStorage({
    destination(req, file, done) {
      done(null, 'uploads/'); // 파일 업로드 경로 설정
    },
    filename(req, file, done) {
      const ext = path.extname(file.originalname); // 확장자 추출
      done(null, path.basename(file.originalname, ext) + Date.now() + ext);
    },
  }),
  limits: { fileSize: 5 * 1024 * 1024 },
})

📣 multer - 여러 파일 업로드

🟠 방법 1

  • array() : 여러 파일을 업로드할 때 사용, 하나의 요청 안에 여러 개의 파일이 존재할 때
// app.js
app.post('/upload/array', uploadDetail.array('userfiles'), function (req, res) {
  console.log(req.files); // req.files : [ {}, {}, {}, ... ] 배열 형태로 각 파일 정보 저장
  console.log(req.body); // req.body : title 데이터 정보 확인 가능
  res.send('Upload Multiple Each!!');
});

🟠 방법 2

  • fields() : 여러 파일을 업로드할 때 사용, 하나의 요청이 아닌 여러 개의 요청이 들어올 때
// app.js
app.post(
  '/upload/fields', 
  uploadDetail.fields([{ name:   'userfile1'}, { name : 'userfile2' }]), 
  function (req, res) {
   console.log(req.files); // req.files : [ {}, {}, {}, ... ] 배열 형태로 각 파일 정보 저장
   console.log(req.body); // req.body : title 데이터 정보 확인 가능
   res.send('Upload Multiple Each!!');
});

📌 Database

다양한 카테고리 정보를 저장할 수 있는 구조
여러 사람에 의해 공유되어 사용될 목적으로 통합하여 관리하는 데이터의 집합
→ 데이터를 저장하는 구조/자료의 모음

파일 시스템 VS 데이터베이스

  • 파일 시스템 : 데이터를 기록하고 여러 사람이 공유하여 사용 가능 (ex. 엑셀로 데이터 관리)
    • 여러 사람이 공유하여 사용하기에는 데이터 중복, 불일치, 유지 보수 등의 문제
  • 데이터베이스 : 파일 시스템의 단점을 개선하기 위해 등장

📣 DBMS

  • DataBase Management System
  • 파일 시스템이 가진 문제를 해결하기 위해 만들어진 것
  • 데이터베이스에 접근하고 이를 관리하기 위해 존재 → 사용자와 데이터베이스를 연결시켜주는 소프트웨어 (데이터베이스 사용자가 데이터베이스를 생성, 공유, 관리할 수 있도록 함)

관계형 데이터베이스(RDBMS) : DBMS에 관계가 추가된 것

  • Oracle, SQL Server, DB2, MYSQL, PostgreSQL, SQLite

📌 Database 용어

📣 데이터베이스 구조

  • 열(Column, Attribute, 속성)
  • 행(Record, Tuple, 튜플)
  • 테이블(Table, Relation)

📣 키 (Key)

  • 무언가를 식별하는 역할
  • 관계 데이터베이스에서 Key는 특정 튜플을 식별할 때 사용하는 속성 or 속성의 집합
  • 테이블 간 관계를 맺는 데도 사용함

🟠 기본키(Priamry Key, PK)

여러 후보 속성 중 하나를 선택하여 테이블을 대표하는 속성 → 테이블 당 하나의 필드에만 적용 가능

  • 기본키가 가능한 후보가 하나인 경우, 해당 키 사용
  • 기본키가 가능한 속성이 여러 개라면, 테이블 특성을 반영하여 하나 선택

선정 시 고려사항

  • 테이블 내 튜플을 식별할 수 있는 고유한 속성을 가져야 함 → 중복 값 불가
  • NULL 값 X
  • 키 값의 변동이 일어나지 않아야 함
  • 최대한 적은 수의 속성을 가진 것이어야 함
  • 향후 키를 사용하는데 문제 발생 소지가 없어야 함

🟠 외래키(Foreign Key, FK)

다른 테이블의 기본키를 참조하는 속성

  • 참조하고(외래키) 참조되는(기본키) 양쪽 테이블 도메인이 서로 같아야 함
    • 도메인 : 속성이 가질 수 있는 값의 집합
  • 참조되는(기본키) 값이 변경되 경우, 참조하는(외래키) 값도 변경됨
  • NULL 값, 중복 값 허용
  • 자기 자신의 기본키르 참조하는 외래키 가능

MySQL

  • 가장 널리 사용되고 있는 RDBMS(관계형 데이터베이스 관리 시스템)
  • 오픈소스
  • 윈도우, Mac, 리눅스 등 다양한 운영체제에서 사용 가능

📌 SQL

구조적 쿼리 언어 (Structured Query Language)

  • 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어
  • 실행 순서가 없는 비절차적인 언어

📣 데이터 정의어(DDL, Data Definition Language)

🟠 CREATE 문

  • 데이터베이스와 테이블을 생성하는 명령어
  • 테이블 이름, 열 이름, 데이터 형식 등을 지정
  • 기본키, 외래키 정의
# 데이터베이스 생성 + 한글 인코딩
CREATE DATABASE 이름 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

# 테이블 생성
CREATE TABLE 테이블명 (
	속성이름1 데이터타입 PRIMARY KEY,
    속성이름2 데이터타입,
    [FOREIGN KEY 속성이름 REFERENCES 테이블이름(속성이름)]
);

데이터 타입

  • 숫자형 : TINYINT, SMALLINT, INT, BIGINT, FLOAT
  • 문자형 : CHAR(N), VARCHAR(N), TEXT, MEDIUMTEXT
  • 날짜형 : DATE, TIME, DATETIME

🟠 ALTER 문

  • 생성된 테이블의 속성과 속성에 대한 제약 및 기본키, 외래키 변경
ALTER TABLE 테이블명 ADD 속성이름 데이터타입; # 속성 새로 추가하는 경우
ALTER TABLE 테이블명 DROP COLUMN 속성이름; # 기존 속성 삭제하는 경우
ALTER TABLE 테이블명 MODIFY 속성이름 데이터타입; # 기존 속성 수정하는 경우

🟠 DROP 문

  • 생성된 테이블 삭제
  • 테이블 구조와 데이터 모두 삭제
DROP TABLE 테이블이름;

📣 데이터 조작어(DML, Data Manipulation Language)

데이터베이스의 내부 데이터를 관리하기 위한 언어

CRUD

  • 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 처리 기능
  • Create(생성) - INSERT
  • Read(읽기) - SELECT
  • Update(갱신) - UPDATE
  • Delete(삭제) - DELETE

🟠 SELECT 문

  • 데이터를 검색하는 기본 문장
  • 질의어(query)라고도 함
  • SQL 문 중 가장 많이 사용되는 문법
SELECT 속성이름, ...
	FROM 테이블 이름 
    [WHERE 검색조건]

🟠 WHERE 조건

기본적인 연산자는 생략

  • 비교 연산자

  • 부정 연산자 : ^=, <>(같지 않다)

  • 범위, 집합, 패턴, NULL

    • BETWEEN a AND b : a와 b의 값 사이에 있으면 참 (a, b 값도 포함)
    • IN (list) : 리스트에 있는 값 중에서 어느 하나라도 일치하면 참
    • LIKE '비교문자열' : 비교문자열과 형태가 일치하면 사용( %, _사용)
      • % : 0개 이상의 어떤 문자
      • _ : 1개 이상의 단일문자
    • IS NULL : NULL 값인 경우 true, 아니면 false
  • 복합 조건

🟠 ORDER BY

  • 결과가 출력되는 순서 조절
  • where 절과 함께 사용 가능 (단, where 절 뒤에 나와야 함)
SELECT 속성이름, ...
	FROM 테이블 이름 
    [WHERE 검색조건]
    [ORDER BY 속성이름]
  • ASC : Ascending, 오름차순(기본값)
  • DESC : Descending, 내림차순

🟠 DISTINCT

  • 중복된 데이터 제거
SELECT [DISTINCT] 속성이름, ...
	FROM 테이블 이름 
    [WHERE 검색조건]
    [ORDER BY 속성이름]

🟠 LIMIT

  • 출력 개수 제한
SELECT [DISTINCT] 속성이름, ...
	FROM 테이블 이름 
    [WHERE 검색조건]
    [ORDER BY 속성이름]
    [LIMIT 개수] 

🟠 집계 함수

  • SUM() : 합계
  • AVG() : 평균
  • MAX() : 최대값
  • MIN() : 최소값
  • COUNT() : 행 개수
  • COUNT(DISTINCT) : 중복 제외한 행 개수

🟠 GROUP BY

  • group by : 속성 이름끼리 그룹으로 묶는 역할
  • having : group by절의 결과를 나타내는 그룹을 제한
SELECT [DISTINCT] 속성이름, ...
	FROM 테이블 이름 
    [WHERE 검색조건]
    [GROUP BY] 속성이름
    [HAVING] 조건식
    [ORDER BY 속성이름]
    [LIMIT 개수] 

🟠 INSERT 문

  • 테이블에 새로운 튜플을 추가
INSERT INTO 테이블명 (필드1, 필드2, 필드3, ...) VALUES (1,2,3, ...);

# 필드를 명시하지 않는 경우, 테이블의 모든 컬럼에 값을 순서대로 추가해야 함
INSERT INTO 테이블명 VALUES (1,2,3, ...);

🟠 UPDATE 문

  • 테이블에서 특정 속성 값 수정
UPDATE 테이블명 SET 필드1 =1 WHERE 필드2 = 조건2;

🟠 DELETE 문

  • 테이블에서 기존 튜플을 삭제
DELETE FROM 테이블명 WHERE 필드1 =1;

DROP vs TRUNCATE

  • DROP
    • 테이블 삭제하기
    • 테이블을 잘못 만들었거나 더 이상 필요없는 경우
  • TRUNCATE
    • 테이블 초기화하기
    • 테이블의 모든 행(row) 일괄 삭제

📣 데이터 조작어(DML, Data Manipulation Language)

두 테이블을 묶어서 하나의 테이블을 만듦

🟠 Inner Join

SELECT 속성이름, ...
	FROM 테이블A, 테이블B
    WHERE 조인조건 AND 검색조건;
    
SELECT 속성이름, ...
	FROM 테이블A INNER JOIN 테이블B ON 조인조건
    WHERE 조인조건; 
  • Natural Join
    • Inner Join의 일종
    • 두 테이블간 동일한 타입을 가진 동일한 컬럼을 기준을 자동으로 조인됨 → 조인 조건을 따로 명시하지 않아도 됨
    • 동일한 타입을 가진 컬럼이 없거나, 여러 개 있을 경우 원하는 결과를 얻지 못함
SELECT 속성이름, ...
	FROM 테이블A
    NATURAL JOIN 테이블 B 

🟠 Outer Join

  • Left Outer Join
SELECT 속성이름, ...
	FROM 테이블A
    LEFT [OUTER] JOIN 테이블 B 
    ON 조인조건
  • Right Outer Join
SELECT 속성이름, ...
	FROM 테이블A
    RIGHT [OUTER] JOIN 테이블 B 
    ON 조인조건

📣 데이터 제어어(DCL, Data Control Language)

데이터베이스에 접근해 읽거나 쓰는 것을 제한할 수 있는 권한 부여/박탈

🟠 Grant

  • 특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한 부여
GRANT permission_type ON db_name.table_name
	TO username@host IDENTIFIED BY 'pw' [WITH GRANT OPTION];

🟠 Revoke

  • 특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한 박탈
REVOKE permission_type ON db_name.table_name FROM username@host;
profile
자아를 찾아 떠나는 중,,,

0개의 댓글

관련 채용 정보