클라우드/AWS

[AWS] 데이터베이스- DynamoDB

dayeonsheep 2023. 7. 25. 18:03

기본 개념


Database: 일반적으로 컴퓨터 시스템에 전자 방식으로 저장된 구조화된 정보 또는 데이터의 체계적인 집합을 의미

 

DBMS(DataBase Management System): 사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해 주고 데이터베이스를 관리해 주는 소프트웨어 시스템

 

SQL(Strucured Query Language): 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어, 관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었음

 

RDBMS(Relational Database Management System, 관계형 데이터베이스 관리 시스템)

  • 기존의 RDBMS에서의 저장 방식은 SQL에 의해 저장되고 있으며 정해진 *스키마에 따라 데이터를 저장하여야 함.
  • RDB를 관리하는 시스템( RDB = 관계형 데이터 모델을 기초로 두고 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스 )
  • 구성된 테이블이 다른 테이블들과 관계를 맺고 모여있는 집합체
  • 이러한 관계를 나타내기 위해 *외부키(foreign key)라는 것을 사용 -> 외래키를 이용한 테이블 간 Join이 가능

*스키마

- 데이터베이스의 테이블 구조 및 형식, 관계 등의 정보를 형식 언어(formal language)로 기술한 것, 일종의 데이터베이스 설계도

- 데이터베이스를 구성하는 자료 개체, 이들의 성질, 이들 간의 관계, 자료의 조작 및 이들 자료 값들이 갖는 제약조건에 관한 정의

 

*외부키 & 기본키

 

- Primary Key(기본키): Primary Key는 한 테이블(Table)의 각 로우(Row)를 유일하게 식별해주는 컬럼(Column)으로, 
각 테이블마다 Primary Key가 존재해야 하며, NULL 값을 허용하지 않고, 각 로우(Row)마다 유일한 값이어야 한다.

- Foreign Key(외래키 또는 외부키): Foreign Key는 한 테이블의 필드(Attribute) 중 다른 테이블의 행(Row)을 식별할 수 있는 키

 

 

 

출처 : https://www.fun-coding.org/post/mysql_basic1.html#gsc.tab=0

 

NoSQL(Not Only SQL)

 

  • 비관계형 데이터베이스
  • RDB 형태의 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술을 의미
  • RDBMS와는 달리 테이블 간 관계를 정의하지 않음
  • 데이터 테이블은 그냥 하나의 테이블이며 테이블 간의 관계를 정의하지 않아 일반적으로 테이블 간 Join도 불가능
 

[DB] NoSQL이란?, NoSQL 특징, NoSQL 종류, NoSQL 장점

NoSQL이란? NoSQL은 비관계형 데이터베이스를 지칭한다. 즉, 관계형 데이터 모델을 지양 하며 대량의 분산된 데이터를 저장하고 조회하는 데 특화되었으며 스키마 없이 사용 가능하거나 느슨한 스

code-lab1.tistory.com

 


Dynamo DB

; AWS에서 제공하는 serverless 기반 key-value NoSQL DB


특징

 

1. NoSQL(비관계형) 데이터베이스

- RDBMS(관계형)은 종류나 특성에 따라 테이블을 나누지만, 비관계형에서는 하나의 테이블에 표현

- join 개념이 없어 정규화가 아닌 *반정규화 진행

 

*반정규화:

- 데이터베이스의 성능 향상을 위하여, 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법

- 반정규화는 조회(select) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아진다.

 

2. HTTP로 통신

- 다른 DB 리소스들은 *TCP connection, DynamoDB는 connectionless

 

*TCP connection:

웹 브라우저(클라이언트)에서 URL을 입력받으면 URL에서 IP주소와 포트번호를 추출한다.

목적지의 IP주소와 포트번호를 가지고 TCP커넥션을 생성하게 된다.

1. 클라이언트는 TCP커넥션을 생성하기 위해 작은 TCP 패킷을 서버에게 보낸다.

2. 서버가 클라이언트로부터 패킷을 받으면 커넥션을 요청을 수락한다는 의미로 SYN과 ACK 플래그를 호함하여 TCP 패킷을 클라이언트에게 보낸다.

3. 마지막으로 클라이언트는 TCP 커넥션이 잘 맺어졌다는 것을 알기기 위해 서버에게 다시 확인응답 신호를 보내고 클라이언트와 서버사이에 TCP 커넥션이 이루어져 HTTP 통신을 할 수 있게 된다.

 

3. Serverless

- DynamoDB를 위한 별도의 서버 존재X, 요청한 만큼 비용 지불

- 서버를 관리할 필요가 없으므로 용량 프로비저닝 및 패치 적용과 같은 인프라 관리 작업이 필요 없음

- 또한 Amazon DynamoDB는 버전과 업그레이드가 없으며 가동 중지 시간이 없는 유지 보수를 제공

- *AWS Lambda serverless 기반의 서비스와 좋은 시너지 발생 가능

    => 왜?
: 통합되어 트리거를 제공, 트리거를 사용하면 DynamoDB 테이블에서 항목 수준 변경 사항이 감지될 때 사용자 지정 함수를 자동으로 실행할 수 있음. 즉, 특정 데이터가 삭제, 추가, 수정되는 것과 같이 이벤트가 발생될 때 실행시키고 싶은 로직을 람다에 사용자 지정함수로 작성할 수 있음.?

 

: AWS Lambda는 이벤트가 발생했을 때 코드(=함수)를 실행하고 컴퓨터 리소스를 관리하는 Serverless 컴퓨팅 서비스여서 Dynamic Contents와 프로그램 작업이 필요한 경우에는 Lambda와 API Gateway로 서비스를 하고, <-> (정적인 작업에는 lambda & S3 많이 사용함)

백단에서는 DB로 DynamoDB를 운영하는 방식을 자주 사용함 (규모와 상관없이 대부분 10ms 내에 데이터를 읽고 처리할 만큼 속도가 매우 빠르고 DB의 용량이나 트래픽이 늘어나면 AWS에서 알아서 스케일링 해주고, DB 백업도 알아서 해주니까)

 

: 특히 람다를 사용하면 DynamoDB 테이블의 모든 데이터 변경에 대한 데이터 검증, 필터링, 정렬 또는 기타 변환 작업을 수행하고 변환된 데이터를 다른 데이터 스토어로 로드할 수 있음

 

*AWS Lambda

- 이벤트가 발생했을 때 코드(=함수)를 실행하고 컴퓨터 리소스를 관리하는 Serverless 컴퓨팅 서비스

- 여기서 이벤트가 발생할 때를 다른 말로 "trigger 되었을 때" 또는 "함수를 호출했을 때"라고도 표현

- 즉, 24시간 서버가 돌아가는 AWS EC2와 달리, AWS Lambda는 사용자가 함수를 호출했을 때만 코드가 실행되는 서비스

 

AWS Lambda를 활용한 DyanamoDB 테이블 데이터 삽입/조회 방법

👨‍💻 들어가며 본 튜토리얼을 잘 따라오시면 AWS Lambda에서 DynamoDB 테이블에 데이터를 삽입하는 방법과 테이블 데이터를 읽어오는 방법을 알아가실 수 있습니다. 🛠 기술 스택 AWS DynamoDB AWS Lam

heytech.tistory.com

 

 

자습서: Lambda 및 DynamoDB를 사용한 CRUD API 구축 - Amazon API Gateway

자습서: Lambda 및 DynamoDB를 사용한 CRUD API 구축 이 자습서에서는 DynamoDB 테이블에서 항목을 생성, 읽기, 업데이트 및 삭제하는 서버리스 API를 생성합니다. DynamoDB는 완전관리형 NoSQL 데이터베이스

docs.aws.amazon.com

 

4. Key-Value DB

- Key를 제외한 테이블 속성을 미리 정의할 필요 없음 => 유연성 증가

- Amazon DynamoDB는 키-값과 문서 데이터 모델을 모두 지원

- Amazon DynamoDB는 NoSQL 데이터베이스로서 유연한 스키마를 가지고 있어 항목마다 다른 속성을 가질 수 있음

- 유연한 스키마를 사용하면 관계형 데이터베이스에서와 같이 테이블 스키마를 재정의해야 하는 부담 없이 비즈니스 요구 사항 변경에 따라 쉽게 조정할 수 있음


장점

  • JSON file로 저장되는 개념이라 사용하기 간편하다.
  • 데이터가 key-value 형태 이므로 READ 속도가 빠르다. (10ms 이하의 읽기 및 쓰기 성능)
  • 확장성이 좋다.(수평적. 초당 수천 건의 요청 처리 가능)
  • 속성에 대한 추가와 변경이 자유롭다.
  • 완전 관리형 서비스이므로 운영 부담이 발생하지 않는다.
  • 요청 수에 따라 원활하게 확장되기 때문에 비용 효율적이고 IO 작업을 원활하게 지원한다.
  • 성능과 가용성을 위해 데이터를 3곳의 가용 영역에 복제하여 저장하고 있다.

 

단점

  • 데이터들 간의 관계(relation)가 없기 때문에 같은 데이터가 여러 컬렉션에 중복되어 들어있을 수 있다. -> update가 일어날 경우 모든 테이블에서 작업해주어야 한다.
  • 큰 REST API 서비스를 운영할 경우 이를 처리할 수 있는 체계적인 API가 제공되지 않는다.
  • *ORM 지원 라이브러리도 없고, 있다 하더라도 메이저하지도 않아서 쓰기 힘들 수 있다.
  • 러닝커브가 생각보다 크다
  • 여러 쿼리에 대해 일관성, 원자성을 보장하지 않는다. 즉, Transaction 이 없다. 전략으로 사용해야한다. 

=> RDBMS는 테이블설계를 잘하고, 데이터를 정규화해서 넣어놓으면 데이터를 꺼내오기가 편함. (SQL에 여러가지 기능이 많기도하고) 하지만 NOSQL인 DynamoDB는 데이터를 잃어버릴 수도 있음, DynamoDB는 데이터를 꺼내올 때 반드시 partition Key를 넣어야되는데, 그 partition Key를 모르면 Value를 찾을 수가 없기 때문

 

*ORM : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 도우미 역할

 


<참고>