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
복사
•
•
명령어 실행
◦
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로 지정합니다. |
-d | 컨테이너를 백그라운드(Detached) 모드로 실행. |
-p 8050:8080 | 호스트 포트 8050을 컨테이너 포트 8080에 바인딩.
|
--network my-network | 컨테이너를 my-network라는 사용자 정의 Docker 네트워크에 연결.
|
backend | 사용할 이미지 이름.
여기서는 backend라는 이름의 Docker 이미지를 사용해 컨테이너를 생성. |
예시 시나리오
•
backend라는 이름의 Spring Boot 앱을 Dockerfile로 빌드해둠
•
이 앱은 8080 포트에서 실행됨
•
외부에서는 localhost:8050으로 접근할 수 있음
•
같은 네트워크에 있는 nginx 컨테이너에서 http://backend:8080으로 접근 가능
Q. p 없이 실행하면 어떻게 되는가?
Q. -network는 왜 필요한가?
•
nginx 폴더 생성 후 폴더 안에 nginx.conf 생성
◦
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로 지정합니다. |
-d | Detached mode (백그라운드 모드) 로 실행합니다. |
-p 80:80 | 호스트의 80번 포트를 컨테이너의 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 해당 명령어로 다시 진행 후 정상적으로 동작 확인