JS forEach
배열과 Map 객체에서 사용할 수 있는 개선된 for문 메서드이다.
Array
배열에서 요소를 하나 꺼내서 콜백 함수의 파라미터로 전달해 준다.
파라미터는 요소 값, 요소 인덱스, 배열 전체 순서이다.
const testArr = [1, 2, 3, 4, 5];
testArr.forEach(function (value, idx, arr) {
console.log(`value: ${value}, idx: ${idx}, arr: ${arr}`);
})
Map
Map의 key-value 쌍을 하나 꺼내서 콜백 함수의 파라미터로 전달해 준다.
파라미터는 value, key, Map 전체 순서이다.
const testMap = new Map();
testMap.set(1, 'One');
testMap.set(2, 'Two');
testMap.set(3, 'Three');
testMap.forEach(function (value, key, map) {
console.log(`value: ${value}, key: ${key}, map: ${map}`);
})
JS map
배열의 메서드 중 하나이다. 배열의 모든 요소를 각각 차례로 콜백 함수에게 파라미터로 전달하고 콜백 함수는 결과를 반환하는데, 이 반환값들을 모아 새로운 배열을 반환한다.
forEach 메서드와의 차이는 반환 여부이다. forEach 메서드에서 반환을 하고 변수로 받아서 출력해 보면 undefined라고 출력되는 것을 확인할 수 있지만 map 메서드는 배열을 반환한다.
const arr = [1, 2, 3, 4, 5];
const arrForEach = arr.forEach(function (value, idx) {
return value * 2;
})
const arrMap = arr.map(function (value, idx) {
return value * 2;
})
console.log(`forEach: ${arrForEach}`);
console.log(`map: ${arrMap}`);
리팩토링(Refactoring)
리팩토링은 SW의 코드 내부 구조를 변경하는 것을 말한다.
리팩토링을 해서 얻을 수 있는 장점은 다음과 같다.. 클린 코드를 작성해야 하는 이유와 동일하다.
- 가독성
- 성능 향상
- 안정성
리팩토링은 다음과 같은 경우에 수행한다.
- 에러가 여러 번 발견되었을 때
- 리팩토링 하면서 에러를 발견한 경우
- 기능을 추가하기 전
- 기존 기능의 정상 동작 여부
- 기능 추가 시 원래 작성해 둔 코드의 변경 여부
- 깔끔하게 구조적으로 추가 가능한가
- 통일감
리팩토링을 수행하면 안 되는 경우도 있다. 배포, 운영 직전에는 코드를 수정하면 안 된다. 수정한 코드에 대해 전체 테스트를 다시 수행해야 하기 때문이다.
유튜버 API 설계
전체 유튜버 조회
조회이므로 GET 메서드를 사용하고, 경로는 '/youtubers'이다.
현재 유튜버들의 정보가 id와 object(채널명, 구독자 수, 동영상 수)의 쌍으로 Map에 저장되어 있다. 이것을 key는 id, value는 object인 JSON으로 바꿔서 응답으로 보내준다.
app.get('/youtubers', function (req, res) {
const youtubers = {};
db.forEach(function (youtuber, id) {
youtubers[id] = youtuber;
})
res.json(youtubers);
})
개별 유튜버 삭제
삭제이므로 DELETE 메서드를 사용하고, 개별이므로 경로는 '/youtubers/:id'이다.
요청으로 들어온 id를 사용하여 해당 id가 DB에 존재하는지 확인하여 존재한다면 DB에서 삭제하고, 삭제된 채널명을 알려주는 메시지를 응답으로 보낸다. 존재하지 않는 id일 경우 없는 유튜버라는 메시지를 보낸다.
app.delete('/youtubers/:id', function (req, res) {
const id = parseInt(req.params.id);
const youtuber = db.get(id);
let msg = '';
if (youtuber) {
const channelTitle = youtuber.channelTitle;
db.delete(id);
msg = `${channelTitle}님, 아쉽지만 다음에 또 뵙겠습니다.`;
} else { // undefined
msg = `요청하신 ${id}번은 없는 유튜버입니다.`
}
res.json({
message: msg
});
})
전체 유튜버 삭제
삭제이므로 DELETE 메서드를 사용하고, 전체에 대한 작업이므로 경로는 '/youtubers'이다.
삭제를 성공적으로 수행하면 DB를 비우고, 전체 유튜버가 삭제되었다는 메시지를 발송한다,
DB가 비어있어서 삭제할 유튜버가 없는 경우 삭제할 유튜버가 없다는 메시지를 발송한다.
app.delete('/youtubers', function (req, res) {
let msg = '';
if (db.size) {
db.clear();
msg = '전체 유튜버가 삭제되었습니다.';
} else {
msg = '삭제할 유튜버가 없습니다.';
}
res.json({
message: msg
});
})
개별 유튜버 수정
수정이므로 PUT 메서드를 사용하며, 개별이므로 경로는 '/youtubers/:id'이다.
유튜버의 id, 바꾸려는 채널명을 전달받아서 수정 후 이전 채널명과 수정된 채널명을 알려주는 메시지를 발송한다. 유효하지 않은 채널명인 경우 잘못된 채널명임을, 존재하지 않는 id에 대한 수정 요청이면 없는 유튜버임을 알려주는 메시지를 발송한다.
app.put('/youtubers/:id', function (req, res) {
const id = parseInt(req.params.id);
const newChannelTitle = req.body.channelTitle;
const youtuber = db.get(id);
let msg = '';
if (youtuber && newChannelTitle) {
const oldChannelTitle = youtuber.channelTitle;
msg = `${oldChannelTitle}님, 채널명이 ${newChannelTitle}으로 변경되었습니다.`
youtuber.channelTitle = newChannelTitle;
db.set(id, youtuber);
} else if (!newChannelTitle) { // 채널명이 누락된 경우
msg = `${newChannelTitle}은 잘못된 채널명입니다.`
} else { // DB에 존재하지 않는 경우
msg = `요청하신 ${id}번은 없는 유튜버입니다.`;
}
res.json({
message: msg
});
})
HTTP 상태 코드
코드 | 설명 |
1xx | 요청을 받았으며 작업을 계속함 |
2xx | 클라이언트가 요청한 동작을 서버가 수신하여 성공적으로 처리함 |
3xx | 요청 완료를 위해 클라이언트가 추가 작업을 해야 함 |
4xx | 잘못된 요청이거나 유효한 요청이 아님 |
5xx | 서버가 유효한 요청에 대한 수행을 하지못함 |
아래는 자주 보게 되는 상태 코드이다.
코드 | 설명 |
200 | 조회, 수정, 삭제 성공 |
201 | 등록 성공 |
404 | URL과 메서드가 일치하는 API가 존재하지 않음 |
500 | 서버에서 치명적인 오류가 발생한 경우 |
'데브코스' 카테고리의 다른 글
[4주차 - DAY5] Node.js 및 Express.js를 사용한 서버 개발 실습(3) (1) | 2024.03.22 |
---|---|
[4주차 복습 발표] API 설계 실습 (0) | 2024.03.21 |
[4주차 - DAY3] Node.js 및 Express.js를 사용한 서버 개발 실습(1) (0) | 2024.03.20 |
[4주차 - DAY2] REST API 디자인 및 구현(2) (1) | 2024.03.19 |
[4주차 - DAY1] REST API 디자인 및 구현(1) (0) | 2024.03.18 |