웹 백엔드

Node.js - API와 HTTP 모듈

토리쟁이 2024. 1. 25. 23:59

이번 포스팅에서는 node.js로 웹 페이지에 접속하기 위한 기초적인 개념들을 공부해 보고자 한다.

 

 


 

 

 

 

 

API(Application Programming Interface)

  • 여러 프로그램들과 데이터베이스, 기능들의 상호 통신 방법을 규정하고 도와주는 매개체
  • 애플리케이션과 웹 서버 사이에서 중개자의 역할을 하며 시스템 간 데이터 전송을 처리
  • 역할
    • 서버와 데이터베이스에 대한 출입구 역할
    • 애플리케이션과 기기가 데이터를 원활히 주고 받을 수 있도록 돕는 역할
    • 모든 접속을 표준화하여 누구나 동일한 액세를 얻을 수 있게 하는 역할
  • 장점
    • 기존 시스템과의 호환성 유지
    • 시스템 간의 상호작용 용이성
    • 데이터 접속의 표준화와 편의성
    • 자동화와 확장성
    • 개발 시간 단축 및 비용 절감
    • 개발자 간 협업 용이성
    • 비즈니스 확장 용이성
  • 단점
    • API 변경시 호환성 문제 발생 가능성
    • 보안 이슈
    • 소유권 문제 발생 가능
    • API를 사용하기 위해 이해하고 구현해야하는 높은 기술적 요구사항
  • 유형
    • private API, public API, partner API

 

 

 

REST API(Representational State Transfer API)

  • REST 아키텍처 스타일의 디자인 원칙을 준수하는 API
  • 즉, REST 기반으로 만들어진 API
  • RESTful API 라고도 함
  • HTTP 통신에서 CRUD 요청을 resouce+method로 표현, 특정한 형태로 전달
  • 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 떄문에 웹의 장점을 최대한 활용할 수 O
  • 그렇다면 REST가 무엇일까?
    • 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것
    • HTTP URL을 통해 자원을 명시하고(웹의 모든 자원에 고유한 http url 부여)
    • HTTP Method(post/get/delete/patch 등)를 통해
    • 해당 자원에 대한 CRUD 처리를 적용
    • 특징: 서버-클라이언트 구조/ 무상태/ 캐시처리 가능/ 계층적
  • 장점
    • HTTP 프로토콜의 인프라를 그대로 사용 → REST API를 위한 별도의 인프라 구축할 필요 X
    • HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용 가능
    • 명확해서 의도하는 바를 쉽게 파악 가능
    • 서버와 클라이언트의 역할을 명확하게 분리
    • 애플리케이션 분리 및 통합
  • 단점
    • 표준 존재X
    • HTTP Method 형태가 제한적

 

이 포스팅은 API만 중점적으로 다루는 글이 아니다보니, 간단하게 개념과 특징만 정리하고 넘어가겠다.

 

 

 

 

node.js에서 서버를 구축하는 방법은 기본적으로 httpexpress가 있는데

express는 다운받아야 하고, http는 내장되어 있어서 그냥 불러와서 사용하면 된다.

 

 

 

 

 

 

 

http 모듈

  • node.js를 통해 서버를 구축하는 방법 중 하나
  • 웹 서버를 구동하기 위한 node.js 내장 웹 모듈
  • server 객체, request 객체, response 객체를 사용함
    • server 객체: 웹 서버를 생성할 때 사용하는 객체
    • request 객체: 응답 메시지를 작성할 때 첫 번째 매개변수로 전달되는 객체
    • response 객체: 응답 메시지를 작성할 때 두 번째 매개변수로 전달되는 객체
  •  낮은 코드 가독성 & 확장성

 

 

서버를 생성하고 조작하는 예시 코드는 다음과 같다.

const http = require("http"); // http 불러오기
const fs = require("fs"); // 원하는 파일 불러오기 위해 fs 불러오기

const PORT = 8086; // 원하는 포트번호 작성

// 서버 생성
const server = http.createServer(function(request, response){
	try{
	const data = fs.readFileSync("./index.html"); // index.html 파일을 읽어들임
    
    // response 객체
    // 응답 헤더 작성
    /* response.writeHead(상태코드, 헤더정보)
            - teext/html: 응답의 콘텐트 형식이 HTML이라는 의미
            - 인코딩 방식은 utf-8
       */
    response.writeHead(200, { "content-type": "text/html; charset=utf-8" });
    // 응답 본문 작성
    response.write(data); // 위에서 읽어들인 index.html 파일
    // 응답 본문 작성 후 응답 종료
    response.end();
	}catch(error){ // 에러 발생시 실행되는 코드 작성
    // 에러시, 만들어 둔 404 페이지를 띄울 것이며, 로직은 위와 동일함
    const err = fs.readFileSync("./404.html");
    response.writeHead(200, { "content-type": "text/html; charset=utf-8" }); //200은 상태코드이며, html로 보낼 것이고 인코딩 방식은 utf-8로 -
    response.write(err);
    response.end(); // 응답 종료
	} finally{
    // 예외 발생과 상관없이 모두 실행시키고 싶은 경우에 작성
    console.log("성공 실패 모두 실행됨");
    }

});

 

 

 

 

 

const http = require("http");
const PORT = 8086;
const server = http.createServer(); // 서버 생성

// listen(포트번호, 실행 함수): 서버를 실행하고 클라이언트를 기다림
server.listen(POPT, function(){
	console.log('위에서 선언한 8086번 포트로 서버 실행');
})


/* on(): 서버 객체에 이벤트 등록 */
/*
	이벤트 종류
    - request, connection, close, checkContinue, upgrade, clientError
*/

// 1. request 이벤트: 클라이언트가 요청할 때 발생하는 이벤트
server.on("request", function () {
  console.log("request 이벤트 실행");
});

// 2. connection 이벤트: 클라이언트 접속했을 때 발생하는 이벤트
server.on("connection", function (req, res) {
  console.log("connection 이벤트 실행");
});

 

 

 

 

 

http 응답에는 상태 코드가 존재하는데, 상태에 따라 다음과 같은 번호로 표현된다.

 

자주 등장하는 상태 코드

  • 1XX : 처리중
    • 100: continue, 102: processing
  • 2XX: 성공
    • 200: OK, 201: Created, 202: Accepted
  • 3XX: 리다이렉트(다른 페이지로 이동)
  • 4XX: 요청 오류
    • 400: 잘못된 요청, 401: 권한 없음, 403: 금지됨, 404: 찾을 수 없음
  • 5XX: 서버 오류

 


참고

https://hahahoho5915.tistory.com/54 

https://www.ibm.com/kr-ko/topics/api

https://www.hanl.tech/blog/api%EB%9E%80-api%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EC%A2%85%EB%A5%98-%EC%9E%A5%EB%8B%A8%EC%A0%90/

'웹 백엔드' 카테고리의 다른 글

Node.js - 비동기 처리  (1) 2024.01.27
Node.js - Express 모듈과 EJS 템플릿  (1) 2024.01.26
Node.js  (1) 2024.01.22
서버(Server)와 프로토콜  (0) 2024.01.22
웹 프로그래밍 시작하기  (0) 2022.10.05