[인프런 워밍업 스터디 클럽 1기] BE 3주차 회고록
세 번째 발자국
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고
인프런 워밍업 클럽에 참여하여 쓰는 세 번째 회고록입니다.
학습 내용
배포란?
최종 사용자에게 SW를 전달하는 과정이다. = 전용 컴퓨터에 우리의 서버를 옮겨 실행시키는 것
서버용 컴퓨터는 보통 리눅스
를 사용한다.
profile과 H2 DB
profile : 똑같은 서버 코드를 실행시키지만, 실행될 때 설정을 다르게 하고 싶다.(ex. Database)
[예시]
local profile -> H2 DB
dev profile -> MySQL DB
H2 DB
경량 database로, 개발 단계에서 많이 사용하며 디스크가 아닌 메모리에 데이터를 저장할 수 있다.
메모리에 데이터를 저장하면 휘발되는 특징으로 인해
개발 단계
에서만 사용한다개발단계에서는 테이블이 계속 변경되는데, 데이터가 휘발되기에
ddl-auto 옵션을 create
로 주면 테이블이 자동 생성/삭제가 되기에 주로 사용된다.
git/github
git
코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램
github
git으로 관리되는 프로젝트의 코드가 저장되는 저장소
사용하는 이유?
코드는 어떠한 이유로든 소실이 될 가능성이 있다.
배포를 할 때 활용할 수 있다.
git 명령어
git init
해당 프로젝트를 git이 관리하겠다는 의미
git 프로젝트의 github 저장소 설정
git remote add origin [git 주소]
코드를 git에 모든 파일을 넣는다
git add .
Git 커밋 명령어
git commit -m '메시지'
Git 푸시 명령어
git push
코드 github에 최초로 보내기
git push --set-upstream origin master
Git 상태 확인
git status
.gitignore
파일 안에 적힌 폴더 및 파일의 이름은 깃으로 관리하지 않는다.
EC2에 접속해서 리눅스 명령어 다뤄보기
EC2 접속 방법
다운로드 받은 키 페어(pem key)를 이용하는 방법
접속하려는 EC2의 IP 주소
다운로드 받은 키 페어
접속하기 위한 프로그램(git CLI or Mac Terminal)
chmod 400 키페어이름.pem
ssh -i 경로/키페어이름.pem ec2-user@IP
AWS 콘솔을 활용해서 접속하는 방법
기본적인 리눅스 명령어
mkdir : 폴더를 만드는 명령어
ex) mkdir folder1
ls : 현재 위치에서 폴더나 파일을 확인하는 명령어
ls -l : 조금 더 자세한 정보를 확인할 수 있다.
drwxrwxr-x : folder1은 폴더이다.
drwxrwxr-x
r : 읽는 권한, w : 쓸 수 있는 권한, x : 실행 권한
rwx/rwx/r-x
폴더 소유자 권한 / 폴더 소유 그룹 권한/ 모든 접근의 권한
2 : 폴더에 걸려 있는 바로가기 개수
ec2-user : 폴더 소유주의 이름
ec2-user : 폴더 소유 그룹의 이름
6 : 폴더(파일의 크기) 단위 : byte
cd(change directory) : 폴더 안으로 들어가는 명령어
ex) cd folder2
pwd(print working directory) : 현재 위치 확인하는 명령어
/home/ec2-user/folder1
cd .. : 상위 폴더로 올라가는 명령어
rmdir : 특정 폴더(디렉토리) 제거하는 명령어
배포를 위한 프로그램 설치하기
코드를 가져오기 위한 Git
sudo yum install git : yum을 이용한 프로그램 다운로드 진행한다.
서버를 구동할 Java
sudo yum install java-11-amazon-corretto -y
java -version : 자바 버전 확인
데이터베이스 MySQL
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf install mysql-community-server
sudo systemctl status mysqld
sudo systemctl restart mysqld
sudo cat /var/log/mysqld.log | grep "A temporary password"
mysql8의 임시 비밀번호를 확인하는 명령어
alter user 'root'@'localhost' identified with mysql_native_password by 'Abdc1234!';
비밀번호는 대/소문자, 특수문자 포함 8자 이상
리눅스에서 스프링 배포 프로그램 설치
sudo yum update
sudo : 관리자 권한 실행
yum : 리눅스 패키지 관리 프로그램(ex. gradle과 비슷한 역할)
update : 현재 프로그램들을 최신화 설정한다.
빌드와 실행, 그리고 접속
git 코드 로딩 :
git clone [github 저장소 주소]
swap 설정
기존에는 RAM을 사용해야하지만 RAM의 용량이 부족한 경우, 일부 Disk를 사용하게 해준다.
#swap 메모리를 할당한다. (128M 16 = 2GB)
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
#스왑 파일에 대한 권한 업데이트
sudo chmod 600 /swapfile
#swap 영역 설정
sudo mkswap /swapfile
#swap 파일을 사용할 수 있도록 만든다.
sudo swapon /swapfile
#swap 성공 확인
sudo swapon -s
chmod +x ./gradlew
gradlew를 사용하기 위해 실행할 수 있도록 설정한다.
./gradlew build -x test
gradle을 이용해 프로젝트를 빌드한다. -> 테스트코드는 실행하지 않는다.
java -jar build/libs/library-app-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
--spring.profiles.active=dev : 설정 파일
등록 이후에 인스턴스 인바운드 규칙 설정을 해줘야한다.
8080 포트 Open
jar 파일만 실행했는데 서버가 동작하는 이유?
SpringBoot 에는
톰캣(Tomcat)
이 내장되어 있기 때문이다.톰캣(Tomcat)
웹 애플리케이션 서버(WAS)의 한 종류로써, 요청이 들어오면 그 요청을 약속된 형식에 맞추어 스프링에 전달해준다.
실행 중인 서버 중단
ctrl + c
./gradlew clean
현재 빌드되어 있는 결과물 제거
foreground vs background
foreground
우리가 보고 있는 프로그램
ex) PDF 프로그램이 foreground 프로그램
background
우리가 보고 있지 않은데 실행중인 프로그램
ex) 컴퓨터에서의 백신 프로그램
리눅스에서 background로 동작하게 만드는 명령어
nohup [명령어] &
nohup java -jar build/libs/library-app-0.0.1-SNAPSHOT.jar &
rm nohup.out
background 서버 다운
작업관리자 명령어
ps aux : 현재 실행중인 프로그램 목록을 확인할 수 있다.
ps aux | grep java :
java
가 들어가는 프로그램을 확인한다.kill -9 프로그램번호 : 해당 프로그램을 종료시킨다.
파일의 내용물을 확인하는 방법
파일에 직접 들어가 내용물 확인
vi : 리눅스 편집기인
vim
을 사용하여 파일을 접속한다. (ex. vi nohup.out)
파일에 들어가지 않고 현재 접속중인 터미널을 활용하는 방법
cat : 파일에 있는 내용물을 모두 출력하는 명령어(ex. cat nohup.out)
파일 내용물의 양이 많지 않고, 실시간 업데이트가 잘 되지 않는 파일을 확인할 때 사용한다.
tail : 현재 파일의 끝 부분을 출력하는 명령어
tail -f : 현재 파일의 끝부분을 실시간으로 출력해준다.
과제 내용
Day 6
Controller, Service, Repository의 3단 분리 구조를 채택하여 백엔드 설계를 진행했습니다.
Repository 클래스에서는 jdbcTemplate를 활용해 SQL문을 직접 작성하고 데이터베이스와 직접적으로 연결하는 방식을 택했습니다. 이 과정에서 @Repository 어노테이션을 활용한 생성자를 통한 의존성 주입이 이루어지는 것을 확인할 수 있었습니다.
특히, 다양한 저장소 구현체(FruitMySqlRepository, FruitMemoryRepository)를 만들면서, @Primary
어노테이션을 활용하여 서비스 로직이 실행될 때 어떤 레포지토리 레이어를 우선적으로 사용할지 결정하는 방식을 경험했습니다. 이러한 구조적 접근은 유연하고 확장 가능한 백엔드 시스템을 구축하는 데 큰 도움이 되었습니다.
📋 6일차 미션: 레이어 3단 분리
Day 7
JDBCTemplate을 사용해 시스템을 구축한 DB를 성능 개선과 유지보수의 편의성을 위해 JPA
로 전환하였습니다.
엔티티 클래스인 Fruit에서는 과일의 이름, 입고 날짜, 가격, 판매 여부를 관리했습니다. JPA의 강력함은 FruitRepository 인터페이스를 통해 드러났다. 여기서 단순 조회부터 복잡한 조건의 데이터 처리까지 어노테이션 몇 개로 해결할 수 있었습니다. FruitServiceV2에서는 과일의 저장, 판매 상태 업데이트, 통계 조회 등 핵심 비즈니스 로직을 구현하여, 코드의 간결함과 효율성을 극대화했습니다.
특히, 과일의 개수를 세거나, 특정 가격 이상 또는 이하의 과일을 조회하는 기능을 추가하며, JPA의 유연성과 편리함에 다시 한번 감탄했습니다. 이 모든 과정을 통해, 나는 JPA의 놀라운 잠재력을 경험하며, 보다 나은 소프트웨어 개발자로 성장할 수 있는 계기를 마련한 것 같습니다.
📋 7일차 미션: JPA 구현
회고
SW 배포는 최종 사용자에게 소프트웨어를 전달하는 과정으로, 리눅스 기반 서버 컴퓨터에서 주로 이루어집니다. 개발 단계에서는 경량화된 H2 DB를 활용하여 데이터의 휘발성을 감안한 개발 환경을 구축합니다. Git과 GitHub을 통한 버전 관리 및 코드 저장소 활용은 코드 소실 방지와 효율적인 배포 과정을 지원합니다. EC2와 리눅스 명령어를 통한 서버 접속 및 관리, 그리고 리눅스 환경에서의 스프링 배포는 필수적인 프로세스라는 것을 알게 되었습니다.
또한, Controller, Service, Repository의 3단 분리 구조를 채택하여 백엔드 설계를 진행하고, JDBCTemplate에서 JPA로 전환하여 성능 개선과 유지보수의 편의성을 높였습니다. 이 모든 과정은 유연하고 확장 가능한 백엔드 시스템 구축과 개발자로서의 성장에 밑거름이 된 거 같습니다.
댓글을 작성해보세요.