Serverless functionμ λνμ¬
μλ²λ¦¬μ€ ν¨μμ λν κΈμ λλ€.
μλ²λ¦¬μ€ ν¨μ(Serverless Functions)ν¨μλ?
ν΄λΌμ°λ μ»΄ν¨ν νκ²½μμ μ€νλλ λ 립μ μΈ ν¨μμ λλ€. μλ²λ¦¬μ€ μν€ν μ²λ κ°λ°μκ° μλ² μΈνλΌλ₯Ό κ΄λ¦¬νμ§ μκ³ λ μ ν리μΌμ΄μ μ½λλ₯Ό μ€νν μ μλλ‘ νλ λ°©μμ λλ€. μλ²λ¦¬μ€ ν¨μλ νμν λλ§ νΈμΆλλ©°, μΈνλΌ λ¦¬μμ€μ λν μλ νμ₯κ³Ό κ΄λ¦¬λ₯Ό ν΄λΌμ°λ μ 곡μ μ²΄κ° μ²λ¦¬ν©λλ€.
λν, μ΄λ²€νΈ κΈ°λ°(event-driven)μΌλ‘ λμνλ©°, νΉμ μ΄λ²€νΈκ° λ°μνλ©΄ μ€νλ©λλ€. μλ₯Ό λ€μ΄, HTTP μμ², λ©μμ§ ν, νμ΄λ¨Έ λ±μ μ΄λ²€νΈκ° μλ²λ¦¬μ€ ν¨μλ₯Ό νΈλ¦¬κ±°ν μ μμ΅λλ€. ν¨μλ λ¨μΌ κΈ°λ₯μ μννλ©°, μΌλ°μ μΌλ‘ λͺ μ΄μμ λͺ λΆκΉμ§ 짧μ μ€ν μκ°μ κ°μ΅λλ€.
μλ²λ¦¬μ€ ν¨μμ μ£Όμ νΉμ§
κ΄λ¦¬μ κ°μν: μλ² μΈνλΌλ₯Ό κ΄λ¦¬ν νμ μμ΄ κ°λ°μλ ν¨μμ μ½λμ μ§μ€ν μ μμ΅λλ€. μΈνλΌ μλν, νμ₯, λͺ¨λν°λ§ λ±μ ν΄λΌμ°λ μ 곡μ μ²΄κ° μ²λ¦¬ν©λλ€.
μ΄λ²€νΈ νΈλ¦¬κ±°: ν¨μλ μ΄λ²€νΈμ μν΄ νΈλ¦¬κ±°λλ©°, νμν κ²½μ° μλμΌλ‘ νμ₯λ©λλ€. μ΄λ²€νΈλ λ€μν μμ€μμ λ°μν μ μμΌλ©°, μλ²λ¦¬μ€ ν¨μλ₯Ό νΈλ¦¬κ±°νμ¬ μ€νν©λλ€.
κ³ΌκΈ λ°©μ: λλΆλΆμ μλ²λ¦¬μ€ νλ«νΌμ ν¨μμ μ€ν μκ°κ³Ό 리μμ€ μλΉλμ λ°λΌ κ³ΌκΈν©λλ€. ν¨μκ° λΉνμ± μνμΈ κ²½μ°μλ μΈνλΌ λ¦¬μμ€κ° ν λΉλμ§ μμΌλ―λ‘ ν¨μ¨μ μΈ λΉμ© κ΄λ¦¬κ° κ°λ₯ν©λλ€.
νμ₯μ±: ν¨μλ νμμ λ°λΌ μλμΌλ‘ νμ₯λλ―λ‘, νΈλν½μ΄ μ¦κ°νκ±°λ λΆνκ° λ°μν λλ μμ μ μΌλ‘ μ²λ¦¬ν μ μμ΅λλ€.
μλ²λ¦¬μ€ ν¨μ μμ(Vercel)
const sharp = require("sharp");
module.exports = async (req, res) => {
try {
const { image } = req.body; // μ΄λ―Έμ§ λ°μ΄ν°λ μμ²μ λ°λλ‘λΆν° λ°μμ΅λλ€.
// μ΄λ―Έμ§ μμΆμ μν΄ sharp λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν©λλ€.
const compressedImageBuffer = await sharp(image)
.resize(800) // μ΄λ―Έμ§ 리μ¬μ΄μ§
.toBuffer(); // μμΆλ μ΄λ―Έμ§ λ²νΌ λ°ν
// μμΆλ μ΄λ―Έμ§λ₯Ό μ μ₯νκ±°λ ν΄λΌμ΄μΈνΈμκ² λ°νν©λλ€.
// μ΄ μμμμλ μμΆλ μ΄λ―Έμ§λ₯Ό λ°λ‘ ν΄λΌμ΄μΈνΈμκ² λ°νν©λλ€.
res.setHeader("Content-Type", "image/jpeg");
res.send(compressedImageBuffer);
} catch (error) {
console.error("Image compression error:", error);
res.status(500).send("Image compression failed.");
}
};
μμ μ€λͺ
sharp λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ΄λ―Έμ§ μμΆμ μ²λ¦¬ν©λλ€. μ μ¦νμ μ μμ² λ°λλ‘λΆν° μ΄λ―Έμ§ λ°μ΄ν°λ₯Ό λ°μμ¨ ν, sharpλ₯Ό μ¬μ©νμ¬ μ΄λ―Έμ§λ₯Ό 리μ¬μ΄μ§νκ³ μμΆλ μ΄λ―Έμ§ λ²νΌλ₯Ό μμ±ν©λλ€. λ§μ§λ§μΌλ‘, μμΆλ μ΄λ―Έμ§λ₯Ό ν΄λΌμ΄μΈνΈμκ² λ°νν©λλ€.