본문 바로가기
Frontend/엘리스 SW 엔지니어 트랙

[ 엘리스 SW 엔지니어 트랙 ] 31일차(7주차: 데이터베이스 연동 - Node.js, Session, JWT, 회원가입 및 로그인)

by YWTechIT 2021. 12. 7.
728x90

📍 31일 차 12.7. 화 데이터 베이스 연동(실시간 강의)

이번 주는 node.js를 바탕으로 mongoDB를 이용하여 데이터베이스를 연동하여 회원가입과 로그인 기능을 구현한다. 프런트엔드를 준비하고 있어 DB를 많이 공부하진 않았지만 이번 기회를 계기로 DB와 친해져보고 게시판 CRUD와 페이지네이션을 구현해보고 싶다.


❏ DataBase

  1. 여러 사람이 공유하여 사용할 목적으로 체계화하여 관리되는 데이터의 집합(DBMS에 의해 제어 됨)
  2. 데이터 공유: 여러 명이 동시에 공유하더라도 안정성, 정확성을 갖춤
  3. 데이터 중복 최소화: 하나의 데이터베이스에 여러 테이블을 나누어 데이터 중복 최소화
  4. 지속성: 데이터가 여러 군데에 산재해 있으면 동시에 관리하기 어렵고, 무결성 유지도 어려움, 데이터베이스는 DBMS에 의해 중앙집중적으로 관리되어 무결성 유지가 용이
  5. 보안성: 중앙집중적으로 관리되기에 한 군데만 보안을 유지하면 됨
  6. ACID: 원자성(Atomicity) - 트랜잭션 관련 작업이 모두 수행됐는지 확인, 일관성(Consistency) - 데이터가 언제나 일관성 있는 상태인지 확인, 고립성(Isolation) - 한 작업 수행 시 다른 작업이 끼어들지 못하게 보장, 지속성(Durability) - 성공적으로 수행된 작업은 영원히 반영 즉 ACID는 데이터베이스 트랜젝션이 안전하게 수행된다는 것을 보장하기 위한 성질이다.
  7. SQLACID가 있는 대신 프로그램이 무겁지만 안전하다. 반대로 NoSQLACID가 없는 대신에 프로그램이 SQL보다 가볍고 빠르다. 대신 애플리케이션단에서 보안을 강화시켜야 한다.
  8. 수직확장: SQL에서 한 인스턴스를 키워 더 큰 로드를 감당한다. 이는 한계가 있다.
  9. 수평 확장: NoSQL에서 더 많은 인스턴스를 만들어 더 큰 로드를 감당한다. NoSQL은 데이터 구조가 정해져 있지 않아 인스턴스를 무제한 늘릴 수 있다.(운영비용이 받쳐준다면..)

❏ DBMS

  1. Oracle: 가장 먼저 상업용으로 발표된 관계형 데이터베이스, DB 시장 점유율 1위지만, 비용이 많이 들고, 대기업에서 주로 사용한다.
  2. MySQL: MySQL사에서 만든 오픈소스 데이터베이스, Oracle에 비해 대용량 데이터 처리는 어려움
  3. PostgreSQL: 객체 관계형 데이터베이스 시스템, 오픈소스, 다양한 데이터베이스 객체를 사용자가 임의 생성 가능
  4. MariaDB 등등..
  5. 열 = 필드 = 속성
  6. 행 = 튜플 = 레코드

❏ NoSQL

  1. key-value: Redis, AWS DynamoDB, value는 어떤 값이든 가능, 가장 단순한 형태
  2. doucment: DynamoDB, CouchDB, 각 레코드가 하나의 문서가 됨, 문서는 데이터베이스에 따라 XML, YAML, JSON, BSON 등을 사용한다.
  3. 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)

  1. 가장 고전적이고 널리 알려진 데이터베이스 모델
  2. 데이터의 규격인 스키마(테이블)와 각종 제약 조건을 정하고, 그에 맞게 데이터 저장
  3. 대부분의 경우 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'
  1. ORM(Object-relation-mapping): 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것(JPA, Hibernate 등)
  2. 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])
  1. Sequelize: 객체의 메서드를 활용하는 것처럼 쿼리 로직을 작성 가능, Node.js의 대표적인 ORM, Promise 기반으로 구현되었기 때문에 비동기 로직을 편리하게 작성할 수 있다.

❏ CRUD 사용자 추가하기

  1. 웹의 성능을 포기해도 사용자가 편리하게 끔 만들자.
  2. 데이터를 넣고 지우는 것보다 전체를 새로 그려 내는 경우가 빠를 때가 있다.
  3. app.use(express.json()): req.body에 값을 넣어준다. ()
  4. app.use(express.urlencoded({extended: false})): js 내부 모듈 중 query-string 모듈이 있는데 우리가 사용하기 편하게 분석해서 req.body 에 넣어주고. extended: true 를 사용하면 qs 모듈을 이용해서 req.body 에 넣어준다. (query-string 에 비해 보안성에서 뛰어나다? 정도의 차이, 단점은 버전 관리)
  5. POST로 한글(유니코드)을 넘길 때 몇몇 프락시에서 한글이 깨지는 경우가 있다. (대부분은 지원함)
  6. 개발 시 귀찮더라도 범용성 있게 작성해야 한다. (안 되는 브라우저를 위해서)
반응형

댓글