Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[7주차/코디] 워크북 제출합니다. #65

Merged
merged 3 commits into from
Nov 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 152 additions & 0 deletions keyword/chapter07/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
- 미들웨어
- 요청 오브젝트, 응답 오브젝트, 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는 함수임. 그 다음 미들웨어 함수는 일반적으로 next라는 변수로 표시됨.
- 다음과 같은 미들웨어가 있음
- 애플리케이션 레벨 미들웨어
- 라운터 레벨 미들웨어
- 오류 처리 미들웨어
- 기본 제공 미들웨어
- 써드파티 미들웨어
- 애플리케이션 레벨 미들웨어 - app.use, app.METHOD() 함수를 이용해 애플리케이션 미들웨어를 앱 오브젝트의 인스턴스에 바인드할 수 있음.
- 하나의 마운트 경로에 여러 미들웨어 함수들을 로드할 수 있음.

```jsx
app.use('/user/:id', function(req, res, next) { //1번 함수
console.log('Request URL:', req.originalUrl);
next();
}, function (req, res, next) { //2번 함수. 순차적으로 실행됨.
console.log('Request Type:', req.method);
next();
});

```

- 라우트 핸들러를 이용하면 하나의 경로에 대해 여러 라우트를 정의할 수 있음. 나머지 미들웨어 함수를 건너뛰려면 next(’route’)를 호출하면 됨.

```jsx
app.get('/user/:id', function (req, res, next) {
// if the user ID is 0, skip to the next route
if (req.params.id == 0) next('route');
// otherwise pass the control to the next middleware function in this stack
else next(); //
}, function (req, res, next) {
// render a regular page
res.render('regular');
});

// handler for the /user/:id path, which renders a special page
app.get('/user/:id', function (req, res, next) {
res.render('special');
});
```

- 라우터 레벨 미들웨어 - express.Router() 인스턴스에 바운드 됨. 애플리케이션 미들웨어와 상당히 유사함.

```jsx
var app = express();
var router = express.Router();

// a middleware function with no mount path. This code is executed for every request to the router
router.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});

// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
router.use('/user/:id', function(req, res, next) {
console.log('Request URL:', req.originalUrl);
next();
}, function (req, res, next) {
console.log('Request Type:', req.method);
next();
});

// a middleware sub-stack that handles GET requests to the /user/:id path
router.get('/user/:id', function (req, res, next) {
// if the user ID is 0, skip to the next router
if (req.params.id == 0) next('route');
// otherwise pass control to the next middleware function in this stack
else next(); //
}, function (req, res, next) {
// render a regular page
res.render('regular');
});

// handler for the /user/:id path, which renders a special page
router.get('/user/:id', function (req, res, next) {
console.log(req.params.id);
res.render('special');
});

// mount the router on the app
app.use('/', router);
```

- 오류 처리 미들웨어 - 4개의 인수(err, req, res, next)를 가짐.

```jsx
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
});
```

- HTTP 상태 코드


| 상태코드 | 상태 텍스트 | 의미 |
| --- | --- | --- |
| 100 | continue | 계속 진행 |
| 101 | Switching Protocols | 프로토콜 전환 |
| 102 | Processing | 처리 중(타임 아웃 발생 방지) |
| 200 | OK | 요청 처리 성공 |
| 201 | Created | 요청 처리 후 새로운 리소스 생성 |
| 202 | Accepted | 요청은 접수되었으나 처리 미완료 |
| 203 | Non-
Authorative
Information | 응답 헤더가 오리지널 서버로부터 제공되지 않음. 신뢰할 수 없는 정보 |
| 204 | No Content | 처리 후 돌려줄 콘텐츠가 없음. |
| 206 | Partial Content | 콘텐츠 일부만 전송 |
| 207 | Multi-Status | 처리 결과의 스테이터스가 여러 개이다. |
| 300 | Multiple Choices | 선택 항목이 여러 개 있음 |
| 301 | Moved Permanently | 지정한 리소스가 새 URL로 이동 |
| 302 | Found | 요청한 리소스를 다른 URL에서 찾음 |
| 303 | See Other | 다른 위치로 요청 |
| 304 | Not Modified | 수정되지 않음 |
| 305 | Use Proxy | 리소스에 액세스하려면 프록시를 이용해야 함. |
| 400 | Bad Request | 잘못된 요청 |
| 401 | Unauthorized | 권한 없음 |
| 402 | Payment Required | 결재 필요 |
| 403 | Forbidden | 액세스 금지됨 |
| 404 | Not Found | 리소스를 찾을 수 없음 |
| 405 | Method Not Allowed | 지정한 메소드를 지원하지 않음 |
| 406 | Not Acceptable | 클라이언트가 지정한 항목에 처리할 수 없음 |
| 407 | Proxy
Authentication
Required | 클라이언트는 프록시 서버에 인증이 필요함 |
| 408 | Request Timeout | 요청 시간초과 |
| 409 | Conflict | 충돌 발생 |
| 410 | Gone | 리소스가 사라짐 |
| 411 | Length Required | 요청 헤더에 Content-Length 지정 |
| 412 | Precondition Failed | 사전 조건이 서버와 일치하지 않음 |
| 413 | Request Entity Too Large | 요청 메시지가 너무 큼 |
| 414 | Reques-URI Too Large | 요청 URI가 너무 긺 |
| 415 | Unsupported Media Type | 지원되지 않는 미디어 형식 |
| 416 | Range Not Satisfiable | 처리할 수 없는 요청 범위 |
| 417 | Expectation Failed | 클라이언트의 Expect 헤더를 인식 불가능 |
| 422 | Unprocessable Entity | 클라이언트의 XML의 의미에 오류 있음 |
| 423 | Locked | 리소스가 잠겨있음 |
| 424 | Failed Dependency | 다른 작업 실패로 본 작업 실패 |
| 426 | Upgrade Required | 클라이언트 프로토콜 업그레이드 필요 |
| 428 | Precondition Required | 사전조건 지정 헤더 필요 |
| 429 | Too Many Requests | 너무 많은 요청 |
| 431 | Request Header Fields Too Large | 헤더의 길이가 너무 큼 |
| 444 | Connection Closed
Without Response | 응답 없이 연결 닫음 |
| 451 | Unavailable For Legal Reasons | 법적 사유로 불가 |
| 500 | Internal Server Error | 내부 서버 오류 |
| 501 | Not Implemented | 구현되지 않음 |
| 502 | Bad Gateway | 게이트웨이 또는 프록시 서버가 잘못된 응답을 받음 |
| 503 | Service Unavailable | 현재 서버에서 서비스 불가 |
| 504 | Gateway Timeout | 게이트웨이 또는 프록시 서버가 응답을 기다리다 타임아웃 발생 |
| 505 | HTTP Version Not Supported | 클라이언트가 요청에 사용한 HTTP 버전을 지원하지 않음 |
| 507 | Insufficient Storage | 서버 저장 공간 부족 |
Binary file added mission/chapter07/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/11.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/12.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/13.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter07/9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
61 changes: 61 additions & 0 deletions mission/chapter07/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
- **미션 기록**

![image.png](./1.png)

API 응답 통일 해주기. 응답이 성공적이면 res.success 실행.

![image.png](./2.png)

에러 처리 미들웨어. 에러가 발생하면 실행됨.

![image.png](./3.png)

응답 통일을 위해 res.status().success()로 응답보내기

![image.png](./4.png)

에러 특정화를 위한 개별의 에러 객체 생성 과정.

![image.png](./5.png)

에러 객체의 정의. Error 객체를 물려받고 errorCode를 부여해준다.

실행 예)

- 상점의 리뷰 불러오기 API의 응답 통일

![image.png](./6.png)

이제 resultType, error유무, 결과 data가 반환되어 실행 결과를 더 직관적으로 알 수 있다.

- 에러 통일화

1.상점에 리뷰 추가

![image.png](./7.png)

상점을 찾을 수 없을 때 나오는 에러이다.

2.미션 수락하기

![image.png](./8.png)

미션 수락하기에서 미션이 이미 수락되었을 때 출력되는 에러이다. 더 직관적으로 에러를 식별할 수 있게 된다.

3. 상점에서 리뷰 불러오기

![image.png](./9.png)

레포지토리에서 리뷰 불러오기를 위해 상점을 찾았을 때 상점이 없으면 null을 반환하고, 상점은 찾았지만 리뷰가 없을때는 리턴된 객체의 길이가 0이라는 걸 이용해 에러 처리

![image.png](./10.png)

![image.png](./11.png)

4.미션 완료 처리하기

![image.png](./12.png)

레포지토리에서 처리한 mission 데이터가 없다면 에러 처리

![image.png](./13.png)