데이터를 쉽게 처리할 수 있도록 도와주는 라이브러리
이전 글에서의 body-parser
// app.js에서 body-parser 설정
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
<input type="file" name="userfile"/>
<!-- { userfile: 'img2.png', title: '이미지' } -->
파일 업로드를 위해 사용되는 미들웨어
// multer 설치
npm install multer
// app.js에 multer 불러오기
const multer = require('multer');
// app.js
const multer = require('multer');
const upload = multer({
dest: 'uploads/',
});
// 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!!');
});
앞서 지정한 경로를 제외하고, 파일명, 파일 크기 등 직접 지정 및 제어 가능
storage : 저장할 공간에 대한 정보
-diskStorage : 파일을 디스크에 저장하기 위한 모든 제어 기능을 제공
limits : 파일 제한
// 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 },
})
// 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!!');
});
// 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!!');
});
다양한 카테고리 정보를 저장할 수 있는 구조
여러 사람에 의해 공유되어 사용될 목적으로 통합하여 관리하는 데이터의 집합
→ 데이터를 저장하는 구조/자료의 모음
파일 시스템 VS 데이터베이스
- 파일 시스템 : 데이터를 기록하고 여러 사람이 공유하여 사용 가능 (ex. 엑셀로 데이터 관리)
- 여러 사람이 공유하여 사용하기에는 데이터 중복, 불일치, 유지 보수 등의 문제
- 데이터베이스 : 파일 시스템의 단점을 개선하기 위해 등장
관계형 데이터베이스(RDBMS) : DBMS에 관계가 추가된 것
- Oracle, SQL Server, DB2, MYSQL, PostgreSQL, SQLite
여러 후보 속성 중 하나를 선택하여 테이블을 대표하는 속성 → 테이블 당 하나의 필드에만 적용 가능
선정 시 고려사항
- 테이블 내 튜플을 식별할 수 있는 고유한 속성을 가져야 함 → 중복 값 불가
- NULL 값 X
- 키 값의 변동이 일어나지 않아야 함
- 최대한 적은 수의 속성을 가진 것이어야 함
- 향후 키를 사용하는데 문제 발생 소지가 없어야 함
다른 테이블의 기본키를 참조하는 속성
MySQL
- 가장 널리 사용되고 있는 RDBMS(관계형 데이터베이스 관리 시스템)
- 오픈소스
- 윈도우, Mac, 리눅스 등 다양한 운영체제에서 사용 가능
구조적 쿼리 언어 (Structured Query Language)
# 데이터베이스 생성 + 한글 인코딩
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 TABLE 테이블명 ADD 속성이름 데이터타입; # 속성 새로 추가하는 경우
ALTER TABLE 테이블명 DROP COLUMN 속성이름; # 기존 속성 삭제하는 경우
ALTER TABLE 테이블명 MODIFY 속성이름 데이터타입; # 기존 속성 수정하는 경우
DROP TABLE 테이블이름;
데이터베이스의 내부 데이터를 관리하기 위한 언어
CRUD
- 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 처리 기능
- Create(생성) - INSERT
- Read(읽기) - SELECT
- Update(갱신) - UPDATE
- Delete(삭제) - DELETE
SELECT 속성이름, ...
FROM 테이블 이름
[WHERE 검색조건]
기본적인 연산자는 생략
비교 연산자
부정 연산자 : ^=, <>(같지 않다)
범위, 집합, 패턴, NULL
복합 조건
SELECT 속성이름, ...
FROM 테이블 이름
[WHERE 검색조건]
[ORDER BY 속성이름]
SELECT [DISTINCT] 속성이름, ...
FROM 테이블 이름
[WHERE 검색조건]
[ORDER BY 속성이름]
SELECT [DISTINCT] 속성이름, ...
FROM 테이블 이름
[WHERE 검색조건]
[ORDER BY 속성이름]
[LIMIT 개수]
SELECT [DISTINCT] 속성이름, ...
FROM 테이블 이름
[WHERE 검색조건]
[GROUP BY] 속성이름
[HAVING] 조건식
[ORDER BY 속성이름]
[LIMIT 개수]
INSERT INTO 테이블명 (필드1, 필드2, 필드3, ...) VALUES (값1, 값2, 값3, ...);
# 필드를 명시하지 않는 경우, 테이블의 모든 컬럼에 값을 순서대로 추가해야 함
INSERT INTO 테이블명 VALUES (값1, 값2, 값3, ...);
UPDATE 테이블명 SET 필드1 = 값1 WHERE 필드2 = 조건2;
DELETE FROM 테이블명 WHERE 필드1 = 값1;
DROP vs TRUNCATE
- DROP
- 테이블 삭제하기
- 테이블을 잘못 만들었거나 더 이상 필요없는 경우
- TRUNCATE
- 테이블 초기화하기
- 테이블의 모든 행(row) 일괄 삭제
두 테이블을 묶어서 하나의 테이블을 만듦
SELECT 속성이름, ...
FROM 테이블A, 테이블B
WHERE 조인조건 AND 검색조건;
SELECT 속성이름, ...
FROM 테이블A INNER JOIN 테이블B ON 조인조건
WHERE 조인조건;
SELECT 속성이름, ...
FROM 테이블A
NATURAL JOIN 테이블 B
SELECT 속성이름, ...
FROM 테이블A
LEFT [OUTER] JOIN 테이블 B
ON 조인조건
SELECT 속성이름, ...
FROM 테이블A
RIGHT [OUTER] JOIN 테이블 B
ON 조인조건
데이터베이스에 접근해 읽거나 쓰는 것을 제한할 수 있는 권한 부여/박탈
GRANT permission_type ON db_name.table_name
TO username@host IDENTIFIED BY 'pw' [WITH GRANT OPTION];
REVOKE permission_type ON db_name.table_name FROM username@host;