리펙토링을 진행 중
프로젝트 때, 백엔드 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;
};
위에 경우는 객체분할 하지 않은 변수를 인자로 보내주었는데, 프론트에서 받은값이 많은 경우, 객체분할 했을 때, 코드가 길어져서 데이터를 사용할 때, 따로 접근해주었다.
// 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 에서 변수를 사용하는 곳에 해당 변수 안에 있는 배열을 따로 접근 해줘야 했다.
user.findOne({
where: {
[Op.or]: [{ id: info }, { email: info }],
},
});
위에 특수 연산자를 사용하면 findOne 함수를 두개를 만들 필요가 없어진다.
인자 안에 정보들이 담겨있는데 id 또는 email 을 받으면 해당 데이터를 조회할 수 있게 되었다.
SELECT * FROM user WHERE id = info OR email = info
위에 메서드를 mysql 쿼리 문으로 바꾸면 위에처럼 해석할 수 있다는 것도 알았다.
res.status(200).json({});
response 로 프론트에 보낼 데이터가 없다 해도 json({}) 로 안에 빈객체를 보내주어야 api 가 실행됐다.