Backend/Node.js

(정리) 3계층 구조로 백엔드 회원가입 Rest API 구현

yxemsy 2022. 3. 7. 21:41
Rest API의 핵심은 요청이 왔을 때 응답을 보내는 것이다.

- 회원가입 API

 

1. API 설계하기

 (1) URI 엔드포인트와 HTTP 메소드를 정한다.

  • 회원가입 API이므로 URI는 /user/register 또는 user/create 등으로 정할 수 있다.
  • 회원가입은 사용자 정보를 처음 db에 저장하는 과정이므로 method를 POST로 한다.

 

 (2) 요청으로 받을 데이터(json)과 응답으로 보낼 데이터를 정한다.

  • 회원가입이므로, 사용자 이름, 이메일, 비밀번호 등을 받는다.
  • 프론트에서는 사용자가 누구인지 식별해야하므로, id를 내보낸다.
  • id와 같이 프론트에서 사용할만한 데이터들은 내보내준다.

 

 (3) Mongoose Schema를 만든다.

  • 반환할 json 데이터를 바탕으로 스키마를 만든다.
  • 다음과 같이 만들 수 있다.
const UserSchema = new Schema(
    {
    	id: {
        	type: String,
            required: true,
        },
        email: {
        	type: String,
            required: true,
        },
        name: {
        	type: String,
            required: true,
        },
        password: {
        	type: String,
            required: true,
        },
        description: {
        	type: String,
            required: false,
            default: "설명을 추가해주세요.",
        },
      },
      {
      	timestamps: true,
      }
    )

2. 3계층 구조의 코드 작성하기

3계층 구조는 schema 파일을 제외하면, 다음 3개의 파일이 작성되면 된다.

1. roters 폴더 내에 있을 OOORouter.js
2. services 폴더 내에 있을 OOOService.js
3. db/models 폴더 내에 있을 OOOModel.js (혹은 폴더 이름에 Model이 있으므로 그냥  OOO.js)

 

 (1) OOORouter.js 파일을 만든다.

req, res 표현이 쓰이는 곳이며, URI 엔드포인트와 HTTP 메소드도 이 곳에서 작성된다.

1. 에서 URI(/user/register), HTTP(POST)를 정했으므로, 아래와 같이 함수를 작성한다.

함수 내에서 비동기 처리가 필요하므로 async도 추가한다.

 

const userAuthRouter = express.Router()

userAuthRouter.post("/user/register" async function(req, res, next) {
 ...
 
 }

라우터가 정의 됐으면, 이 라우터 층에서 사용할 서비스 층의 함수(메소드)를 정해야 한다.

서비스 이름은 라우터와 비슷하게 userAuthService라고 해보자. 

 

 

 (2) OOOService.js 파일을 만든다.

3계층 구조는 class를 활용한다. 아래와 같이 메소드를 만들 수 있다.

class userAuthService {
  static async addUser({ name, email, password }) {
   ...
   
   }
}

여기서 또 중요한 것은, 이 서비스 층에서 사용할 모델 층의 함수를 정해야 한다.

모델 이름은 User라고 해보자.

 

 

 (3) OOOModel.js 파일을 만든다.

역시 class로 생성하고 이름을 User로 한다.

이 모델 층에서 Mongoose Model의 쿼리 함수 create, findOne 등이 사용된다.

 

class User {
    static async create({ newUser }) {
     ...
     
    }
 }

 

 

*** 

1) URI 엔드포인트 및 HTTP 메소드 정하기

2) 받을 데이터 형태와 보낼 데이터 형태를 정하고, schema 만들기

3) Router 코드 작성

4) Service 코드 작성

5) Model 코드 작성

***

 

 

 

참고: 엘리스 AI트랙