728x90
📍 31일 차 12.7. 화 데이터 베이스 연동(실시간 강의)
이번 주는 node.js
를 바탕으로 mongoDB
를 이용하여 데이터베이스를 연동하여 회원가입과 로그인 기능을 구현한다. 프런트엔드를 준비하고 있어 DB
를 많이 공부하진 않았지만 이번 기회를 계기로 DB
와 친해져보고 게시판 CRUD
와 페이지네이션을 구현해보고 싶다.
❏ DataBase
- 여러 사람이 공유하여 사용할 목적으로 체계화하여 관리되는 데이터의 집합(
DBMS
에 의해 제어 됨) - 데이터 공유: 여러 명이 동시에 공유하더라도 안정성, 정확성을 갖춤
- 데이터 중복 최소화: 하나의 데이터베이스에 여러 테이블을 나누어 데이터 중복 최소화
- 지속성: 데이터가 여러 군데에 산재해 있으면 동시에 관리하기 어렵고, 무결성 유지도 어려움, 데이터베이스는
DBMS
에 의해 중앙집중적으로 관리되어 무결성 유지가 용이 - 보안성: 중앙집중적으로 관리되기에 한 군데만 보안을 유지하면 됨
ACID
: 원자성(Atomicity) - 트랜잭션 관련 작업이 모두 수행됐는지 확인, 일관성(Consistency) - 데이터가 언제나 일관성 있는 상태인지 확인, 고립성(Isolation) - 한 작업 수행 시 다른 작업이 끼어들지 못하게 보장, 지속성(Durability) - 성공적으로 수행된 작업은 영원히 반영 즉ACID
는 데이터베이스 트랜젝션이 안전하게 수행된다는 것을 보장하기 위한 성질이다.SQL
은ACID
가 있는 대신 프로그램이 무겁지만 안전하다. 반대로NoSQL
은ACID
가 없는 대신에 프로그램이SQL
보다 가볍고 빠르다. 대신 애플리케이션단에서 보안을 강화시켜야 한다.- 수직확장:
SQL
에서 한 인스턴스를 키워 더 큰 로드를 감당한다. 이는 한계가 있다. - 수평 확장:
NoSQL
에서 더 많은 인스턴스를 만들어 더 큰 로드를 감당한다.NoSQL
은 데이터 구조가 정해져 있지 않아 인스턴스를 무제한 늘릴 수 있다.(운영비용이 받쳐준다면..)
❏ DBMS
- Oracle: 가장 먼저 상업용으로 발표된 관계형 데이터베이스, DB 시장 점유율 1위지만, 비용이 많이 들고, 대기업에서 주로 사용한다.
- MySQL:
MySQL
사에서 만든 오픈소스 데이터베이스,Oracle
에 비해 대용량 데이터 처리는 어려움 - PostgreSQL: 객체 관계형 데이터베이스 시스템, 오픈소스, 다양한 데이터베이스 객체를 사용자가 임의 생성 가능
- MariaDB 등등..
- 열 = 필드 = 속성
- 행 = 튜플 = 레코드
❏ NoSQL
key-value
:Redis
,AWS DynamoDB
,value
는 어떤 값이든 가능, 가장 단순한 형태doucment
:DynamoDB
,CouchDB
, 각 레코드가 하나의 문서가 됨, 문서는 데이터베이스에 따라XML
,YAML
,JSON
,BSON
등을 사용한다.graph-based
:Neo4j
,AWS Neptune
, 그래프 이론을 바탕으로 데이터베이스를 그래프로 표현한다. 관계기반 문제에 유리함
❏ mongoDB CRUD
// create
const users = client.db('fc21').collection('users')
// delete, users collection은 항상 비워짐
await users.deleteMany({})
// insert
await users.insertMany([
{
name: 'Foo'
},
{
name: 'Bar'
},
{
name: 'Baz'
}
])
const cursor = users.find({})
await cursor.forEach(console.log)
// update
await users.updateOne(
{
name: 'Baz'
},
{
$set: {
name: 'Boo'
}
}
// read
await users.insertMany([
{
name: 'Foo',
birthYear: 2000,
},
{
name: 'Bar',
birthYear: 1995,
},
{
name: 'Baz',
birthYear: 2000,
},
])
const cursor = users.find({ birthYear: 1995 });
// delete
await users.deleteOne({
name: 'Baz',
})
728x90
❏ 관계형 데이터베이스(RDB)
- 가장 고전적이고 널리 알려진 데이터베이스 모델
- 데이터의 규격인 스키마(테이블)와 각종 제약 조건을 정하고, 그에 맞게 데이터 저장
- 대부분의 경우
SQL
로 상호작용한다.
SELECT id, name FROM cities
INSERT INTO users (name, 'cityId') VALUES ('Bobo', 1)
UPDATE users SET name = 'Coco' WHERE name = 'bobo'
DELETE FROM users WHERE name = 'Coco'
ORM(Object-relation-mapping)
: 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것(JPA, Hibernate 등)SQL injection
: 악의적인 사용자가 보안상의 취약점을 이용하여, 임의로SQL
문을 주입하고 실행하여DB
가 비정상적인 동작을 하도록 조작하는 행위
// postgres - SQL injection
program.command('remove').action(async () =>
{
const client = await connect()
const userName = await prompts({
type: 'text',
name: 'userName',
message: 'Provide a user name to delete.'
})
// SQL injection이 가능한 지점
const inserted = `' OR '' = '`
// 모든 row 삭제
const query = `DELETE FROM users WHERE name = '${inserted}'`
console.log(query)
// await client.query(query)
await client.end()
// prevent SQL injection
await client.query(`DELETE FROM users WHERE name = $1::text`, [
userName.userName])
Sequelize
: 객체의 메서드를 활용하는 것처럼 쿼리 로직을 작성 가능, Node.js의 대표적인 ORM, Promise 기반으로 구현되었기 때문에 비동기 로직을 편리하게 작성할 수 있다.
❏ CRUD 사용자 추가하기
- 웹의 성능을 포기해도 사용자가 편리하게 끔 만들자.
- 데이터를 넣고 지우는 것보다 전체를 새로 그려 내는 경우가 빠를 때가 있다.
app.use(express.json())
: req.body에 값을 넣어준다. ()app.use(express.urlencoded({extended: false}))
: js 내부 모듈 중query-string
모듈이 있는데 우리가 사용하기 편하게 분석해서req.body
에 넣어주고.extended: true
를 사용하면qs
모듈을 이용해서req.body
에 넣어준다. (query-string
에 비해 보안성에서 뛰어나다? 정도의 차이, 단점은 버전 관리)- POST로 한글(유니코드)을 넘길 때 몇몇 프락시에서 한글이 깨지는 경우가 있다. (대부분은 지원함)
- 개발 시 귀찮더라도 범용성 있게 작성해야 한다. (안 되는 브라우저를 위해서)
반응형
'Frontend > 엘리스 SW 엔지니어 트랙' 카테고리의 다른 글
[ 엘리스 SW 엔지니어 트랙 ] 33일차 (0) | 2021.12.09 |
---|---|
[ 엘리스 SW 엔지니어 트랙 ] 32일차 (0) | 2021.12.08 |
[ 엘리스 SW 엔지니어 트랙 ] 30일차 (0) | 2021.12.04 |
[ 엘리스 SW 엔지니어 트랙 ] 29일차 (0) | 2021.12.03 |
[ 엘리스 SW 엔지니어 트랙 ] 28일차 (0) | 2021.12.02 |
댓글