주간 랩업/[SSG] JAVA 기반 백엔드 개발 과정

[19주차] Node.js 1~4일차

hooooolly 2024. 10. 14. 18:52
2024/10/7

 

정신없던 2차 프로젝트가 끝났다. 오늘부터 다시 교육을 시작했다.

파이널 프로젝트에서는 Node.js를 사용하고 Vue.js 프레임워크로 프런트를 개발할 예정이라고 한다. 그래서 오늘은 Node.js를 설치하고 K6를 사용하여 다중 접속 환경을 테스트해 보았다.

Node.js 는 서버 개발에서도 자바스크립트를 사용할 수 있게 해주는 런타임 환경으로 여러 장점이 있다. 

우선, Node.js는 비동기적으로 처리해서 많은 요청을 동시에 처리할 수 있어 성능이 뛰어나고 자원 효율성을 극대화할 수 있다. 그리고 Node.js는 브라우저 내 말고도 다른 환경에서 자바스크립트를 실행할 수 있다.

 

- 논블러킹 (비동기 방식으로 I/O) 

- 노드는 이벤트 기반 아키텍처로 구성이 되어있다. 

-싱글스레드 (다중 스레드 형식으로 처리할 수 있음)

 

-JIT 인터프리터와 컴파일러 방식을 다 사용해서 빠르고 효율적으로 사용

-curl : 다양한 네트워크 프로토콜 데이터를 주고받는 프로그램 (http1.1 테스트용도)

-k6 : 자바스크립트 부하 테스트 시나리오를 만들 수 있는 툴로 비동기 처리 방식을 확인함

 

 

2024/10/8

 

찾아본 용어 정리 : 

    • 리팩토링: 기존의 기능을 변경하지 않으면서 코드의 구조를 개선하여 가독성, 유지보수성, 성능을 향상하는 작업.
    • 일급 객체: 다른 객체들과 동일하게 취급되어 변수에 할당, 인자로 전달, 반환값으로 사용할 수 있는 객체. 함수형 프로그래밍에서 주로 사용됨.
    • 라우터: 웹 애플리케이션에서 URL 경로에 따라 요청을 처리할 수 있도록 도와주는 메커니즘. 클라이언트 요청을 특정 핸들러 함수로 연결하는 역할.
    • 익스프레스 (Express): Node.js 환경에서 동작하는 웹 애플리케이션 프레임워크로, 간결하고 유연한 라우팅 및 미들웨어 구성을 제공해 서버 개발을 쉽게 해 준다.
    • 익스프레스에서 미들웨어: 요청과 응답 사이에서 특정 작업을 수행하는 함수로, 로그 기록, 인증, 에러 처리 등 다양한 작업을 수행하며 여러 개의 미들웨어가 체인처럼 연결되어 처리된다.
    • MIME 타입: 인터넷에서 파일 형식이나 데이터의 종류를 명시하는 규격. 서버와 클라이언트가 데이터의 유형을 인식하고 처리할 수 있도록 함 (예: text/html, application/json).
    • URL (Uniform Resource Locator): 웹 상의 자원의 위치(주소)를 지정하는 문자열. 프로토콜, 도메인, 경로 등을 포함함.
    • URI (Uniform Resource Identifier): URL을 포함한 더 포괄적인 개념으로, 자원을 식별하는 고유한 문자열.
    • JSON (JavaScript Object Notation): 데이터를 표현하기 위한 경량화된 텍스트 포맷으로, 사람이 읽기 쉽고, 키-값 쌍으로 구조화되어 있어 웹 API에서 자주 사용됨.
    • 클라우드 : 인터넷 기반으로 제공하는 컴퓨팅 환경 (IaaS, SaaS, PaaS) 

 

2024/10/10

 

Node.js의 3번째 강의에선 Express.js와 MongoDB를 사용해서 간단한 RESTful API 서버를 구현해 보았다.

기본적인 CRUD 기능을 구현하였는데 MongoDB와 Express.js를 연동하여 데이터베이스에 접근하고 데이터를 조작하는 방법에 대해 알 수 있었다. 

특히 Mongoose는 MongoDB와 Node.js 애플리케이션 간의 JavaScript 객체와 MongoDB의 도큐먼트를 매핑하여 MongoDB의 데이터를 더 쉽게 관리할 수 있는 방법을 알았다.

Mongoose를 사용해서 스키마를 정의하고  데이터를 구조화할 수 있었고  데이터베이스의 컬렉션과 객체를 연결시킬 수 있었다.

 

  • 문서 : Document는 여러 개의 필드와 값 쌍으로 구성된 데이터 구조이다. 문서 구조는 고정되지 않는 유연한 구조를 갖고 있기 때문에 각 문서들끼리 각각 다른 구조를 가질 수 있다. 컬렉션에 저장되는 데이터의 개별 단위이다. 
{
  "_id": "634bf1", 
  "name": "John Doe",
  "age": 30,
  "email": "john.doe@example.com"
}
  • 위 문서는 하나의 개체이며 하나의 레코드이다.
  • 컬렉션 : 컬렉션은 여러 문서가 저장되는 저장소로 관계형 데이터베이스의 table과 유사하나 스키마가 없고 주제가 유사한 문서들을 모아둔다. 
[
  {
    "_id": "634bf1", 
    "name": "John Doe",
    "age": 30,
    "email": "john.doe@example.com"
  },
  {
    "_id": "634bf2",
    "name": "Jane Smith",
    "age": 25,
    "email": "jane.smith@example.com"
  }
]

 

 

2024/10/11

 

Node.js의 마지막 날에는 Handlebars, Express.js, Mongoose를 사용해서 미니 프로젝트로 게시판을 만들어보았다. MVC 패턴으로 구현했는데 시간 부족으로 몽고디비와의 연결까진 하지 못한 정적 페이지만 만들었다.

처음으로 Handlebars라는 템플릿 엔진을 적용했는데, HTML 파일에서 동적 데이터를 삽입하고 렌더링 하는데 이중 중괄호를 사용해 변수를 쉽게 HTML에 삽입할 수 있었다. 

//req.body와 post 요청을 해석하기 위한 미들웨어 설정
app.use(express.json());
app.use(express.urlencoded({extended: true}));

//handlebars 서버 세팅
app.engine(
    "handlebars", handlebars.create({

        helpers: require("./configs/handlebars-helpers"),
        defaultLayout: "main", // 기본 레이아웃 설정
        layoutsDir: path.join(__dirname, "views", "layouts") // 레이아웃 디렉터리 경로

    }).engine
);


app.set("view engine", "handlebars"); //express에 핸들바 세팅 : 웹 페이지 로드 시 핸들바 템플릿 엔진 설정
app.set("views", path.join(__dirname, "views")); // views 디렉터리 설정

//라우터 세팅
app.get("/", (req, res) => {
    res.render("home", {title : "안녕하세요", message : "반갑습니다"});
});

app.get("/write", (req, res) => {
    res.render("write", {title : "게시판 등록"});
});

app.get("/detail/:id", async (req,res) => {
    res.render("detail", {title : "테스트 게시판"})
})

//전체 콜렉션 받아오기
let collection; //global 전역 변수

app.listen(3000, async () => {
    console.log("서버가 3000번 포트에서 실행 중입니다.");
    const MongoClient = await mongodbConnection();
    collection = MongoClient.db().collection("post"); //post 방식으로 생성한 컬렉션을 db에서 가져올게
    console.log("몽고디비 연결이 성공했습니다.");
});

//mongodb 내부에서 이미 connectionPool과 HikariPool이 존재해서 해당 라이브러리 필요 없음