MVC패턴이란?
MVC란 "Model-View-Controller"의 약자로 소프트웨어 아키텍처 패턴 중 하나이다.
1. Model
데이터와 비지니스 로직을 나타낸다.
애플리케이션의 상태를 관리하고 데이터베이스에서 데이터를 검색하거나 저장할 수 있다.
2. View
사용자의 인터페이스의 시각적 표현을 담당한다.
모델의 데이터를 사용자에게 보여주고 사용자 입력을 처리하여 컨트롤러에게 전달한다.
3. Controller
사용자의 입력을 받아 Model 및 View를 업데이트하는 중간 계층이다.
View로부터 사용자 입력을 받아 Model에 전달하여 비지니스 로직을 수행하고, 그 후 다시 View에 반영하는 담당을 한다.
Service와 Router
Service
실제 개발에서는 Controller가 복잡해지는 경우가 많기 때문에 이러한 문제점을 해결하기 위해 Service가 도입되었다.
Service는 일련의 비지니스 로직들을 캡슐화하는 역할을 한다.
즉, Service는 비지니스 로직 및 연산 등 복잡한 작업들을 처리한다.
-> Controller는 사용자 요청 처리와 응답 생성만 하게 됨.
Router
요청을 컨트롤러로 전달하여 데이터 처리 및 선택을 담당한다.
주로 URL 경로와 HTTP 메서드 등을 기반으로 요청을 처리한다.
Sequelize란?
Sequelize는 Node.js를 위한 Promise 기반의 ORM 라이브러리이다.
주로 SQL 데이터베이스와 상호 작용하는데 사용된다.
Sequelize를 사용하면 JavaScript 코드를 사용하여 SQL 쿼리를 작성할 필요 없이 데이터베이스를 조작할 수 있다.
이는 보다 직관적이고 간편하게 데이터베이스를 다룰 수 있도록 한다.
ORM
ORM은 "Object-Relational Mapping"의 약자로 객체와 관계형 데이터베이스 간의 데이터를 변환하는 기술을 가리킨다.
객체 지향 프로그래밍에서 클래스와 객체를 사용하여 데이터를 모델링하고 DBMS에서는 테이블과 레코드를 사용하여 데이터를 저장한다.
이러한 두 가지 접근 방식은 데이터베이스와 애플리케이션 코드 사이의 복잡성이 증가할 수 있다.
ORM은 이러한 차이점을 해결하기 위해 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 테이블 간의 매핑을 자동으로 처리한다.
ORM을 이용하면 query가 아닌 method로 데이터를 조작할 수 있다는 것이 점과 특정 DB에 종속되지 않는다는 점이 큰 특징이다.
Sequlize를 사용하여 MySQL 연결
Sequelize를 사용하기 위해서는 Sequelize와 RDB 모듈을 설치해야 한다.
본 실습은 MySQL을 사용하기 때문에 Sequelize와 mysql2 모듈을 설치한다.
npm i sequelize mysql2
여기서 중요한 점은 mysql 모듈이 아닌 mysql2 모듈을 사용한다는 점이다.
mysql2
npm에서는 mysql2을 다음과 같이 정의한다.
MySQL client for Node.js with focus on performance. Supports prepared statements, non-utf8 encodings, binary log protocol, compression, ssl much more
성능의 초점을 맞춘 mysql 모듈로, 이진 로그 프로토콜, 압축, utf-8 이외의 유니코드 인코딩, prepared statements가 가능하다.
간단히 mysql 모듈의 업그레이드 버전이다.
sequelize의 쿼리문은 async await을 사용하거나 .then()함수로 값을 핸들링한다.
즉, 비동기적으로 코드를 움직이는데
mysql 모듈은 callback 기반이기 때문에 promise를 사용하지 못하고 mysql2 모듈은 promise를 지원하기 때문에 sequelize에서는 mysql2 모듈을 사용하게 된다.
sequelize-cli
sequelize를 효율적으로 사용하기 위해 sequelize-cli를 설치한다.
sequelize는 migration을 할 수 있도록 돕는 툴로 cli에서 모델을 생성해주거나 스키마 적용을 할 수 있도록 돕는다.
npm i -g sequelize-cli
-g를 통해 sequelize-cli 모듈을 전역으로 설치하면 커멘더 창에서 sequelize 명령어를 실행할 수 있다.
sequelize init
sequelize-cli 명령어를 사용하면 config, migrations, models, sedders 폴더가 생성된다.
config
config 폴더에는 config.json파일이 생성되는데 이 파일은 Sequelize 설정을 정의하는데 사용된다.
주로 데이터베이스 연결 정보와 관련된 설정이 포함되며 DB 커넥션 정보를 각 환경에 맞게 설정할 수 있다.
development는 로컬 개발 환경, test는 테스트 환경, production은 실제 운영 환경에서 사용된다.
본 실습은 로컬에서 개발하고, 실제로 배포하지 않을 것이기 때문에 development에만 각 자신이 사용할 데이터베이스의 이름, 비밀번호, 데이터베이스 이름으로 변경한다.
Model
model 폴더는 model을 정의한 js 파일들을 모아놓은 폴더이다.
models폴더 안에 index.js 파일은 Sequelize 모델들을 로드하고 관리하는 역할로 주로 애플리케이션에서 모델들을 중앙 집중적으로 관리하기 위해 사용한다.
models/index.js 과정
1. config.json 파일의 설정 값을 읽어 sequelize를 생성.
2. models 폴더 아래 존재하는 js 파일을 모두 로딩
3. db 객체에 Model을 정의하여 반환
MySQL 연결
sequelize는 데이터조작(DML) 뿐만 아니라 데이터 정의(DDL)도 지원한다.
즉, DB에 테이블이 없는 상태라면 정의한 Model을 바탕으로 테이블을 생성할 수도 있다.
이를 수행하는 메서드는 sync()이며, sync()는 모델에서 정의한 이름을 갖는 테이블이 존재하지 않을 경우만 동작한다.
즉, sync()메서드를 호출하면 모델을 사용할 준비가 되는 것이다.
DB 연결 성공이 나오면 정상적을 Model이 등록되고, sequelize가 잘 연동된 것이다.
Sequelize로 테이블 생성
먼저 users 테이블을 생성하기 위해 models 폴더 안에 users.js 파일을 만든다.
모델을 정의하는 메서드는 define() 메서드이다.
sequelize("객체 이름", 스키마 정의, 테이블 설정)
현재 user.js는 DB에 users라는 테이블을 정의하고 User라는 객체로 매핑된다.
현재 shop 데이터베이스 안에 users라는 테이블 생성과 함께 컬럼들이 정의되었다.
createdAt과 updataAt 컬럼은 sequelize로 테이블을 생성하였을 때 자동으로 생성된다.
회원가입 및 로그인(Router, Controller, Service)
MVC 패턴 구성
rotues에 로그인 및 회원가입을 라우팅 하기 위한 auth.route.js
Controllers에 로그인 및 회원가입의 요청과 응답을 처리할 auth.controller.js
services에 로그인 기능을 수행할 login.service.js와 회원가입 기능을 수행할 signup.service.js
router 등록
routes폴더에 회원가입과 로그인 라우팅을 하기 위한 auth.route.js 라는 파일을 생성한다.
/signup은 회원 가입 페이지, /login은 로그인 페이지로 각각 post 방식으로 동작한다.
controller와 연결하기 위해 controller에 있는 signup과 login을 불러온다.
Controller
Controller 폴더에 회원가입및 로그인 요청을 처리하기 위한 auth.controller.js 라는 파일을 생성한다.
회원가입하기 위한 userId와, userPassword, userEmail, userPhonenumber를 요청 body에서 추출한다.
Signup 클래스의 인스턴스를 생성하고 createUser 메서드를 호출하여 회원가입을 할 userId와, userPassword, userEmail, userPhonenumber를 전달한다.
user가 있으면 '가입 성공', 그게 아니면 '가입 오류'를 띄우게 된다.
로그인을 하기 위한 userId와 userPassword를 요청 body에서 추출한다.
Login 클래스의 인스턴스를 생성하고 selectUser 메서드를 호출하여 로그인할 userId와 userPasswrod를 전달한다.
userLogin이 있으면 '로그인 되었습니다'. null이면 '아이디나 비밀번호가 잘못되었습니다.' 그게 아니면 '로그인 오류'를 띄운다.
Service
create 메서드를 통해 테이블에 컬럼 값을 추가한다.
findOne 메서드를 통해 회원을 조회한다.
회원 가입 시
로그인 시