인프런 커뮤니티 질문&답변

hyese ch님의 프로필 이미지
hyese ch

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

Boolean 값 update 문제

작성

·

755

0

안녕하세요

아래와 같이 코드를 작성했는데 is_answered에 true로 defaultValue를 설정한 값이 변경되지 않아 질문 드립니다.

Answer에 Ask가 1대1관계로 묶여 있고,

유저가 Answer를 삭제하는 경우 Answer 자체는 삭제하지만 연결된 Ask는 삭제하지 않고 is_answered라는 값을 false로 변경하는 작업을 하려고 합니다. 

rest에 어긋나긴 하지만 위와 같이 코드를 작성했는데, req.params.answerId, req.params.askId 이렇게 두 개를 받아올 수 있는 건가요? 이 부분에서 문제가 생긴 것인지 아니면, try catch  구문 안에 await를 두 번 써서 그런 것인지 0로 설정된 is_answered의 기본값이 바뀌지 않습니다. 물론 요청 자체는 성공적으로 됩니다.(delete 요청이기 때문에)

조언 부탁드립니다 ㅠ 

답변 11

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네 그러니까 각 라우터가 실행되면 콘솔에 쿼리문이 뜰 것입니다. UPDATE나 DELETE로 시작하는 것들요.

0

hyese ch님의 프로필 이미지
hyese ch
질문자

해결되었습니다. snake case로 설정해서 그렇게 설정 되었다고 생각했는데 isAnswered로 되어 있었습니다. 감사합니다!

0

hyese ch님의 프로필 이미지
hyese ch
질문자

라우터는 post와 delete 전부 잘 실행됩니다. 

패치는 update를 말하려고 했던 건데 잘못 이야기해서 혼선을 드린 것 같네요.

지금 하려는 것은 post 라우터 안쪽에서 answer create와 ask update를 실행하고

delete 라우터 안쪽에서 answer destroy와 ask update를 실행하는 것입니다.

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

갑자기 patch는 왜 또 나오나요? delete가 안 되는 거 아니셨어요? 라우터 안에 콘솔 찍어서 라우터가 실행되는지부터 확인해보세요.

0

hyese ch님의 프로필 이미지
hyese ch
질문자

answer를 작성하면 answer 디비에 잘 들어가고, 다만 patch만 되지 않아서... 혹시 실수가 있는데 제가 모르는 건지ㅠㅠ 조언 부탁드립니다...

0

hyese ch님의 프로필 이미지
hyese ch
질문자

프론트 saga에서 answer 게시와 삭제는 아래와 같이 작성했습니다.


// Add Answer
function addAnswerAPI(data) {
return axios.post(`/answers/${data.askId}`, data);
}

function* addAnswer(action) {
try {
const result = yield call(addAnswerAPI, action.data);
yield put({
type: ADD_ANSWER_SUCCESS,
data: result.data,
});
} catch (err) {
yield put({
type: ADD_ANSWER_FAILURE,
error: err.message,
});
}
}

// REMOVE ANSWER
function removeAnswerAPI(data) {
return axios.delete(`/answers/${data.answerId}/delete/${data.askId}`);
}

function* removeAnswer(action) {
try {
const result = yield call(removeAnswerAPI, action.data);
yield put({
type: REMOVE_ANSWER_SUCCESS,
data: result.data,
});
} catch (err) {
yield put({
type: REMOVE_ANSWER_FAILURE,
error: err.message,
});
}
}

그리고 백엔드 코드에서 answer 게시(+연결된 ask의 is_answered: true)로 변경, answer 삭제(+ 연결된 ask의 is_answered:false)로 변경하는 코드는 다음과 같이 작성했습니다.

// 특정 질문에 대답하기 POST /answers/askId
router.post("/:askId", isLoggedIn, async (req, res, next) => {
try {
const ask = await Ask.findOne({
where: { id: req.params.askId },
});
if (!ask) {
// 해당 질문이 없으면 리다이렉트
return res.status(403).send("존재하지 않는 ask입니다.");
}
// 해당 질문이 있으면 is_answered를 true로 변경
await Ask.update(
{
is_answered: true,
},
{
where: { id: req.params.askId },
}
);

const answer = await Answer.create({
content: req.body.answer,
linked_ask_id: req.params.askId,
target_user_id: req.user.id,
});

// 리다이렉트 걸어주면 좋겠다...
res.status(201).json(answer);
} catch (err) {
console.error(err);
next(err);
}
});

// 특정 답변 삭제하기
router.delete(
"/:answerId/delete/:askId",
isLoggedIn,
async (req, res, next) => {
try {
// 해당 답변에 연결된 ask의 is_answered 컬럼값 false로 변경
await Ask.update(
{
is_answered: false,
},
{
where: { id: req.params.askId },
}
);

// 답변 삭제
await Answer.destroy({
where: {
id: req.params.answerId,
target_user_id: req.user.id,
},
});

res.status(201).send("답변을 삭제했습니다.");
} catch (err) {
console.error(err);
next(err);
}
}
);

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

update랑 delete가 떠야 하는데요? 라우터가 호출 안되는 것 아닌가요?

0

hyese ch님의 프로필 이미지
hyese ch
질문자

Executing (default): SELECT `id`, `email`, `username`, `password`, `created_at` AS `createdAt`, `updated_at` AS `updatedAt` FROM `users` AS `User` WHERE `User`.`id` = 1;

Executing (default): SELECT `id`, `nickname`, `content`, `is_answered` AS `isAnswered`, `created_at` AS `createdAt`, `updated_at` AS `updatedAt`, `target_user_id` FROM `asks` AS `Ask` WHERE `Ask`.`id` = '10';

Executing (default): INSERT INTO `answers` (`id`,`content`,`created_at`,`updated_at`,`target_user_id`,`linked_ask_id`) VALUES (DEFAULT,?,?,?,?,?);

위의 쿼리는 is_answered 기본값을 true로 변경하려고 할 때 뜨는 쿼리입니다.

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

저건 테이블 만드는 쿼리이고요. delete 라우터가 실행될 때도 쿼리 뜨는게 그걸 보여주세요.

0

hyese ch님의 프로필 이미지
hyese ch
질문자

백엔드 콘솔에는

`is_answered` TINYINT(1) DEFAULT false

이렇게 뜹니다.

전체는

Executing (default): CREATE TABLE IF NOT EXISTS `asks` (`id` INTEGER NOT NULL auto_increment , `nickname` VARCHAR(30), `content` VARCHAR(1500) NOT NULL, `is_answered` TINYINT(1) DEFAULT false, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, `target_user_id` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`target_user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

Executing (default): SHOW INDEX FROM `asks` FROM `asker`

이렇게 뜨고요!  underscored: true,

스네이크 케이스로 설정을 변경했습니다.

그래서 문제가 없다고 생각했는데, 값이 변경이 되지 않네요..ㅜㅜ

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

params는 문제가 없고요. 모델 컬럼명에 _를 쓰신 게 맞죠? 제 강좌에서처럼 캐멀케이스로 한 게 아니라요.

백엔드쪽 콘솔에도 SQL 쿼리가 뜰 텐데 확인해보세요.

hyese ch님의 프로필 이미지
hyese ch

작성한 질문수

질문하기