์ค๋์ BoB 10๊ธฐ ๋ณด์์ ํ๊ฐ๋ฐ ํธ๋์ ๋ณด์ ์๋ฃจ์ ์ ์ ์์ ์์ ํ๋ฌ๋์ ์งํํ 1์ฐจ ํ ํ๋ก์ ํธ์ ๋ํด์ ์ด์ผ๊ธฐํด๋ณด๋ ค ํ๋ค.
ํด๋น ๊ธ์ ์ด 2๋ถ์์ผ๋ก ํ ๋น๋ฉ๊ณผ ํ์ ๊ณผ์ ๊ทธ๋ฆฌ๊ณ ์๋น์ค ์ค๋ช ๋ฐ ๊ฐ๋ฐ ๊ณผ์ ์ผ๋ก ๋๋์ด์ ธ ์์ต๋๋ค.
- 1์ฐจ ํ ํ๋ก์ ํธ ํ ๋น๋ฉ ๋ฐ ํ์ ์ ๊ณ ๋ฏผ๋ค
- 1์ฐจ ํ ํ๋ก์ ํธ ํ๋ก ํธ์๋๋ฅผ ๊ฐ๋ฐํ๋ฉฐ ํ๋ ๊ณ ๋ฏผ๋ค
- 1์ฐจ ํ ํ๋ก์ ํธ ๋ฐฑ์๋๋ฅผ ๊ฐ๋ฐํ๋ฉฐ ํ๋ ๊ณ ๋ฏผ๋ค
- 1์ฐจ ํ ํ๋ก์ ํธ ์ธํ๋ผ๋ฅผ ๊ฐ๋ฐํ๋ฉฐ ํ๋ ๊ณ ๋ฏผ๋ค
ํ๋ก์ ํธ github ๋ฐ๋ก๊ฐ๊ธฐ -> ๋ณด์ ์ํ ํธ๋ํฝ ๋ถ์ ์๋ฃจ์ github
์ง๋ ์๊ฐ์ Back End ๋ฅผ Spring Boot๋ก ๊ตฌ์ฑํ๋ฉฐ ํ๋ ๊ธฐ์ ์ ๊ณ ๋ฏผ๊ณผ ๋ฌธ์ ๋ค์ ๋ํด์ ์ด์ผ๊ธฐ๋ฅผ ํ์๋ค.
์ค๋์ Front์ Back ์ ์ ์ ํ ๋๋ ์ฃผ๋ ์ธํ๋ผ์ ๊ดํ ์ด์ผ๊ธฐ๋ฅผ ํด๋ณด๋ ค ํ๋ค.
์๋ ๊ทธ๋ฆผ์ ์ฐ๋ฆฌ๊ฐ ์ค๊ณํ ์ํคํ ์ณ์ด๋ค.
์ฐ๋ฆฌ ์๋น์ค๋ฅผ ์์ธํ ๋ณธ๋ค๋ฉด Nginx๊ฐ ์์นํด ์๋ ๊ฒ์ ์ ์ ์๋ค.
์ฐ๋ฆฌ๋ ํ๋์ Computing Machine ์์ 2๊ฐ์ ์๋ฒ๊ฐ ๋์๊ฐ๊ณ ์๋ค.
- React View ๋ฅผ Render ํ ์น์๋ฒ
- API๋ฅผ ๋ฐํํ WAS
์ด ๋์ ๋๋ ํ๋์ Port๋ก ํฉ์น๊ณ ์ ํ์๋ค.
์ฌ์ค ๋ ๊ฐ์ ํฌํธ๋ฅผ ์ด์ด์ ์ด์ํ๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ง๋ง, SSL ํต์ ์ด๋ ์ถํ SaaS๋ก ๋ฐ์ ํด ์ธ์ฆ ๋ก์ง์ด ์๋ค๋ฉด ํ๋์ ํฌํธ๋ก ์ด์ํ๋ ๊ฒ์ด ๋ ์ข์๋ณด์๋ค.
๊ทธ๋์ ์ด๋ฅผ ์ํ ๋ฐฉ๋ฒ์ผ๋ก Reverse Proxy๋ฅผ ๊ตฌ์ฑํ๋ ค ํ๋ค.
Reverse Proxy๋ Nginx๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๊ทธ ์ด์ ๋ก๋ Nginx๊ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํด์ ๋ ๋น ๋ฅด๋ค ๋ญ๋ค ํ๋ ์ฅ์ ์ด ์๊ฒ ์ง๋ง ๋๋ ์์ํ๊ฒ ๋ด๊ฐ ์จ๋ด์ ์์๋ค..
์ด๊ฒ ํ๋นํ์ง ๋ชปํ ๊ธฐ์ ์ ์ ์ ์ด์ ๊ฐ ๋ ์ ์์ง๋ง ์ฐ๋ฆฌ ์กฐ์ง ๋ด๋ถ์์๋ ๊ฐ๋ฐ๊ณผ ๊ตฌํ์ด ํ ์๊ฐ ๊ธํ๊ธฐ ๋๋ฌธ์ ์ด ๋ง์ ๋ ํ๋นํ ๊ฒ์ด ๋์ด๋ฒ๋ ธ๋ค ใ ใ ..
๋ํ ๋ฐฐํฌ์ ํจํค์ง์ docker-compose ์ shell-script ๋ฅผ ์ ์ ํ ์ด์ฉํ๊ณ , ์ด ๊ณผ์ ์์ ์ด๋ค ์ค์ ์ ํ์๋์ง๋ฅผ ๊ณต์ ํด๋ณด๋ ค ํ๋ค.
Nginx์ Reverse Proxy
๋๋ ๋ชจ๋ ์๋ฒ๋ฅผ ์ปจํ ์ด๋ ํ๊ฒฝ์์ ๊ตฌ๋ํ๊ณ ์ ํ์๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด nginx ์ ๋ฉ์ธ ์ค์ ํ์ผ์ธ nginx.conf ํ์ผ์ ์ ์ํด์ฃผ๊ณ Dockerfile ์ ๋ง๋ค์ด dockerizing ์ ํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ค.
upstream front-server {
server front-container:5000;
}
upstream backend-server {
server back-container:8080;
}
server {
listen 80;
server_name l7-monitor;
location / {
proxy_pass http://front-server;
}
location /api {
proxy_pass http://backend-server;
}
}
์ฐ์ ์ค์ ์ ํ์ธํด๋ณด์.
server ๋ธ๋ก์์ nginx ์์ฒด๋ฅผ 80 ํฌํธ๋ฅผ Listening ํ๊ฒ ํ๋ค. ์ด๋ ๋ค์์ ์์ ๋ฐฐํฌ์ ํจํค์ง์์ ํธ์คํธ PC์ 80 ํฌํธ์ ์ฐ๊ฒฐ์์ผ์ค๋ค.
๊ทธ๋ฆฌ๊ณ 2๊ฐ์ Upstream ์๋ฒ๋ฅผ ์ ์ํด์ฃผ์๋๋ฐ, 2๊ฐ์ Upstream ์๋ฒ๋ ๊ฐ๊ฐ 80 ํฌํธ๋ก ๋ค์ด์จ ์์ฒญ์ด URL Matching ์ ํตํด์ Front์ Back์ผ๋ก ๊ฐ๊ฐ ํฌ์๋ฉ์ด ๋๋ค.
Upstream ์๋ฒ ๊ฐ๊ฐ์ Front ์๋ฒ์ Back ์๋ฒ ๊ฐ๊ฐ์ ์๋ฏธํ๋๋ฐ, ์ฐ๋ฆฌ๋ ์ปจํ ์ด๋๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ์ปจํ ์ด๋์ ์ด๋ฆ์ ๋ช ์ํด์ค๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋์ปค๋ ์ปจํ ์ด๋ ์ด๋ฆ์ด Host Name์ด ๋๊ธฐ ๋๋ฌธ์ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ ์ด์ฃผ์ด Host ๋ฅผ ์๋ณํ๊ฒ ํ์ฌ, ๋์ผํ Bridge Network ์์ Host Name ์ผ๋ก IP๋ฅผ ๊ฐ์ ธ์ค๋๋ก ์ค์ ํ์๋ค.
์ด์ ํด๋น nginx.conf ํ์ผ์ ์ด์ฉํด์ nginx ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์ Dockerfile ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ๋ค.
FROM nginx:latest
WORKDIR /proxy
COPY ./nginx.conf /etc/nginx/nginx.conf
RUN rm -rf /etc/nginx/conf.d/default.conf
ENTRYPOINT ["nginx", "-g", "daemon off;"]
EXPOSE 80
๊ทธ๋ฆฌ๊ณ nginx ์ปจํ ์ด๋๊ฐ Listening ํ๊ณ ์๋ 80 ํฌํธ๋ฅผ ํฌ์๋ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค.
Dockerizing๊ณผ ๋ฐฐํฌ ์์ ๋ง๋ ์ฌ๋ฌ ์ํฉ๋ค
์ด์ Front, Back, Proxy ๋ชจ๋ ๊ตฌ์ฑ์ ํ์ผ๋ ๊ฐ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ Dockerfile ์ ์คํ์์ผ๋ณผ ๋๊ฐ ์๋ค.
๊ทผ๋ฐ ๊ฐ์๊ธฐ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๋ค.
์์์ ๊ณ์ ๋๋ Saas ๋ฅผ ์ธ์ณค์ง๋ง ๊ฒฐ๊ตญ์ On-Premise ๊ฐ ๋์๋ค! ๋ผ๊ณ ํ๋๋ฐ, ๋ฐ๋ก ์ด ์์ ๋ถํฐ ๋ณ๊ฒฝ์ด ๋์๋ ๊ฒ์ด๋ค..
๊ทธ๋์ On-Premise ์ ๋ง๊ฒ ๊ตฌ์ฑ์ ํ์ด์ผ ํ๋๋ฐ ๊ทธ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์๋ค.
๊ธฐ์กด์๋ SaaS ํํ๋ก, Front์ Back์ ์ฐ๋ฆฌ๊ฐ ์ด์์ ํ๊ณ ์ธ์ฆ์ ๊ฑฐ์น ํ ํด๋น ์๋ฒ์ ๋ฐ์ดํฐ๋ง ์๊ฐํ ํ๋ฉด ๋์๋ค.
ํ์ง๋ง On-Premise ์์๋ ์ฌ์ฉ์์๊ฒ ์ฐ๋ฆฌ๊ฐ ๋ง๋ Front, Back ๋ชจ๋๋ฅผ ๊ณ ๊ฐ์ด ์ค์นํ ์ ์๋๋ก ํต์ผ๋ก ์ ๊ณตํด์ผ ํ๋ค๋ ๊ฒ์ด์๋ค.
๊ทธ๋์ ๊ธฐ์กด์ ์๋ Dockerfile ๋ค์ ์์ ํ์ด์ผ ํ๋๋ฐ, ์ฌ๊ธฐ์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค
์ด๋ฏธ ๋ง๋ค์ด์ง ๋์ปค ์ด๋ฏธ์ง์ ์ด๋ป๊ฒ ๋์ ์ผ๋ก ๊ณ ๊ฐ์ IP๋ฅผ ์ถ๊ฐํ ์ ์์๊น?
IP๋ฅผ ์ถ๊ฐํ๋ ์ผ์ ์ฐ๋ฆฌ ์๋น์ค์์ ์ค์ํ๋ค.
์ฐ์ ๊ฐ๋จํ๊ฒ IP๊ฐ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๋ผ๋ฉด CORS ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ Backend ์์ ํ๊ณ ์๋๋ฐ, ๊ทธ๊ฒ ๋ถํฐ์ IP๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆํ๊ณ ๋์ํ๋ค.
๊ฒฐ๊ตญ ๋์ ์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์คํ์ํฌ ๋ IP๋ฅผ ์ง์ ํ๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ค์ ์ง๋ฉดํ๋ค.
- React ์์ .env๋ก ๋์ IP ์ฃผ์
- Spring Boot ์์ ํ๊ฒฝ๋ณ์๋ก ๋์ IP ์ฃผ์
React ์์ .env๋ก ๋์ IP ์ฃผ์
๋ฆฌ์กํธ์์ ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฐ๋จํ๊ฒ .env ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์
๋ฃจํธ ๋๋ ํ ๋ฆฌ์์ .env
ํ์ผ์ ์์ฑํ๊ณ ์ฑ ๋ด๋ถ์์ process.env.REACT_APP...
์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด
REACT_APP_HOST_IP=192.168.0.2
์ด๋ผ๋ env ํ์ผ์ด ์กด์ฌํ๋ค๋ฉด ์ค์ ์ฑ ๋ด๋ถ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ๋๋ค.
import axios from "axios";
export const SERVER = axios.create({
baseURL: "http://" + process.env.REACT_APP_HOST_IP,
headers: {
"Content-Type": "application/json",
},
});
์ด๋ฐ ๋ฐฉ์์ ์ด์ฉํด์ ๊ตฌํํ๋๋ฐ, ๋ฌธ์ ๋ ๋์ปค๋ผ์ด์ง์ ํ ๋, env ํ์ผ์ ๋ณ๊ฒฝํ๋ ๊ณผ์ ์์ ๋์ปค ํ๊ฒฝ๋ณ์๋ก env ํ์ผ์ ์์ ํ ์ ์๋ค๋ ๊ฒ์ด์๋ค.
๊ทธ๋์ ์ด๋ฅผ ํด๊ฒฐํ์ด ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋์ปค๋ผ์ด์ง ์์ ๋์ ์ผ๋ก .env ํ์ผ์ ๋ง๋๋ ๋ฐฉํฅ ์ผ๋ก ๊ตฌํํ๋ค.
์ด ๋ง์ด ๋ฌด์จ๋ง์ด๋๋ฉด, ์ฐ์ ํ๋ก์ ํธ ๋ฃจํธ์ create-env-file.sh
๋ผ๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ ๋ค.
#/bin/bash
touch .env
for envvar in "$@"
do
echo "$envvar" >> .env
done
ํด๋น ์คํฌ๋ฆฝํธ๋ sh ๋ฅผ ์คํํ ๋ ์ฃผ์ด์ง๋ args ๋ก env ํ์ผ์ ๋ง๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ Dockerfile ์์๋
...
# env ๋ณ์ ํ ๋น ๋ฐ ์๋ก์ด .env ํ์ผ ์์ฑ
ARG REACT_APP_HOST_IP
RUN sh create-env-file.sh REACT_APP_BACK_END_URL=$REACT_APP_HOST_IP
...
๊ณผ ๊ฐ์ด ํด๋น ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ์ ์คํํ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ docker-compose ๋ก ํด๋น ๋์ปคํ์ผ์ build ์์ผ๋ฒ๋ฆฌ๋ฉด์ ๋์์ IP๋ฅผ ARGS๋ก ์ ๊ณตํด๋ฒ๋ฆฌ๋ฉด ๋๋ค.
version: "3"
services:
front:
container_name: front-container
build:
context: ./frontend
args:
REACT_APP_HOST_IP: 172.17.0.1
image: l7-frontend
์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก Spring Boot ๋ ๊ตฌํํ ์ ์๋ค.
Spring Boot ์์ ํ๊ฒฝ๋ณ์๋ก ๋์ IP ์ฃผ์
Spring Boot ์์ IP๋ฅผ ๋์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ถ๋ถ์ ๋ฐ๋ก CORS Filter ๋ฅผ ๋ง๋๋ ์์ ์ ํด๋น๋๋ค
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Value("${boribob.host-ip}")
private String HOST_IP;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// ์๋ต
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "http://" + HOST_IP + "/");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods","*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization");
if("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
}else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
// ์๋ต
}
}
์ฌ๊ธฐ์ Value ์ด๋ ธํ ์ด์ ์ ํตํด ์ค์ ํ์ผ์ ์กด์ฌํ๋ ์ธ๋ถ ์ค์ ๊ฐ์ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๋ค.
๊ทธ๋ผ ๋ ์ด๋ป๊ฒ ์ธ๋ถ ์ค์ ๊ฐ์ ์ ๋ฌํ ๊น?๋ฅผ ์๊ฐํด ๋ณด์์ผ ํ๋ค.
์ด ๋ฐฉ๋ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋๋ java -jar
๋ช
๋ น์ด๋ฅผ ํตํด ์คํ ์์ ์ IP๋ฅผ ์ธ๋ถ ํ๊ฒฝ์ผ๋ก ์ฃผ์
๋ฐ๋๋ก ํ์๋ค.
์ฐ์ application.yml ์ default ip ๋ฅผ ๊ฐ์ง๊ณ ๋ฏธ๋ฆฌ build๋ฅผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ Dockerfile ์์ ๋ฐ๋ env ๋ก IP๋ฅผ ์ฃผ์
๋ฐ๊ณ java -jar
์ ์ธ๋ถ ํ๊ฒฝ์ ์ฃผ์
ํ๋ค.
๊ทธ๋์ ๋์จ Dockerfile ์ ๋ค์๊ณผ ๊ฐ๋ค
FROM openjdk:17-ea-11-jdk-slim
WORKDIR /server
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul
RUN apt-get install -y tzdata
COPY ./L7-Monitor.jar l7-monitor.jar
ARG HOST_IP
ENV HOST_IP=${HOST_IP}
ENTRYPOINT ["java", "-jar", "l7-monitor.jar", "--spring.datasource.url=jdbc:mysql://bori-db-container/bob_l7?characterEncoding=utf8", "--boribob.host-ip=$HOST_IP"]
์ฌ๊ธฐ์ ENV HOST_IP=${HOST_IP}
๋ผ๋ ์ปค๋งจ๋๊ฐ ์กด์ฌํ๋ค.
ํด๋น ์ปค๋งจ๋๋ ENTRYPOINT ์์ ARGS ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ENV๋ก ํ ๋ฒ ๊ฑฐ์ณ๊ฐ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋์๋ค.
๊ทธ๋์ ์์ฑ๋ docker-compose ํ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค.
version: "3"
services:
db:
container_name: bori-db-container
image: lauvsong/bori-db:210821
restart: always
ports:
- "3306:3306"
front:
container_name: front-container
build:
context: ./frontend
args:
REACT_APP_HOST_IP: 172.17.0.1
image: l7-frontend
back:
container_name: back-container
build:
context: ./backend
args:
HOST_IP: 172.17.0.1
image: dhslrl321/boribob-l7:backend
depends_on:
- db
proxy:
container_name: proxy-container
build:
context: ./reverse-proxy
image: reverse-proxy
ports:
- "80:80"
depends_on:
- front
- back
์์ docker-compose ์์ ๋น๋ํ์ง ์์๋๋ผ๋ฉด... ๋ ์ข์์ํ ๋ฐ..
ํ๋ก์ ํธ๋ฅผ ๋๋ด๋ฉฐ...
์์ ๊ตฌ์ฑ ๋ฐฉ์์์ ์์ฌ์์ด ๋ง์ด ์กด์ฌํ๋ค.
์ฌ์ค์ On-Premise ๋ก ์ํ์ ๋ฐฐํฌํ๊ณ ํจํค์ง์ ํ๋ค๋ฉด ์ ๋ฐ ๋ฐฉ์์ผ๋ก ๋์ปค๋ก ์ ๊ณตํ๋ ๊ฒ์ ์ณ์ง ๋ชปํ๋ค๊ณ ์๊ฐํ๋ค.
์ฌ์ง์ด docker-compose.yml ์ ๊ณ ๊ฐ์ด ์ง์ ์ด์ด ์์ ์ IP๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ ๋ํ ๋งค์ฐ ๋ฌธ์ ๋ผ๊ณ ์ง์ ํ ์ ์๋ค.
๋ง์ฝ ๋ ์๊ฐ์ด ์์๋ค๋ฉด docker-compose.yml ์ ์ฌ์ฉ์๊ฐ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ด ๊ณผ์ ์ ์๋ํ ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ์์ ๊ฒ์ด๋ค.
์๋ฅผ ๋ ๋ค๋ฉด app.conf๊ณผ execute-service.sh ํ์ผ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์์ IP๋ฅผ app.conf ์์ ๋ช ์ํ์ฌ ์ ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์ผ๋ก docker-compose ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํ์ ๊ฒ์ด๋ค.
๊ทธ๋ผ Backend Application ์ ๊ด์ฐฎ์๊ฐ??
๊ทธ๋ ์ง๋ ์๋ค.
JPA ์ฟผ๋ฆฌ ๋ฉ์๋๋ ๋ด๊ฐ ๊ตฌํํ ๊ฒ์ด ์๋ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ด์ฉํ์ ๋ฟ์ด๊ณ ์ํคํ ์ฒ๋ ๋ฌธ์ ๊ฐ ์๋ค.
์ด๋ ๊ฒ ๋ฐฑ์๋๊ฐ Select ๋ง ์ํํ๋ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ค๋ฉด Master-Slave ๊ตฌ์กฐ๋ก ๊ฐ๋ ๊ฒ๋ ๊ณ ๋ คํด๋ณผ๋ง ํ๋ค. ํ์ง๋ง ํ์ง ์์๋ค.
๊ฒฐ๊ตญ ๊ฐ๋ฐ์๋, ์๋ ๋ด๊ฐ ์๊ฐํ๋ ๊ฐ๋ฐ์๋ ์๊ฐ๊ณผ ๊ธฐ์ ์ฌ์ด์ ์ ์ธ์์ ์ ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
์๋ฒฝํ์ง ์๋๋ผ๋ ์ด๋ค ๊ธฐํ ๋ด์ ๋๋ด์ผ ํ๋ ํ๋ก์ ํธ๋ผ๋ฉด ์ค์ค๋ก ํํ์ ๋ณด๋๋ผ๋ ์ฐ์ ๋๋ด๋๊ฒ ๋ง๋ค๊ณ ์๊ฐํ๋ค.
๋ฌผ๋ก ์ด ๊ณผ์ ์์ ๊ฐ๋ฐ์์ ๋ฅ๋ ฅ์ด ๋ถ์กฑํด์ ์ข์ง ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๋ด๊ธฐ๋ ํ์ง๋ง ์ด๋ ์จ์ ํ ๊ฐ๋ฐ์์ ๋ชซ์ธ ๊ฒ์ด๊ณ , ๋๋ ๋ด ๋๋ฆ์ ์ ๋ ์ ๋ฐ๋ผ์ ์ด์ฌํ ๊ตฌ์ฑํ๋๊ฒ ๊ฐ๋ค.
์์ง์ ํ์์ด๊ณ ๋ง์ด ๋ถ์กฑํ ๊ฒ์ ๋ด ์ค์ค๋ก๊ฐ ์ฝ๋ ํ ์ค๋ง ๋ณด๋๋ผ๋ ๋๋ ์ ์๋ค.
๊ทธ๋๋ ์ง๋ ์๊ฐ๋ค๊ณผ ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด ์ด์ ๋ญ๊ฐ ๋ถ์กฑํ๊ณ ์ด๋ป๊ฒ ๊ณ ์ณ์ผํ ์ง ์๊ฒ ๋๊ฒ ๊ฐ๋คใ ใ
์ด์ 1์ฐจ ํ๋ก์ ํธ๊ฐ ๋๋ฌ๊ณ ๊ทธ ํ๋ฌ ๋์ ์ ๋ง ๋ง์ด ์ฑ์ฅํ๋๋ฐ, 2์ฐจ ํ๋ก์ ํธ์์๋ ๋ ์ผ๋ง๋ ์ฑ์ฅํ ์ง ๋๋ฌด ๊ธฐ๋๋๊ณ ์ฆ๊ฑฐ์ด ํ๋ฃจํ๋ฃจ๋ฅผ ๋ณด๋ธ๋ค.
๋๊ธ