4번째, 프로젝트 리펙토링 : 3계층 나누기 - 02

이정기·2023년 2월 22일
0

TIL

목록 보기
48/71
post-thumbnail

리펙토링을 진행 중

프로젝트 때, 백엔드 CRUD 를 못했던 부분들을 다시 만져봄

필요한 기능들을 부분적으로 3계층을 나누며, 개발하기 시작

개발하면서 로직하고 어려웠던 부분들을 정리


주고 받은 값을 정확히 알고 사용하기

  deleteUser = async userId => {
    return await user.destroy({
      where: { id: userId },
    });
  };

컨트롤러에서 객체분할로 받은 userId 값을 인자로 주었다면, where 문 안에 { 칼럼(id) : 인자(userId) } 를 넣어주어야 한다.

 registerUser = async userInfo => {
    await user.create({
      userName: userInfo.userName,
      password: userInfo.password,
      email: userInfo.email,
      phone: userInfo.phone,
      address: userInfo.address,
      userType: userInfo.userType,
    });

    return;
  };

위에 경우는 객체분할 하지 않은 변수를 인자로 보내주었는데, 프론트에서 받은값이 많은 경우, 객체분할 했을 때, 코드가 길어져서 데이터를 사용할 때, 따로 접근해주었다.

sequlize findAll 과 findOne 차이

//  services
login = async userInfo => {
	const user = await this.userRepositories.getOneUser(userInfo.email);
    const inPasswordCorrect = await bcrypt.compare(
      userInfo.password,
      user.password
    );
};

oneUser = async id => {
  	return await this.userRepositories.getOneUser(id);
  };
-----------------------------------------------------------
// repositories
getOneUser = async info => {
    return await user.findOne({
      where: {
        [Op.or]: [{ id: info }, { email: info }],
      },
    });
  };

getOneUser 함수는 데이터를 하나 받고 저장한 하나의 유저 정보를 가져와 준다. 이 함수의 인자를 다르게 보내 줘도 조회 할 수 있도록 sequelize 조건 조회 Op.or 을 이용 했다.

이것으로 코드를 줄일 수 있었는데, findAll 메서드로 조회를 해 코드가 작동하지 않았다. 알아보니 findAll 은 객체 배열로 결과를 반환해 services 코드 안에서 배열로 받은 데이터의 요소를 제대로 접근해야 실행되었다.

다른 방법으론 findOne 을 이용해 객체로 꺼내주는 방법이였다. findOne 은 결과를 객체로 반환함으로 services에서 따로 코드 수정을 할 필요 없었다.

내가 메서드로 데이터를 가져올 때의 형태를 제대로 확인 후 이용해야 한다는걸 배웠다.

const inPasswordCorrect = await bcrypt.compare(
      userInfo.password,
      user[0].password
    );

findAll 을 사용 했을때 services 에서 변수를 사용하는 곳에 해당 변수 안에 있는 배열을 따로 접근 해줘야 했다.

sequlize 특수연산자

user.findOne({
      where: {
        [Op.or]: [{ id: info }, { email: info }],
      },
    });

위에 특수 연산자를 사용하면 findOne 함수를 두개를 만들 필요가 없어진다.
인자 안에 정보들이 담겨있는데 id 또는 email 을 받으면 해당 데이터를 조회할 수 있게 되었다.

SELECT * FROM user WHERE id = info OR email = info

위에 메서드를 mysql 쿼리 문으로 바꾸면 위에처럼 해석할 수 있다는 것도 알았다.

시퀄라이즈 문법을 잘 정리해놓은 블로그

res json 빈객체 꼭 보내주기

res.status(200).json({});

response 로 프론트에 보낼 데이터가 없다 해도 json({}) 로 안에 빈객체를 보내주어야 api 가 실행됐다.

profile
Node.js 로 꿈을 꾸었다..

0개의 댓글