req.params : 댓글 작성할 게시글 ID (postID)
req.user : 로그인한 사용자 정보 (userID)
req.body : 댓글 내용 (content)
- 댓글 작성하기 (POST)
- 댓글 조회하기 (GET)
- 댓글 수정하기 (PUT)
- 댓글 삭제하기 (DELETE)
Chore: yarn-start, Modified: app.js
데이터 저장에 데이터베이스를 쓰는 이유?
- 효과적인 데이터 인출
- 백업과 복구에 용이
- ACID 특성 보장
- 데이터 관리의 중앙화
- 민감한 데이터 보안
고가용성
- 대규모 웹 서비스에서 가장 중요한 사항 중 하나 - “안정성”
- 두 번째 - “고가용성”
데이터베이스 고가용성
- 데이터베이스는 이중화를 이용하여 고가용성을 확보할 수 있음
- 이중화는 마스터 인스턴스가 죽은 경우에 스탠바이 인스턴스가 곧바로 마스터 인스턴스로 교체되어서 다운타임을 최소화하는 메커니즘을 말합니다.
- 이중화는 데이터베이스 자체에서 지원하는 개념은 아니고, AWS RDS와 같은 클라우드 서비스에서 개발자들에게 제공해주는 솔루션
- 기본적으로 AWS RDS는 보통 여러 개의 인스턴스가 있으며 1개의 마스터 인스턴스와 N개의 스탠바이 인스턴스로 구성된다.
- Read Only
- Primary
- Standby
- 이러한 구성인 이유?
쿼리의 종류
- DDL(Data Definition Language)
- DQL(Data Query Language)
- DML(Data Manipulation Language)
- DCL(Data Control Language)
- TCL(Transaction Control Language)
- DQL, DML은 백엔드 개발자라면 무조건 능숙하게 사용할 수 있어야 한다.
DQL (SELECT) 쿼리 문법 소개
ID | Name | Age | Skill |
1 | 메시 | 35 | 팬텀드리블 |
2 | 홀란드 | 22 | 오프더볼 |
3 | 음바페 | 24 | 순간속도 |
실습 1. 이 테이블의 모든 레코드를 갖고 오기
SELECT ID, Name, Age, Skill FROM soccer_players;
실습 2. 나이가 31세 이상이거나 23세 미만의 축구 선수 이름만 갖고 오기
SELECT Name FROM soccer_players WHERE Age > 30 OR Age < 23;
ID | Name |
1 | 아르헨티나 |
2 | 노르웨이 |
3 | 프랑스 |
soccer_players 테이블과 soccer_player_nations 테이블을 조합하여 결과를 볼 수 있다.
조합에는 각 테이블의 키 필드가 있어야 하며 이 필드를 기반으로 합쳐지는데, 이것을 JOIN 연산이라고 한다.
JOIN
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- OUTER JOIN
실습 3. soccer_players 테이블과 soccer_player_nations 테이블을 ID 컬럼 값이 일치하는 레코드만 JOIN 후 국가가 프랑스인 선수의 이름을 보여주기
SELECT a.Name
FROM soccer_player a
INNER JOIN soccer_player_nations b ON a.ID = b.ID
WHERE b.Nation = ‘프랑스’
Department_ID | Name | Salary | Commision |
3 | 메시 | 70,000,000 | 5,000,000 |
5 | 펠레 | 40,000,000 | 0 |
9 | 마라도나 | 90,000,000 | 0 |
17 | 크루이프 | 70,000,000 | 3,000,000 |
3 | 디 스테파노 | 60,000,000 | 0 |
17 | 베켄바우어 | 40,000,000 | 7,000,000 |
5 | 게르트 뮐러 | 90,000,000 | 11,000,000 |
Q. 연봉이 최대 5,000만원을 넘지 않는 부서 ID가 17인 사원들 + 부서 ID가 5번인 모든 사원들 + 커미션을 받는 사원들의 목록을 찾고 싶습니다. 어떻게 쿼리문을 작성하면 될까요?
A.
SELECT *
FROM employees
WHERE (Salary <= 5000000 and Department_ID = 17)
OR Department_id = 5
OR Commission > 0
트랜잭션
트랜잭션의 성질 === ACID
트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.
입금/출금
- A가 B에게 10만원을 보낸다고 한다면,
- 이러한 단계가 따로 처리가 된다면 크나큰 문제 발생
- 트랜잭션의 원자성(Atomicity)은 이 두 단계가 모두 성공적으로 완료되거나 아니면 아무 것도 실행되지 않아야 함을 의미한다. 만약 두 번째 단계에서 문제가 발생하면 첫 번째 단계도 취소되어야 한다.
- 모두 성공적으로 완료되어 반영되는 것 ➡️ 커밋
- 문제가 하나라도 발생해서 원래의 상태로 돌아가는 것 ➡️ 롤백
- 하지만 이러한 요구 사항은, 하나의 요청으로 다양한 케이스의 SQL 문을 마치 프로그램의 분기문과 같이 실행해야 하는 이슈를 발생시킨다.
- 다행스럽게도, 여러 RDB에서는 Stored Procedure(저장 함수)라는 개념을 제공하여 해결을 돕고 있다!
ACID 특성
- A (Atomicity)
- C (Consistency)
- I (Isolation)
- D (Durability)
접근 제어 (Access Control)
- 쿠키, 세션, JWT … 인증(Authentication), 인가(Authorization)
- 인증(Authentication)
CREATE User ‘Messi’@‘localhost’ IDENTIFIED BY ‘goat’; - 인가(Authorization)
GRANT SELECT, INSERT, DELETE ON soccer.* To ‘Messi’@‘localhost’; - ‘최소 권한의 법칙’
데이터베이스의 보안 이야기 - 데이터 암호화
- 암호화
- 복호화
- 비밀번호
데이터베이스의 보안 이야기 - SQL Injection
- 프로그램에서 쿼리 인자를 입력할 때에는 반드시 Prepared statemen를 사용하자.
- 악의적인 목적을 가진 사용자가 특정 값을 입력 값으로 넣게 되었을 때 SQL 구문에서 예기치 않은 동작이 발생할 수 있고, 정보 유출이 발생할 수 있다.
- SQL Injection