SQL
관계형 데이터베이스에 사용되며 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있습니다.
SQL
applecoke.tistory.com
SQL 내장함수
3 Tier Architecture(client, server, database)작동방식
1. 클라이언트가 서버에 데이터를 요청한다.
2. 서버는 그 요청에 맞는 데이터를 데이터베이스에 요청한다.
3. 데이터 베이스가 요청에 알맞은 데이터를 서버로 보내주고 다시 서버는 클라이언트에 데이터를 보내준다.
NoSQL의 구성
- Key-Value 타입: 속성을 Key(속성의 이름)-Value(속성에 연결된 데이터 값)의 쌍으로 나타내는 데이터를 배열의 형태로 저장합니다.
- 문서형(Document) 데이터베이스: 데이터를 테이블이 아닌 문서처럼 저장하는 데이터베이스를 의미합니다. 각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라고 하는 그룹으로 묶어서 관리합니다.
- Wide-Column 데이터베이스: 데이터베이스의 열(column)에 대한 데이터를 집중적으로 관리하는 데이터베이스입니다. 각 열에는 key-value 형식으로 데이터가 저장
- 그래프(Graph) 데이터베이스: 자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성하는 데이터베이스입니다. 노드(nodes)에 속성별(entities)로 데이터를 저장합니다. 각 노드 간 관계는 선(edge)으로 표현합니다.
관계 종류
- 1:1 관계: 하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우입니다.
- 1:N 관계: 하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우입니다.
- N:N 관계: 여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우입니다.
SQL 기반의 데이터베이스와 NoSQL 데이터베이스의 차이점
- 데이터 저장(Storage): NoSQL은 key-value, document, wide-column, graph 등의 방식으로 데이터를 저장, 관계형 데이터베이스는 SQL을 이용해서 데이터를 테이블에 저장합니다.
- 스키마(Schema): SQL을 사용하려면, 고정된 형식의 스키마가 필요하고 NoSQL은 관계형 데이터베이스보다 동적으로 스키마의 형태를 관리할 수 있습니다.
- 쿼리(Querying): 관계형 데이터베이스는 테이블의 형식과 테이블 간의 관계에 맞춰 데이터를 요청해야 하고 비관계형 데이터베이스의 쿼리는 데이터 그룹 자체를 조회하는 것에 초점을 두고 있습니다.
- 확장성(Scalability): SQL 기반의 관계형 데이터베이스는 수직적으로 확장하고 NoSQL로 구성된 데이터베이스는 수평적으로 확장합니다.
SQL 기반의 관계형 데이터베이스를 사용하는 케이스
- 데이터베이스의 ACID 성질을 준수해야 하는 경우
- 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우
NoSQL 기반의 비관계형 데이터베이스를 사용하는 케이스
- 대용량의 데이터를 저장하는 경우
- 정형화되지 않은 많은 양의 데이터가 필요한 경우
- 클라우드 컴퓨팅 및 저장 공간을 최대한 활용하는 경우
- 소프트웨어에 데이터베이스의 확장성이 중요할 경우
- 스키마를 미리 준비할 필요가 없기 때문에 빠르게 개발하는 과정에 매우 유리
데이터베이스
NoSQL: 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 합니다.
관계형 데이터 베이스: 키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스이다.
데이터베이스의 특징
- 물리적 독립성: 데이터베이스 사이즈를 늘리거나 성능 향상을 위해 데이터 파일을 늘리거나 새롭게 추가하더라도 관련된 응용 프로그램을 수정할 필요가 없다.
- 논리적 독립성: 데이터베이스는 논리적인 구조로 다양항 응용 프로그램의 논리적 요구를 만족시켜줄 수 있다.
- 데이터의 무결성을 구현한다.
- 데이터에 보안을 구현한다.
- 데이터의 불일치성을 배제
- 데이터 중복 최소화
데이터베이스의 필요성
| 기술적 측면에서의 필요성 | 조직적 측면에서의 필요성 |
| 데이터의 중복으로 인한 데이터의 일관성 | 조직이 자산으로서 데이터를 관리할 필요가 있음 |
| 데이터 접근에 대한 관리 및 통제가 필요함 | 데이터의 공유가 필요함 |
| 데이터 파일과 프로그램간의 종속성으로 인해 비효율적임 | 데이터의 일관성 및 무결성 유지가 필요함 |
| 데이터가 여기 저기 흩어져 있어 보안 유지가 어려움 | 데이터의 최신성 및 유용성을 유지할 필요가 있음 |
데이터베이스의 장단점
| DB의 장점 | DB의 단점 |
| 데이터의 공유가 가능함 | 초기 개발 비용이 많이 듦 |
| 데이터에 대한 접근을 통제할 수 있음 | |
| 중복 데이터가 적어짐 | DB관리를 전담할 전문 인력이 필요 |
| 효율적인 유지 보수가 가능함 | |
| 데이터의 일관성 유지가 가능함 | 적시에 또는 지속적인 유지 보수가 수반되지 않으면 무용지물이 될 수 있음 |
| 생산성이 향상 |
쿼리
저장되어 있는 데이터를 필터하기 위한 질의문
데이터베이스 정규화
정규화는 데이터 베이스를 설계한 후 설계 결과물을 검증하기 위해 사용된다.
- 삽입 이상 : 데이터를 저장할 때 원하지 않는 정보가 함께 삽입되는 경우
- 삭제 이상 : 튜플을 삭제함으로써 유지되어야 하는 정보 까지도 연쇄적으로 삭제되는 경우
- 갱신 이상 : 중복된 튜플 중 일부의 속성만 갱신 시킴 으로써 정보의 모순성이 발생하는 경우
expressjs
라우팅: 메소드와 URL(/lower, /upper 등)로 분기점을 만드는 것
const router = express.Router()
router.get('/lower', (req, res) =>{
res.send(data)
})
router.post('/lower', (req, res) =>{
// do something
})
미들웨어
미들웨어를 사용하는 상황
- 모든 요청에 대해 url이나 메소드를 확인할 때
- POST요청 등에 초함된 body(payload)를 구조화할 때
- 모든 요청/응답에 CORS헤더를 붙어야 할 때
- 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
expressjs method
트랜잭션
여러개의 작업을 하나로 묶은 실행 유닛입니다. 단 하나의 작업이라도 실패하면 모든 작업을 실패한 것으로 판단, 데이터베이스 트랜잭션은 ACID라는 특성을 가지고 있습니다.
ACID
데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질입니다.
- Atomicity: 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 합니다.
- Consistency: 데이터베이스의 상태가 일관되어야 한다는 성질입니다.
- Isolation: 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다
- Durability: 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 합니다.
스키마
데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명입니다.
- Entities: 엔티티는 고유한 정보의 단위입니다.
- Field: 각 엔티티에는 해당 엔티티의 특성을 설명하는 필드(Field)가 있습니다. 행렬이라면 열(column)에 해당된다.
- Record: 레코드는 테이블에 저장된 항목입니다. 행렬에서의 행(row)이라고 볼 수도 있습니다.
ORM
OOP(객체지향프로그래밍)간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법으로 쉽게 말해 객체로 관계형 데이터베이스를 관리하는 기술.
ORM의 필요성
객체의 속성은 데이터베이스의 필드다. 객체지향에서 데이터를 다루는 방법과 관계형데이터베이스에서의 데이터를 다루는 방법이 다르기 때문에 ORM을 이용한다면 관계형으로 사고하지 않아도 프로그램의 관점에서 관계형 데이터베이스에 접근 가능
MongoDB
1. 비구조적인 대용량의 데이터를 저장하는 경우
2. 클라우드 컴퓨팅 및 저장 공간을 최대한 활용한 경우
3. 빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트하는 경우
용어 정리
- 도큐먼트: 필드-값 쌍으로 저장된 데이터
- 필드: 데이터 포인트를 위한 고뉴한 식별자
- 값: 주어진 식별자와 연결된 데이터
- 컬렉션: MongoDB의 도큐먼트로 구성된 저장소입니다. 일반적으로 도큐먼트 간의 공통 필드가 있다.
JSON(JavaScript Object Notation)
parsing이 느리고 메모리 사용이 비효율적, JSON은 기본 데이터 타입만을 지원하기 때문에 사용할 수 있는 데이터 타입에 제약
BSON(Binary JSON)
컴퓨터의 언어에 가까운 이진법에 기반을 둔 표현법 JSON보다 메모리 사용이 효율적이며 빠르고, 가볍고, 유연하며 더 많은 데이터 타입을 사용 가능
Importing & Exporting
MongoDB 데이터는 BSON의 형태로 저장이 되고, 보통 일기 쉬운 JSON의 형태로 출력
Aggregation Framework
MongoDB에서 데이터를 쿼리하는 가장 간단한 방법 중 하나
Aggregation Framework 특징
- 도큐먼트를 필터링하지 않고 그룹으로 데이터를 집계하거나 데이터를 수정할 수 있다.
- 데이터 찾기 및 프로젝션 없이 작업을 수행하거나 계산
- 대괄호를 이용해 배열을 인자로 사용
[인증/보안] 기초
HTTPS
HTTP 요청을 SSL 혹은 TLS라는 알고리즘을 이용해, HTTP 통신을 하는 과정에서 내용을 암호화하여 데이터를 전송하는 방법입니다.
SSL, TLS는 무엇인가요? SSL과 인증기관(CA)은 어떤 관계
네트워크로 연결된 컴퓨터간에 인증되고 암호화 된 링크를 설정하기위한 프로토콜입니다.
인증서에 포함 된 공개 키를 사용하면 웹 브라우저에서 시작 웹 서버와 암호화 된 통신 세션 TLS 및 HTTPS 프로토콜
https에서 꼭 기억할 것!
1) https는 웹사이트의 무결성을 보호한다.
-전송 중에 외부로부터 데이터가 변조되지 않는다.
2) 사용자의 개인정보를 보호한다.(기밀성)
https의 암호화 방법
1) 대칭키 암호화 방법 => hash
2) 비대칭키 암호화 방법 => https에서 많이 사용되고, 서로가 서로를 풀 수 있다.
hash
어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것
salt
암호화해야 하는 값에 어떤 '별도의 값'을 추가하여 결과를 변형하는 것
Cookie
서버가 사용자의 위치에 정보를 저장하고 불러올 수 있는 수단, 클라이언트에 저장되어 관리되며 서버와 클라이언트의 대화하기 위한 수단이다.
쿠키의 목적
세션 관리, 개인화, 추적
쿠키의 구성요소
Name :쿠키의 이름
Value : 쿠키의 저장된 값
Expires : 쿠키가 언제 삭제되는지 결정합니다.
var session = require('cookie-session')
var express = require('express')
var app = express()
var expiryDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hour
app.use(session({
name: 'session',
keys: ['key1', 'key2'],
cookie: {
secure: true,
httpOnly: true,
domain: 'example.com',
path: 'foo/bar',
expires: expiryDate
}
}))
Domain: 쿠키 옵션에서 도메인은 포트 및 서브 도메인(www) 정보, 세부 경로를 포함하지 않습니다.
Path: 도메인의 루트 경로로 이동할 경우 쿠키가 전송합니다.
MaxAge or Expires: 쿠키가 유효한 기간을 정하는 옵션
Secure: 쿠키를 전송해야 할 때 사용하는 프로토콜에 따른 쿠키 전송 여부를 결정
HttpOnly: 자바스크립트에서 브라우저의 쿠키에 접근 여부를 결정
SameSite: Cross-Origin 요청을 받은 경우 요청에서 사용한 메소드와 해당 옵션의 조합으로 서버의 쿠키 전송 여부를 결정하게 됩니다.
쿠키의 단점
- 상당한 트랙픽을 발생
- 보안에 대한 문제점도 발생
Session
일정 시간동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술이다.
const session = require('express-session'); // 세션관리용 미들웨어
app.use(
session({
secret: '@codestates', //암호화하는 데 쓰일 키
resave: false, // 세션을 언제나 저장할지 설정함 (?)
saveUninitialized: true, //세션이 저장되기 전 uninitialized 상태로 미리 만들어 저장
cookie: {
domain: 'localhost', // 클라는 서버도메인이 설정과 같아야 쿠키전송가능
path: '/', // 해당 path를 만족하면 쿠키 보내줌
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'None',
httpOnly: true, // JS로 쿠키를 사용할 수 없도록 함
secure: true, // https 쿠키 주고받게 함
},
})
);
Token
클라이언트로 로그인할 시 서버에서 인증을 거친 다음 토큰을 내어주는 방식으로 다음 부터 서버에 요청시 토큰을 같이 보내어 인증을 가진다.
JWT의 종류
Access Token: 짧아야 한다.
Refresh Token: 길어야함(기간)
토큰기반 인증의 장점
1. Statelessness & Scalability (무상태성 & 확장성)
2. 안전하다
3. 어디서나 생성 가능하다
4. 권한 부여에 용이하다
JWT의 구조

Header: 이것이 어떤 종류의 토큰인지(지금의 경우엔 JWT), 어떤 알고리즘으로 sign(암호화) 할지가 적혀있다.
Payload: Payload에는 정보가 담겨 있다. 어떤 정보에 접근 가능한지에 대한 권한을 담을 수도 있고, 사용자의 유저 이름 등 필요한 데이터는 이곳에 담아 암호화 시킨다.
Signature: base64로 인코딩된 첫번째, 그리고 두번째 부분이 완성 되었다면, 원하는 비밀 키(암호화에 추가할 salt)를 사용하여 암호화한다.
JWT 사용 흐름
- 클라이언트가 아이디와 비밀번호를 담아 서버에 로그인 요청을 보낸다.
- 아이디/비밀번호를 확인 후 일치하면 클라이언트에게 암호화된 토큰을 생성한다.(access/refresh)
- 토큰을 클라이언트에게 보내주면 클라이언트는 토큰을 저장한다.
- 클라이언트가 http header에 토큰을 담아 보낸다
- 서버는 토큰을 해독하여 클라이언트의 요청을 처리하여 응답한다.
OAuth
소셜 로그인 기능을 제공하는 기술로 인증을 위한 표준 프로토콜의 한 종류이고 보안 된 리소스에 액세스하기 위해 클라이언트에게 권한을 제공(Authorization)하는 프로세스를 단순화하는 프로토콜 중 한 방법
OAuth 용어
- Resource Owner: 액세스 중인 리소스의 유저입니다. 애플콕이 구글 계정을 이용하여 App에 로그인할 경우, Resource owner은 애플콕이 됩니다.
- Client: Resource owner를 대신하여 보호된 리소스에 액세스하는 응용프로그램입니다. 클라이언트는 서버, 데스크탑, 모바일 또는 기타 장치에서 호스팅 할 수 있다.
- Resource server: client의 요청을 수락하고 응답할 수 있는 서버 입니다.
- Authorization server : Resource server가 액세스 토큰을 발급받는 서버입니다. 즉 클라이언트 및 리소스 소유자를 성공적으로 인증한 후 액세스 토큰을 발급하는 서버를 말합니다.
- Authorization code : access token을 발급받기 전에 필요한 code입니다. client ID로 이 code를 받아온 후, client secret과 code를 이용해 Access token 을 받아옵니다.
- Access token : 보호된 리소스에 액세스하는 데 사용되는 credentials입니다. Authorization code와 client secret을 이용해 받아온 이 Access token으로 이제 resource server에 접근을 할 수 있습니다.
- Scope : scope는 토큰의 권한을 정의합니다. 주어진 액세스 토큰을 사용하여 액세스할 수 있는 리소스의 범위입니다.
'기술 면접 정리 > 진짜 한방 정리' 카테고리의 다른 글
| 헷갈릴 수 있는 용어들 정리(2) (0) | 2022.04.18 |
|---|---|
| 헷갈릴 수 있는 용어들 정리 (0) | 2022.04.16 |
| 프론트엔드 (0) | 2021.11.24 |