[포스코DX|NodeJS|12주] 51일차 수업
포스코DX X 비트교육센터 6기 - Node.js
Json Exception 처리
globalExceptionHandler.java
- String accept = request.getHeader(“accept”);
: 클라이언트 요청에서 accept 헤더를 읽어와서 어떤 종류의 응답이 요청되었는지를 확인.
- if (accept.matches(“.application/json.”)):
: JSON 응답을 요청한 경우를 확인하는 조건문
package com.poscodx.mysite.exception;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.poscodx.mysite.controller.dto.JsonResult;
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Log logger = LogFactory.getLog(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
public void handlerException(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
//0. 요청 구분
// json 요청: accept에 application/json (o)
// html 요청: accept에 application/json (x)
String accept = request.getHeader("accept");
//1. 404 Error 처리
if(e instanceof NoHandlerFoundException) {
if(accept.matches(".*application/json.*")) {
JsonResult jsonResult = JsonResult.fail("404 Not Found");
String jsonString = new ObjectMapper().writeValueAsString(jsonResult);
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/json; charset=utf-8");
OutputStream os = response.getOutputStream();
os.write(jsonString.getBytes("utf-8"));
} else {
request
.getRequestDispatcher("/WEB-INF/views/error/404.jsp")
.forward(request, response);
}
return;
}
//2. 로깅(Logging)
StringWriter errors = new StringWriter();
e.printStackTrace(new PrintWriter(errors));
logger.error(errors.toString());
//3. 사과 페이지
if(accept.matches(".*application/json.*")) {
JsonResult jsonResult = JsonResult.fail(errors.toString());
String jsonString = new ObjectMapper().writeValueAsString(jsonResult);
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/json; charset=utf-8");
OutputStream os = response.getOutputStream();
os.write(jsonString.getBytes("utf-8"));
} else {
request.setAttribute("errors", errors.toString());
request
.getRequestDispatcher("/WEB-INF/views/error/exception.jsp")
.forward(request, response);
}
}
}
- jsp의 js에서 ajax를통해 success부분의 코딩을 통해 해당 내용을 불러일으킬 수 있다.
Node.js
node 프로젝트(application, library) 만들기
1) 프로젝트 생성: mkdir로 디렉터리 만들기 (mkdir helloweb01) 2) 프로젝트 이동: cd 프로젝트 디렉토리명 (cd helloweb01) 3) 프로젝트 초기화: 프로젝트 메니페스트 파일(package.json)을 생성 [project-ex01]$ npm init -y
모듈 학습
- 파일 구조
서버 실행하기 (코어 모듈)
- app01.js
var http = require("http");
// 요청 handler
var server = http.createServer(function (req, resp) {
resp.writeHead(200, {
"Content-Type": "text/html",
});
resp.end("<h1>Hello World</h1>");
});
// 서버 실행
server.listen(9090, function () {
console.log("server starts...[9090]");
});
nodemon (npm 모듈)
npm i -D nodemon
{
"name": "helloweb01",
"version": "1.0.0",
"description": "",
"main": "app01.js",
"scripts": { //이곳 변경
"start": "node app02",
"dev": "npx nodemon app02"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"nodemon": "^3.0.1"
}
}
npm start
npm run dev
- app02.js
var http = require("http");
var fs = require("fs");
var server = http.createServer(function (req, res) {
console.log(req.url);
if (req.url === "/") {
req.url = "/index.html";
}
fs.readFile(__dirname + "/public" + req.url, function (error, data) {
res.writeHead(200, {
"Content-Type": "text/html",
});
res.end(data);
});
});
server.listen(9090, function () {
console.log("server starts...[9090]");
});
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1> hi </h1>
</body>
</html>
파일 모듈
- app01.js
/**
* poscodx-math 파일 모듈 테스트
*/
var math = require('./poscodx-math');
console.log(math.PI)
첫번째 방법
- poscodx-math.js
module.exports = {
PI: 3.14,
min: function () {
var min = Number.MAX_SAFE_INTEGER;
Array.from(arguments).forEach(function (e) {
if (e < min) {
min = e;
}
});
return min;
},
max: function () {
var max = Number.MIN_SAFE_INTEGER;
Array.from(arguments).forEach(function (e) {
if (e > max) {
max = e;
}
});
return max;
},
};
// 에러~~!
// exports.a = 10;
두번째 방법
- poscodx-math.js
exports.PI = 3.14;
exports.min = function () {
var min = Number.MAX_SAFE_INTEGER;
Array.from(arguments).forEach(function (e) {
if (e < min) {
min = e;
}
});
return min;
};
exports.max = function () {
var max = Number.MIN_SAFE_INTEGER;
Array.from(arguments).forEach(function (e) {
if (e > max) {
max = e;
}
});
return max;
};