데이터베이스는 검색과 축적이 쉽도록 정리된 데이터의 모음입니다. 대부분의 서버 애플리케이션은 클라이언트에서 받은 데이터를 어딘가에 저장합니다. 그것이 메모리일 수도 있고, 텍스트 파일일 수도 있고, 엑셀일 수도 있고, 특정 프로토콜을 통해 생성한 바이너리 파일일 수도 있습니다. 검색을 지원하고, 입력한 데이터 수정 및 삭제도 가능해야 하며, 수많은 읽기와 수정 삭제 요청이 동시다발로 이루어지는 상황을 생각해봅시다. 단순한 텍스트 파일로 그 모든 요구사항을 충족시키기는 어려울 겁니다.
일반적으로 현업에서 “데이터베이스”라고 말하면 데이터베이스 소프트웨어를 의미합니다. 부르는 데이터베이스 역시 데이터베이스 소프트웨어를 의미합니다. 데이터베이스는 데이터 저장 시 수많은 문제가 생길 수 있는 상황에서도 데이터를 가능한 한 안전하게 보관, 검색, 수정, 삭제가 가능하도록 하는 고마운 소프트웨어입니다.
RDB
데이터베이스는 여러 가지로 구분할 수 있는데, RDB와 RDB가 아닌 것으로(NoSQL) 보통 구분합니다. RDB는 Relational Database의 약자로 관계형 데이터베이스라는 뜻입니다. RDB가 아닌 데이터베이스를 NoSQL 또는 NewSQL로 구분합니다. 관계형 데이터베이스는 데이터를 행row과 열column로 이루어진 테이블로 관리하며, 기본 키Primary key를 사용해 각 행을 식별합니다. 또한 각 테이블 간에 관계를 지을 수 있습니다. RDB에서 가장 유명한 데이터베이스들은 오라클, 마이에스큐엘MySQL, SQL Server, 포스트그레스큐엘이 있습니다.
NoSQL
NoSQL의 뜻이 SQL을 안 쓴다는 의미로 사용되기도 합니다만, 최근에는 Not Only SQL의 의미로 많이 사용합니다. 애플리케이션을 작성할 때 RDB와 NoSQL의 장단점을 살려서 사용하면 좋기 때문에 Not Only SQL이라는 의견에 저도 조금 더 찬성합니다.
RDB는 데이터 저장, 질의, 수정, 삭제가 용이하지만 반면에 성능을 올리는 게 쉽지 않습니다. 데이터베이스의 성능을 높이려면 머신의 성능을 좋게 하는 스케일 업 또는 머신을 여러 대로 분리하는 스케일아웃이 필요합니다. 스케일 업은 장비를 좋게 하면 되지만, 스케일아웃은 데이터베이스가 여러 대가 되면서 분산되므로 이때 트랜잭션을 사용하면 성능이 떨어지게 됩니다. 또한 기본적으로는 스케일아웃을 지원하지 않습니다. RDB의 이러한 문제들을 해결하기 위해 (통칭) NoSQL가 등장했습니다.
MongoDB
도큐먼트 스토어로는 몽고디비가 유명합니다. 피파 온라인에서 데이터베이스로 채택했고 라인에서도 많이 사용합니다. 데이터로 JSON과 매우 비슷하게 생긴 BSON이라는 문서 모델을 저장합니다. JSONJavaScript Object Notation은 데이터 저장 및 전송 시 사용하는 경량의 데이터 표현 형식입니다. 자바스크립트의 객체의 형식을 기반으로 만들어져 있습니다.
RDB에서는 테이블 개념인 컬렉션이라는 개념이 있으며, 검색 시 인덱스를 사용하거나, ACID 트랜잭션을 지원하는 등 RDB에서만 사용했던 기능을 많이 가져오려고 시도합니다.
redis
레디스는 키밸류기반의 NoSQL데이터베이스입니다. 분산캐시로 보통 사용합니다만, 키를 기반으로 데이터를 잘 관리할 수 있도록 해주기에 데이터베이스의 범주에 넣어도 된다고 생각합니다. 리스트, 셋, 해쉬등 다양한 데이터 타입을 지원하고 있고 빠른 성능을 내주기 때문에 많은 회사에서 거의 기본으로 사용하고 있습니다.
DB지식들
ORM
ORM은 object relation mapping의 약자입니다. 클래스 오브젝트와 테이블의 관계를 매핑하는 프로그램을 지칭합니다. 테이블의 관계를 클래스로 가져오도록 도와주는 프로그램을 말하며, 클래스의 메서드를 실행시에 쿼리 생성 및 실행을 도와줍니다. ORM을 사용하면 쿼리 작성 없이 디비조작이 가능하며 직관적으로 데이터를 관리할 수 있습니다. 반면 통계를 내주는 쿼리같은 너무 복잡한 쿼리는 ORM이 아닌 raw쿼리를 사용하는게 더 좋은 경우가 많습니다.
ACID
ACID는 각각 원자성, 일관성, 격리성, 내구성을 의미합니다. . 원자성은 트랜젝션을 구성하는 명령이 하나의 묶음으로 처리되어서 모두 성공하거나 모두 실패하는 것을 보장하는 기법입니다. 일관성은 트랜잭션에서 실행된 변경 사항이 데이터베이스의 무결성 조건을 만족하는 겁니다. 격리성은 두 개의 트랜잭션이 서로에게 영향을 미칠 수 없다는 것을 의미합니다. 내구성은 트랜잭션이 성공적으로 끝나면 그 결과가 데이터베이스에 계속 유지된다는 것을 말합니다. ACID는 데이터베이스에서 데이터의 일관성을 유지하도록 해줍니다. 또한 문제가 생긴 때에는 이전의 상태로 되돌릴 수 있게 해줍니다.
트랜젝션
데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻합니다. 방금 ACID를 배웠는데요. ACID는 트랜젝션의 특징입니다. 트랜젝션을 사용하여 동시 다발적으로 발생하는 데이터 변경 요청중에도 디비 데이터가 안전하게 변경될 수 있도록 합니다.
N+1 문제
N + 1 문제는 ORM 사용시 자주 발생하는 문제입니다. 클래스의 모델에 다른 클래스와 관계를 설정 하고 해당 해당 클래스를 조회시 데이터 갯수만큼 추가적인 쿼리가 발생하는 문제를 뜻합니다. join으로 한번에 가져올 수 있는 쿼리인데, N + 1번 실행하여 불필요하게 많은 쿼리가 발생하는 것을 의미합니다.
===========================================================================
배포라는 단어를 사용했지만, 실제로는 배포에 관련된 모든 업무를 뜻합니다.
아마도 괜찮은 회사라면 배포 도구를 사용해서 배포를 진행할 것입니다.
도구가 없다면, ftp를 사용해서 수작업으로 압축파일을 업로드 하고 있을 수도 있을 것입니다.
배포는 수작업으로 하기 보다는 도구를 사용하여 배포하는 것이 좋습니다. 반복적인 작업이지만, 매우 중요한 작업이기 때문에 실수하면 안되기 때문입니다.
손으로 하는 배포의 다음에는 스크립트를 사용해서 배포하는 방법이 있습니다. 다음으로는 스크립트를 실행해주는 도구를 사용하는 것입니다. 대표적으로 젠킨스, 서클CI등이 있습니다. 최근에는 깃헙액션이나, argoCD같은 프로그램들이 있을 수 있겠습니다.
CI와 CD는 둘다 continuous integration, continuous deploy로 지속적으로 통합하고 지속적으로 배포한다는 한국말로는 약간이해하기 어려운 단어로 되어 있습니다.
쉽게 얘기하면 CI는 배포하기 전의 모든 단계를 자동화 하는 것을 의미합니다.
그러면 CD는 배포에 대한 것들을 자동화 하는 것을 말합니다.
배포도 그냥 하는 것이 아니라 서버여러대에 배포하는 경우에 몇대씩 나눠서 배포하는 롤링배포, 똑같은 수의 서버를 미리 띄워두고 게이트웨이만 변경하는 블루/그린배포, 특정 퍼센트의 서버에만 배포한다음 문제없으면 점차 배포를 확대하는 카나리 배포등 꽤나 복잡한 작업이 필요합니다.
====================================================================
프레임워크는 개발시에 필요한 것들을 미리 만들어줘서, 작업을 편하게 해줍니다.
개발시의 설정을 어떻게 하고, 코드는 어떻게 짜야하는지까지 제한을 하는 프레임워크가 있는반면,
최소한의 설정과 제약만을 가진 프레임워크도 있습니다.
제가 설명드리는 프레임워크는 모두 서버측에서 API를 만드는데 필요한 프레임워크입니다.
Node.js에는 express가 대표적이지만, NestJS를 적어두었습니다.
express는 최소한의 제약만을 주고 서드파티 라이브러리로 확장해나가는 프레임워크입니다.
반면 NestJS는 아키텍처구조를 어느정도 잡아줍니다.
나름 최신기능인 데코레이터를 사용하여 별도의 설정없이 라우터나 미들웨어들을 설정할 수 있게 해줍니다.
내부적으로 express와 fastify를 사용하고 있기 때문에, 기존의 express의 미들웨어를 사용할 수 있는 장점이 있습니다.
하지만, 아직까지는 상용 프로그램을 위한 프레임워크로 보자면 자바의 스프링에 비해서는 보안이나 인증, 인가, 배치 같은 부분에서 아쉬운 부분이 있습니다.
스프링은 기업용 애플리케이션을 만드는데에 필요한 것들을 모두 갖추고 있는 프레임워크입니다. Spring webflux라고 불리는 리액티브 프로그래밍에서는 로그 추적이 조금 귀찮아진다던지, 멀티코어 활용이 어렵다던지 하는 아쉬운 부분이 있습니다만, 프레임워크중에는 기업용 애플리케이션을 작성하는데에는 가장 지원이 잘 되어 있는 프레임워크입니다. 다만 스프링은 태생자체가 기업용 애플리케이션을 작성을 돕는 프레임워크였기 때문에, 다른 프레임워크에 비해서 학습을 해야하는 것들이 상당히 많이 있습니다. 또한 같이 사용하는 jpa나 스프링 배치, 시큐리티등의 퀄리티도 굉장히 높은 반면 각각 책이 몇권씩 있을 정도로 학습량이 많습니다. 스프링은 참 좋지만, 자바가 발전이 더딘편이며 행사코드가 참 많습니다. 다만 이 부분은 최근에 코틀린이 나와서 어느정도 해소되었다고 생각합니다. 국내에서는 취업에 유리한 부분도 분명히 있습니다. 큰회사에서는 대부분 스프링을 사용하니까요. 많은 사람들이 사용하고 있기 때문에 커뮤니티도 잘 되어 있어서 모르는게 나오거나 문제 발생시에 물어볼 사람이 많이 있다는 것도 장점입니다.
FastAPI는 파이썬 커뮤니티에서 최근에 인기가 있는 프레임워크입니다. 파이썬에는 장고와 플라스크라는 매우 유명한 프레임워크가 있습니다만, API만 작성하는 용도라면 앞으로는 FastAPI를 배워두는 것이 좋을 것 같다고 생각하여 소개드립니다. 최소한의 설정과 제약을 주는 프레임워크로, 플라스크와 비슷한 컨셉의 프레임워크입니다. 스프링과 비슷하게 의존성 주입을 사용합니다. Pydantic기반의 유효성 검증이 좋습니다. 스웨거 기반의 문서 자동화도 굉장히 잘되어 있습니다. async/await기반의 동시성을 도입하여 성능이 좋고, 빠르고, 배우기 쉽습니다. 기업용 애플리케이션을 작성하기 위해서는 스프링에 비해서는 직접 해야하하는 일이 많습니다.
JSON은 JavaScript Object Notation의 약자로 데이터를 표현하는 방법을 말합니다. 자바스크립트의 객체 표현법과 유사하게 생겼고, 직관적이고 단순한 구조입니다.
'Spring' 카테고리의 다른 글
스프링 들어가기에 앞서... (0) | 2024.09.03 |
---|---|
Spring (0) | 2024.09.02 |