BFF(Backend For Frontend) ๊ฐ๋ ๋ฐ ํ์ฉ
BFF๋ ๋ฌด์์ธ๊ฐ?
BFF(Backend For Frontend)๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ํต์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋์ ๋ ๊ฐ๋ ์ ๋๋ค. ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๋ค์ด ์๋ฒ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ค๊ณ ์ ์ดํ๊ธฐ ์ํ ์ค๊ฐ ๊ณ์ธต์ผ๋ก ์๋ํฉ๋๋ค.
BFF์ ์ ๋
BFF๋ผ๋ ์ฉ์ด๋ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ์ฌ์ด์ ๊ฒฝ๊ณ๋ฅผ ์ฝํ์ํค๊ณ ์ Facebook์์ ์ฒ์ ์๊ฐ๋์์ต๋๋ค. Facebook์ ๋ค์ํ ํ๋ซํผ์์ ๋์ํ๋ ์ฑ์ ๊ฐ๋ฐํ๋ฉด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด BFF๋ฅผ ๋์ ํ์ต๋๋ค.
BFF์ ์ญํ
- ํด๋ผ์ด์ธํธ ํนํ ๋ฐ์ดํฐ ์ ๊ณต: ํด๋ผ์ด์ธํธ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ ์ ๊ณตํจ์ผ๋ก์จ ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก์ ์ต์ํํฉ๋๋ค.
- ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ ํฅ์: ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๊ฐ ์๋ฒ์์ ์ํธ ์์ฉ์ ๋ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์ต๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค์์ ํตํฉ: ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค์ API๋ฅผ ์ ์ ํ๊ฒ ์กฐํฉํ์ฌ ํด๋ผ์ด์ธํธ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
BFF ์ฌ์ฉ ์ํฉ
- ๋ค์ํ ํด๋ผ์ด์ธํธ ์ง์: ๋ชจ๋ฐ์ผ ์ฑ, ์น ์ฑ, ๋ฐ์คํฌํฑ ์ฑ ๋ฑ ์ฌ๋ฌ ํ๋ซํผ์์ ๋์ํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ํ ๋ BFF๊ฐ ํจ๊ณผ์ ์ ๋๋ค.
- ์๋ฒ๋ฆฌ์ค ์ํคํ ์ฒ์์ ์ ํฉ์ฑ: ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์์ ์ฌ๋ฌ ์๋น์ค ๊ฐ์ ํต์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด BFF๋ฅผ ๋์ ํ ์ ์์ต๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ: ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ ๊ณตํ๋ API๋ฅผ ์กฐํฉํ์ฌ ํด๋ผ์ด์ธํธ์ ํจ์จ์ ์ผ๋ก ์ ๋ฌํ ๋ BFF๋ฅผ ์ฌ์ฉํฉ๋๋ค.
BFF์ ์ฅ๋จ์
์ฅ์
- ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์ ํธ์์ฑ: ์๋ฒ์์ ํต์ ์ ๊ด๋ฆฌํจ์ผ๋ก์จ ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๋ค์ด ๋ ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ํจ์จ์ฑ: ํ์ํ ๋ฐ์ดํฐ๋ง์ ๊ฐ์ ธ์ ์ ๊ณตํ๋ฏ๋ก ๋ถํ์ํ ๋ฐ์ดํฐ ํธ๋ํฝ์ ์ต์ํํฉ๋๋ค.
๋จ์
- ์ถ๊ฐ์ ์ธ ๊ณ์ธต: BFF ๋์ ์ผ๋ก ์ถ๊ฐ์ ์ธ ์๋ฒ ๊ณ์ธต์ด ๋ฐ์ํ๋ฏ๋ก ๊ด๋ฆฌ์ ์ ์ง๋ณด์๊ฐ ํ์ํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ข ์์ฑ: ํด๋ผ์ด์ธํธ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ์ ์์ด, ํด๋ผ์ด์ธํธ์์ ์ข ์์ฑ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
BFF๋ฅผ ์ดํดํ๋ ์์
์์ 1: Express๋ฅผ ์ด์ฉํ BFF ๊ตฌํ
const express = require('express');
const axios = require('axios');
const app = express();
const port = 3000;
app.get('/bff/data', async (req, res) => {
try {
// ์๋ฒ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
const response = await axios.get('http://backend-api/data');
// ํด๋ผ์ด์ธํธ์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ถ์ถํ์ฌ ์๋ต
const responseData = {
clientData: response.data.clientData,
additionalInfo: 'Some additional information',
};
res.json(responseData);
} catch (error) {
console.error(error);
res.status(500).send('Internal Server Error');
}
});
app.listen(port, () => {
console.log(`BFF server is running at http://localhost:${port}`);
});
์์ 2: React ์ฑ์์ BFF ์ฌ์ฉ
import React, { useEffect, useState } from 'react';
import axios from 'axios';
const App = () => {
const [data, setData] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
// BFF๋ฅผ ํตํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
const response = await axios.get('http://localhost:3000/bff/data');
setData(response.data);
} catch (error) {
console.error(error);
}
};
fetchData();
}, []);
return (
<div>
{data ? (
<div>
<h1>{data.clientData}</h1>
<p>{data.additionalInfo}</p>
</div>
) : (
<p>Loading...</p>
)}
</div>
);
};
export default App;
์ฐ๊ด๋ ๊ธฐ์
GraphQL
GraphQL์ ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฒญํ ์ ์๋ ์ฟผ๋ฆฌ ์ธ์ด๋ก, BFF์์ ํจ์จ์ ์ธ ํต์ ์ ํ์ฉ๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ง์ ์์ฒญํ์ฌ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
RESTful API
BFF๊ฐ ์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํ์ฌ ์ ๊ณตํ ๋, ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ RESTful API๋ฅผ ํตํด ํ์คํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
Serverless
BFF๋ฅผ ์๋ฒ๋ฆฌ์ค ์ํคํ ์ฒ์ ์ ์ฉํ ๋, AWS Lambda, Azure Functions, Google Cloud Functions์ ๊ฐ์ ์๋ฒ๋ฆฌ์ค ํจ์๋ฅผ ์ฌ์ฉํ์ฌ BFF๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
BFF๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ์ค๊ฐ ๊ณ์ธต์ผ๋ก, ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๋ค์ด ๋ ํจ๊ณผ์ ์ผ๋ก ์์ ํ ์ ์๋๋ก ๋์์ค๋๋ค. ํนํ ์ฌ๋ฌ ํ๋ซํผ์์ ๋์ํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ํ๊ฑฐ๋, ์๋ฒ๋ฆฌ์ค ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ํตํฉํ ๋ BFF์ ํ์ฉ์ด ํจ๊ณผ์ ์ ๋๋ค.
'IT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Builder Pattern: ๊ฐ์ฒด ์์ฑ์ ์ ์ฐํจ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ค (0) | 2024.03.02 |
---|---|
JVM(Java Virtual Machine)์ ์ดํด์ ํ์ฉ (0) | 2024.03.01 |
์๋ฐ์คํฌ๋ฆฝํธ Prototype: ๊ฐ๋ , ํ์ฉ, ์ฅ๋จ์ , ์์ ์ฝ๋ (0) | 2024.02.28 |
์๋ฐ์คํฌ๋ฆฝํธ์ this: ๊ฐ๋ , ํ์ฉ, ์ฅ๋จ์ , ์์ ์ฝ๋ (0) | 2024.02.27 |
SSL/TLS: ์ํธํ์ ๋ณด์์ ์ํ ํต์ฌ ํ๋กํ ์ฝ (0) | 2024.02.27 |
๋๊ธ