포스코DX X 비트교육센터 6기 - Node.js


Json Exception 처리

globalExceptionHandler.java

  • String accept = request.getHeader(“accept”);

: 클라이언트 요청에서 accept 헤더를 읽어와서 어떤 종류의 응답이 요청되었는지를 확인.

  • if (accept.matches(“.application/json.”)):

: JSON 응답을 요청한 경우를 확인하는 조건문

image

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부분의 코딩을 통해 해당 내용을 불러일으킬 수 있다.

image


Node.js

node 프로젝트(application, library) 만들기

1) 프로젝트 생성: mkdir로 디렉터리 만들기 (mkdir helloweb01) 2) 프로젝트 이동: cd 프로젝트 디렉토리명 (cd helloweb01) 3) 프로젝트 초기화: 프로젝트 메니페스트 파일(package.json)을 생성 [project-ex01]$ npm init -y

모듈 학습

  • 파일 구조

image

서버 실행하기 (코어 모듈)

image

image

  • 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]");
});

image

image

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>

image

파일 모듈

  • 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;
};


image

let & const

image

const

image