express 프레임워크, jwt, bcrypt 라이브러리를 이용해서 node.js 환경에서 처음으로 로그인/회원가입, 사용자 인증 기능을 포함한 간단한 게시판 페이지를 구현했다.
프로젝트 깃헙은 https://github.com/hyeonjun4460/blog_nodePrac2 여기다.
단지 라이브러리만 활용하는 것을 넘어서, 클라이언트와 서버 간 통신이 어떻게 이루어지는지, 로그인/회원가입/사용자 인증 기능을 구현하기 위해서는 이 통신을 어떻게 컨트롤해야할 지를 실제적으로 배울 수 있었던 좋은 경험이었다.
이 프로젝트를 구현하면서 가장 핵심적인 것은 역시나 로그인 정보를 통신/저장하는 방법을 어떤 것으로 선택하는가? 였다고 생각한다.
다른 팀원들이 로그인/회원가입, 사용자 인증 기능을 구현한 방식까지 살펴본 결과, 로그인 정보를 저장/통신하는 방법은 다음과 같은 차원으로 구분되는 것으로 파악되었다.
각 방법에는 당연히 장/단점들이 있을 것이다. 나는 토큰과 로컬 스토리지 방식을 선택했는데, 그 이유는 다음과 같다.
이 방식을 채택하고나서 나는 다행히도 CSRF, XSS와 같은 웹 해킹도 적절하게 방어하면서, 구체적인 로그인 정보가 필요한 API마다 사용자 인증을 (나름은) 엄격하게 실시하는 게시판 페이지를 구현해낼 수 있었다.
아직 프로젝트에서 활용한 개념들의 원리와 배경이 100% 이해되지는 않았지만, 해당 개념들을 적절하게 활용하여 프로젝트를 구현했다는 것만으로 node.js 환경에서 API를 제작하는 것에 대해 큰 자신감을 얻을 수 있었다.
앞으로 지속적으로 내가 구현했던 기능들에 적용된 개념들에 대해서 정리해나가면서, 개발 환경, 서비스 환경에 따라 적합한 방법을 선택할 수 있는 개발자가 되도록 노력할 것이다.
사실 이번 프로젝트를 진행하면서, 가장 해보고 싶었던 것은 다름아닌 MySQL을 활용하는 것이었다. 그 이유는 여태까지 NoSQL의 한 종류라고 할 수 있는 mongoDB만 활용해봤기 때문이다. 백앤드 개발자가 되기 위해 계속 공부를 하고 있는 과정이기 때문에, 한 가지라도 더 다양한 프레임워크들을 사용해보는 것이 좋은 경험이 될 것이라 생각했기 때문이다.
하지만, 로그인/회원가입 그리고 사용자 인증 기능을 서버와 클라이언트 모두에 구현하는 데 시간을 모두 할애했기 때문에, 아쉽게도 MySQL을 프로젝트에 적용해보지 못했다. 그래서 이번주에는 최대한 개인 과제를 빠르게 마무리하고,개인적으로 MySQL을 블로그 프로젝트에 적용해보려고 한다. 꼭 달성해서 다음 WIL에는 이 경험에 대해서 언급할 수 있으면 좋겠다.
이번 WIL에서는 MySQL을 적용하지 못한 아쉬움을 뒤로하고, DB란 무엇이고, NoSQL, SQL, ORM의 개념에 대해서 내가 여태껏 배운 개념들을 간단하게 기록해보고자 한다.(물론 DB, NoSQL, SQL, ORM에 대해서는 추가적인 공부를 하고 따로 CS 태그에 포스트를 업로드하기도 할 것이다.)
DB
는 우리가 흔히 아는 그 '데이터베이스'를 의미한다. 데이터베이스는 데이터를 체계적으로 관리하고, 효율적으로 사용하기 위해 사용하는 것이다. 그리고 프로그래밍 과정에서 이 데이터베이스를 관리하고 운영하기 위해 사용하는 서비스(소프트웨어)는 DBMS
라고 한다.
이 DB는 크게 두 종류로 구분된다. SQL
그리고 NoSQL
이다. 먼저 SQL에 대해 이야기해보자면, SQL은 다음과 같은 데이터베이스를 의미한다.
SQL은 관계형 데이터베이스 소프트웨어(RDBMS)
를 사용하는데 활용되는 언어라고 할 수 있다. 그래서 SQL의 특징은 곧 RDBMS의 특징을 가진다고 생각한다. RDBMS의 특징은 다음과 같다.
ACID(원자성, 일관성, 고립성, 지속성)
의 특징을 가지고 있고, DB에서 여러 일련의 작업들을 하나의 작업으로 간주한다.이러한 SQL에 해당하는 대표적인 서비스로는 오라클, MySQL 등이 있다. SQL은 데이터를 체계적이고 효율적으로 관리, 사용할 수 있다. 하지만, 데이터가 관계에 기반해서 구축되기 때문에, Collection에 새로운 Index를 추가하는 것과 같은 유연한 작업이 어렵다는 단점이 있다. 한편, NoSQL은 다음과 같은 특징을 가지고 있다.
NoSQL은 SQL에 대비되는 개념으로, 비관계형 데이터베이스
라고 할 수 있다. 즉, RDBMS과 같이 데이터를 관계에 기반해서 저장, 관리하는 DB를 제외한 모든 DB는 NoSQL이라 할 수 있는 것이다. mongoDB가 대표적인 NoSQL이다. NoSQL은 다음과 같은 특징을 가지고 있다.
한편, Node.js 환경에서는 mongoose 라이브러리를 통해 NoSQL환경에서도 스키마를 생성하여, Collection을 좀 더 체계적으로 관리할 수 있도록 지원해주고 있다.
객체 - 관계 매핑(Object Relational Mapping)을 의미한다. RDBMS를 좀 더 유연하게 활용하기 위해 활용되는 것으로 이해했다.
ORM은 다음과 같은 이유로 인해 RDBMS 환경에서 많이 사용된다.
즉, ORM은 OOP 구조에서 RDBMS를 보다 효율적이고 유연하게 활용하기 위해 사용되는 방법이라고 할 수 있을 것 같다. 이번 주에 이에 대해서 추가적으로 구현과 공부를 진행하면서 다시 더 정확한 내용으로 포스트를 올리도록 하겠다.
항해99가 계속 진행되면서, 점점 과제를 클리어하는 것만으로도 한 주가 벅차게 느껴지는 것 같다. 하지만 2주 뒤부터는 프론트앤드와 협업하는 '프로젝트 챕터'가 시작되기 때문에, 다음주까지 최대한 백앤드와 관련한 기본 개념들을 숙지해두는 것이 매우 중요할 것이라 생각한다.
하지만 나는 이번주에 개념 공부를 그렇게 꼼꼼하게 하지도 못했고, 공부한 내용을 많이 정리하지도 못했다. 임시글에 쌓여있는 많은 CS 태그 포스트들이 그 증거이다... 발단은 구현 자체에 시간을 많이 쏟기도 했지만, 개념에 대해 공부를 할 때 한번에 제대로 정리를 못했던 것이라고 생각한다.
그래서 다음주는 이번주보다 좀 더 시간을 쏟고, 개념 공부하는 그 순간에 더 집중해서, 이번주에 정리하지 못한 CS 태그 포스트들을 마무리해야겠다.