BACK-END

[Node.js] Node.js 기초 2

gudwns5533 2026. 7. 17. 17:21

Express

  • Node.js 환경에서 가장 널리 사용되는 웹 애플리케이션 프레임워크로, 서버를 쉽고 빠르게 구축할 수 있도록 다양한 기능을 제공한다.
  • 기본적인 HTTP 모듈보다 훨씬 간단하게 라우팅 처리, 요청/응답 객체 관리, 미들웨어 설정, 정적 파일 제공, 템플릿 엔진 연결 등을 할 수 있어 개발 생산성을 크게 높여준다.

라우팅

클라이언트가 어떤 URL과 HTTP 메서드(GET, POST)로 요청을 보냈을 때 그 요청을 어떤 코드가 처리할지 연결해주는 규칙이다.

미들웨어

  • 요청(request)과 응답(response) 사이에서 중간에 실행되는 함수로, 클라이언트의 요청을 직접 처리하기보다는 가공 / 검사 / 추가 작업을 담당하는 역할을 한다.
  • 요청 로그를 남기거나, JSON 데이터를 파싱하거나, 로그인 여부를 검사하거나, 에러를 처리하는 기능들이 모두 미들웨어의 기능이다.

정적 파일

  • 서버에서 별도의 처리 없이 그대로 클라이언트에게 전달되는 파일을 말한다.
  • 대표적으로 HTML, CSS, JavaScript, 이미지, 폰트 파일 등이 있으며, 사용자의 요청이 들어오면 서버는 내용을 가공하지 않고 저장된 그대로 응답한다.

EJS

  • EJS (Embedded JavaScript)는 HTML 안에 JavaScript 코드를 삽입해 서버 데이터를 동적으로 렌더링 할 수 있게 해주는 node.js용 템플릿 엔진이다.
  • <%= %>, <% %> 안에서 로직을 작성하여 사용한다.

템플릿 엔진

  • HTML과 데이터를 결합해 동적인 화면을 만들어주는 도구.
  • 서버에서 전달한 값을 HTML안에 삽입해서 최종 페이지를 생성하며, 반복문 / 조건문 같은 로직도 템플릿 내부에서 처리할 수 있다.
const express = require("express")
const path = require("path")
const app = express()
const port = 3000

// 미들웨어 등록
// app.use(express.static('public')) // root에서 접근
app.use("/static", express.static('public')) // http://127.0.0.1:3000/static/spring.png
app.use(express.urlencoded({ extended: true }))

// EJS 설정
app.set("view engine", "ejs")
app.set("views", path.join(__dirname, "view"))

app.get("/", (req, res) => {
    res.send("Hello Express!")
})

app.get("/hello", (req, res) => {
    res.render("hello", { name: "김사과" })
})

app.get("/submit", (req, res) => {
    res.render("submit")
})

app.post("/submit", (req, res) => {
    const { name, age } = req.body
    console.log("name: ", name)
    console.log("age: ", age)
    res.send("post로 호출!")
})

app.listen(port, () => {
    console.log("서버 실행중...")
})

Express에서 JSON 데이터를 처리하는 흐름

클라이언트(요청) → Express 서버 → JSON 파싱 → req.body로 접근 → 로직 처리 → JSON 응답

1. 미들웨어 등록
    app.use(express.json())

{
    "name": "김사과",
    "age": 20    
}

2. post로 json 데이터 받기
    app.post("/user", (req, res) => {
        const { name, age } = req.body
    })

3. json 응답 보내는 방법
    res.json({ success: true })

    { "success": true }
    > 자동으로 Content-Type: application/json 설정
    > 자바스크립트 객체를 보내면 자동으로 JSON 변환이 됨

4. 유효성 검사
    app.post("/user", (req, res) => {
        const { name, age } = req.body
        if(!name || !age) {
            return res.status(400).json({
                error: "name 또는 age는 필수"
            })
        }
    })

API  주소(URL) 구성 원칙

  • API 주소는 단순한 경로가 아니라 리소스를 표현하는 구조적인 설계 요소
  • RESTful 설계 원칙에 따라 구성하는 것이 가장 일반적

RESTful (Representational State Transfer)

url 과 http 메서드를 이용해 자원을 직관적이고 일관성 있게 설계하는 웹 API방식

const express = require("express")
const app = express()

app.use(express.json())

// POST: 생성
app.post("/user", (req, res) => {
    const { name, age } = req.body
    if(!name || !age){
        return res.status(400).json({ error: "필수값 누락"})
    }
    res.status(201).json({
        message: "등록 완료",
        data: {name, age}
    })
})

// GET: 조회
app.get("/user/:id", (req, res) => {
    res.json({ id: req.params.id, message: "사용자 조회" })
})

// PUT: 전체 수정
app.put("/user/:id", (req, res) => {
    const { name, age } = req.body
    if(!name || !age){
        return res.status(400).json({ error: "필수값 누락"})
    }
    res.json({ message: "전체 수정 완료", id: req.params.id, data: { name, age}})
})

// PATCH: 부분 수정
app.patch("/user/:id", (req, res) => {
    const updates = req.body
    if(Object.keys(updates).length === 0) {
        return res.status(400).json({ error: "수정할 데이터가 없습니다" })
    }
    res.json({ message: "부분 수정 완료", id: req.params.id, updateData: updates })
})

// DELETE: 삭제
app.delete("/user/:id", (req, res) => {
    res.json({ message: "삭제 완료", id: req.params.id })
})

app.listen(3000, () => {
    console.log("서버 실행 중...")
})

모듈

자바스크립트 모듈은 코드의 재사용성과 유지보수성을 높이기 위해 기능을 개별 파일로 분리하여 사용할 수 있도록 해주는 구조이다.

CommonJS 방식의 모듈

// counter.js
let count = 0  // 외부에서 직접 접근 불가
function increase() {
    count++
}
function getCount() {
    return count
}

module.exports.getCount = getCount  // 외부에서 사용 가능
module.exports.increase = increase  // 외부에서 사용 가능

// main.js
const counter = require("./counter") // counter.js 파일을 불러옴
counter.increase()
console.log(counter.getCount())

ES6 방식의 모듈

// counter.mjs
export function increase() {
    count++
}
export function getCount() {
    return count
}

// main.mjs
import { increase, getCount } from "./counter.mjs"

increase()
console.log(getCount())

라우트

웹 애플리케이션에서 클라이언트가 요청한 URL 경로와 HTTP 메서드에 따라 서버가 어떤 동작을 수행할지를 정의하는 규칙이다.

app.route("/경로")
    .get((req, res) => {
        // get 요청 처리    
    })
    .post((req, res) => {
        // post 요청 처리    
    })
    .put((req, res) => {
        // put 요청 처리    
    })

status

서버가 요청 결과를 어떤 상태로 처리했는지 알려주는 번호

1xx: 요청 처리 중 (거의 사용 안함)
2xx: 성공
    200: 요청 성공
    201: 데이터 생성 성공
3xx: 다른 주소로 이동
    301: 주소 변경
    302: 임시로 변경
4xx: 사용자 요청에 문제가 있음
    401: 로그인 필요
    403: 접근 금지
    404: 페이지 없음
5xx: 서버 문제
    500: 서버 오류

 

'BACK-END' 카테고리의 다른 글

[MongoDB] MongoDB  (0) 2026.07.17
[Node.js] Node.js 기초 1  (0) 2026.06.28
[MySQL] MySQL 연동  (0) 2026.06.09
[MySQL] 뷰 (view)  (0) 2026.06.09
[MySQL] MySQL 함수  (0) 2026.06.09