Backend
home

2025-6-17 (화)

생성일
2025/06/12 13:33
태그
OT
Docker
MySQL

Java 백엔드 오리엔테이션

1. TimeLine

9시 40분 부터 오리엔테이션 진행
일정 설명
오후 2시 ~ 3시, 행정 관련 내용 안내

2. 백엔드 스쿨 플러스 소개

K-Digital-Training으로 진행
기업에서 원하는 백엔드 기술 다루게 됨
Project
실전
종합
이론 - 6월 17일 ~ 7월 3일
1차 프로젝트: 7월 3일 ~ 7월 29일 (26일)
2차 프로젝트: 7월 29일 ~ 8월 26일 (29일)
취업 지원 특강
6월 18일 - 수, 6월 19일 - 목
8월 13일 - 수, 8월 27일 - 수
프로젝트 내용
4인 이상 한 팀
ElasticSearch 검색 엔진 구축
실시간 데이터 처리…
OT 종료 후 노트북 수요조사 진행 예정
커뮤니티 가이드 안내
프로젝트 팀 구성
이론 수업 끝난 이후에 1:1 상담으로 진행할 예정
프로젝트 관련 기획서들 수령하여 검토 후 프로젝트 팀 구성 진행 예정
구글 폼 공유
1순위, 2순위, 3순위 등 순위 조정하여 진행

3. 행정 안내

하루에 입실/퇴실 두 번 출결 처리
외출 : 운영 매니저에게 전달 후 외출해야 함
50% 미만 참여한 경우 결석
출석 Guide
교육행정 디스코드 초대
전체 훈련기간 출석률 80% 이상 달성 및 팀 프로젝트 참여 결과물 제출

3. 개발환경 세팅

개발환경 세팅

도커 데스크탑 설치
인텔리제이
Java 17
MySQL Workbench
Postman

4. Docker

도커

떠오르는 이미지 : 컨테이너, 고래
고래가 여러 개의 컨테이너를 싣고 바다로 향한다.
여러 개의 컨테이너: 애플리케이션
바다: 서버, 클라우드
향한다: 배포 → 실행
컨테이너라는 기술을 사용해서 애플리케이션을 언제 어디서나 같은 환경에서 배포하고 실행할 수 있게 해주는 도구이다.
컨테이너 기술을 편리하게 사용할 수 있게 해주는 도구이다.
컨테이너 기술
서로 다른 개발 및 인프라 환경인 경우 프로젝트 실행이 어려움
A 프로젝트 : Java 17, B 프로젝트 : Java 8, 내 PC : Java 21
각 어플리케이션이 서로의 실행 환경에 영향을 받지 않고 독립적으로 실행할 수 있게 해주는 기술이다.
주요 구성 요소
이미지: Container를 만들기 위한 템플릿 - Dockerfile
컨테이너: 이미지를 실행한 인스턴스 (애플리케이션이 실제로 실행되는 공간)
레지스트리:
DockerHub, 전 세계 사람들이 만든 Docker 이미지를 공유하고 내려 받을 수 있는 공식 이미지 저장소
네트워크:
격리된 환경끼리 데이터를 주고 받을 수 있음
볼륨:
컨테이너 삭제 시 내부 데이터도 삭제 됨
백업 경로 지정
볼륨을 지정하고 컨테이너를 사용해도 기존의 데이터는 남아있음

주요 명령어

도커 명령어
컨테이너
이미지
nginx 웹서버 설치
설치 구조
클라이언트에서 요청이 오면 요청을 다른 서버로 전달하는 역할
# nginx 이미지 설치 docker run --name server -d -p 8080:80 nginx # 설치된 컨테이너 확인 후 브라우저 접속 확인 (localhost:8080 접속) docker ps # stop docker stop 186ef9b2aaa9(컨테이너명) 1 ✘ 186ef9b2aaa9 # start docker start 186ef9b2aaa9(컨테이너명) ✔ 186ef9b2aaa9 # 컨테이너 내부로 접속하기 docker exec -it server /bin/bash # index.html 파일 생성한 경로로 이동하여 다음 명령어 실행 # 앞쪽 host Volume, 뒤쪽 container Volume # Mac 기준 docker run --name server -d -p 8080:80 -v ./index.html:/usr/share/nginx/html/index.html nginx
Shell
복사
nginx 서버 접속 확인
실습
# Mac 기준 docker nginx 구축 및 index.html 생성 docker run --name server -d -p 8080:80 -v ./index.html:/usr/share/nginx/html/index.html nginx # index.html에 likelion 입력 echo "likelion" > index.html
Shell
복사

MySQL 설치

container 설치
docker run --name database -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=backend mysql:8.0
Shell
복사
강제 삭제
docker rm -f database
Shell
복사
mysql 컨테이너 생성 + volume 추가 + 테이블 생성, 데이터 추가
volume을 활용하면 container 삭제를 하더라도 나중에 다시 run 하게 되면 데이터가 살아있다.
위의 “강제 삭제” 명령어 실행 후 다시 아래의 명령어를 실행하게 되면 데이터가 다시 살아있음을 확인할 수 있다.
docker run --name database -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=backend -v ./volumes/mysql-data:/var/lib/mysql mysql:8.0
Shell
복사
create table test( id INT AUTO_INCREMENT PRIMARY KEY, user VARCHAR(50) NOT NULL, address VARCHAR(50) NOT NULL ); insert INTO test(user, address) VALUES('홍길동' ,'부산'); select * from test;
SQL
복사

인텔리제이 실습

Controller 생성
package org.example.backendproject.user.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") public class UserController { @Value("${PROJECT_NAME:web Server}") private String instanceName; @GetMapping public String test() { return instanceName; } }
Java
복사
실행 후 결과 확인 - localhost:8080/api 접속
명령어 실행
jar 파일 활용하여 웹 서버 만들 수 있는 컨테이너 만들 예정
./gradlew clean build
Shell
복사
Welcome to Gradle 8.14.2! Here are the highlights of this release: - Java 24 support - GraalVM Native Image toolchain selection - Enhancements to test reporting - Build Authoring improvements For more details see https://docs.gradle.org/8.14.2/release-notes.html OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended BUILD SUCCESSFUL in 4s 8 actionable tasks: 8 executed
Shell
복사
Dockerfile 생성
#사용할 베이스 이미지 명시 (공식 이미지 권장) FROM openjdk:17-jdk #작업 디렉토리 생성 및 설정(컨테이너 내부 경로에 시작점으로 지정 -> 없으면 생성 됨) WORKDIR /app #jar파일 등 빌드 결과물을 컨테이너에 복사 (호스트 -> 컨테이너) COPY build/libs/backendProject-0.0.1-SNAPSHOT.jar /app/backendProject-0.0.1-SNAPSHOT.jar #컨테이너 실행시 기본으로 실행할 명령 CMD ["java", "-jar", "/app/app.jar"]
Docker
복사
docker 이미지 만들기 (Dockerfile이 있는 경로에서 실행)
예시: docker build -t [이미지이름]:[태그] [Dockerfile경로]
docker build -t backend .
Shell
복사
이미지 생성 확인 - backend
backend 컨테이너 생성
docker run --name backend -d -p 8050:8080 backend
Shell
복사
localhost:8050/api 에 접속해서 확인
설치한 backend 컨테이너 삭제
docker rm -f backend
Shell
복사

도커로 네트워크 구성해서 Nginx + Spring 서버 연동하기

도커 네트워크 구성
docker network create my-network
Shell
복사
container 생성
docker run --name backend -d -p 8050:8080 --network my-network backend
Shell
복사
부분
설명
docker run
새로운 컨테이너를 생성하고 실행하는 기본 명령어.
--name backend
컨테이너 이름을 backend로 지정합니다. 나중에 docker stop backend, docker logs backend 등으로 식별 가능.
-d
컨테이너를 백그라운드(Detached) 모드로 실행. 터미널을 차지하지 않고 실행됨.
-p 8050:8080
호스트 포트 8050을 컨테이너 포트 8080에 바인딩. 즉, 브라우저에서 localhost:8050으로 접속 시 컨테이너 내부 8080 포트로 연결됨.
--network my-network
컨테이너를 my-network라는 사용자 정의 Docker 네트워크에 연결. 같은 네트워크에 있는 컨테이너들끼리는 컨테이너 이름으로 통신 가능 (예: http://nginx:80)
backend
사용할 이미지 이름. 여기서는 backend라는 이름의 Docker 이미지를 사용해 컨테이너를 생성.
예시 시나리오
backend라는 이름의 Spring Boot 앱을 Dockerfile로 빌드해둠
이 앱은 8080 포트에서 실행됨
외부에서는 localhost:8050으로 접근할 수 있음
같은 네트워크에 있는 nginx 컨테이너에서 http://backend:8080으로 접근 가능
Q. p 없이 실행하면 어떻게 되는가?
외부(브라우저, Postman 등)에서는 접근할 수 없고, 같은 Docker 네트워크 내 컨테이너끼리만 통신 가능.
Q. -network는 왜 필요한가?
nginx 등 다른 컨테이너가 이 backend 컨테이너에 컨테이너 이름(backend)으로 직접 접근하려면 같은 네트워크에 있어야 하기 때문.
nginx 폴더 생성 후 폴더 안에 nginx.conf 생성
8080으로 통신하기 때문에 proxy_pass를 http://backend:8080/api 로 설정
worker_processes 1; events { worker_connections 1024; } http { server { listen 80; location / { proxy_pass http://backend:8080/api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }
Plain Text
복사
설정 항목
의미
worker_processes 1;
nginx가 사용하는 프로세스 수
worker_connections 1024;
동시 접속 처리 수
listen 80;
80번 포트로 외부 요청 수신
proxy_pass
요청을 다른 서버(백엔드)로 전달
proxy_set_header
요청 헤더 전달 (호스트, 사용자 IP 등)
nginx container 생성
docker run --name nginx -d -p 80:80 -v ./nginx/nginx.conf:/etc/nginx/nginx.conf --network my-network nginx
Shell
복사
명령어 구조 분석
구성 요소
의미 및 설명
docker run
새로운 Docker 컨테이너를 생성하고 실행.
--name nginx
컨테이너의 이름을 nginx로 지정합니다. 나중에 docker stop nginx, docker logs nginx 등으로 쉽게 조작 가능.
-d
Detached mode (백그라운드 모드) 로 실행합니다. 터미널을 점유하지 않고, 컨테이너가 백그라운드에서 계속 실행.
-p 80:80
호스트의 80번 포트컨테이너의 80번 포트에 바인딩. 브라우저에서 localhost:80 접속 시 nginx 컨테이너의 80 포트로 연결됨.
-v ./nginx/nginx.conf:/etc/nginx/nginx.conf
호스트의 nginx 설정 파일(./nginx/nginx.conf)을 컨테이너의 /etc/nginx/nginx.conf에 마운트. 설정 파일을 외부에서 직접 수정 가능하며, 컨테이너 재시작 시 반영됨.
--network my-network
my-network라는 사용자 정의 Docker 네트워크에 컨테이너를 연결. 같은 네트워크 내의 다른 컨테이너들과 컨테이너 이름으로 직접 통신 가능
nginx
사용할 이미지 이름. 여기서는 nginx:latest 이미지 사용 (명시하지 않으면 latest 태그로 자동 설정됨)
docker container 확인
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ba569734902 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp nginx 01c559120566 backend "java -jar /app/back…" 20 minutes ago Up 20 minutes 0.0.0.0:8050->8080/tcp backend 6042b0ac8094 mysql:8.0 "docker-entrypoint.s…" 2 hours ago Up 2 hours 33060/tcp, 0.0.0.0:3307->3306/tcp database 6fd5bc78596f mariadb:latest "docker-entrypoint.s…" 3 weeks ago Exited (0) 5 hours ago mariadb-container e45d2e2fe514 mysql:8.2.0 "docker-entrypoint.s…" 4 months ago Exited (0) 4 months ago mysql-container
Shell
복사
localhost:8080/api 로 접속하여 확인

Docker-Compose

여러 개의 컨테이너를 한 번에 정의하고, 실행하고, 관리하는 도구
docker-compose.yaml
다음과 같은 구조의 docker-compose.yaml 파일 작성
services: backend1: # 서비스 이름은 컨테이너간 통신하기 위한 이름 image: backend container_name: backend1 environment: PROJECT_NAME: 백앤드 서버1 backend2: # 서비스 이름은 컨테이너간 통신하기 위한 이름 image: backend container_name: backend2 environment: PROJECT_NAME: 백앤드 서버2 backend3: # 서비스 이름은 컨테이너간 통신하기 위한 이름 image: backend container_name: backend3 environment: PROJECT_NAME: 백앤드 서버3 nginx: image: nginx:1.25 container_name: nginx ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - backend1 - backend2 - backend3
YAML
복사
nginx.conf 수정
worker_processes 1; events { worker_connections 1024; } http { upstream spring_backend { server backend1:8080; server backend2:8080; server backend3:8080; } server { listen 80; location / { proxy_pass http://spring_backend/api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
Plain Text
복사
컨테이너 생성 및 시작 (docker-compose.yaml 파일이 있는 경로에서 명령어 실행)
docker compose up -d
Shell
복사

5. 수업 때 접한 에러 정리

backend5 디렉토리 생성 후 docker 명령어 실행 시 에러 발생

docker: Error response from daemon: Mounts denied: The path /index.html is not shared from the host and is not known to Docker. You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing. See https://docs.docker.com/desktop/settings/mac/#file-sharing for more info.
Shell
복사
docker run --name server -d -p 8080:80 -v {pwd}/index.html:/usr/share/nginx/html/index.html nginx 실행하는 과정에서 에러 발생
해당 명령어는 윈도우에서는 정상적으로 되는데 반해 Macbook 같은 경우 공유 폴더 경로에 따라 진행이 안 된다는 내용을 확인
docker run --name server -d -p 8080:80 -v ./index.html:/usr/share/nginx/html/index.html nginx 해당 명령어로 다시 진행 후 정상적으로 동작 확인