Recording/멋쟁이사자처럼 BE 13기

[멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_71일차_"Docker + Linux (3)"

LEFT 2025. 3. 21. 17:14

🦁멋쟁이사자처럼 백엔드 부트캠프 13기 🦁
TIL 회고 - [71]일차

🚀71차에는 도커와 리눅스를 이용하여 함수, 반복문 등을 실습해보고 기존 Spring 프로젝트와 연동해볼 수 있었다.

학습 목표 : 스크립트 파일로 함수, 반복문, 계산기 프로그램 등을 구현가능해야함

학습 과정 : 회고를 통해 작성


$(명령어)

  • ex. $(whoami)
#!/bin/bash
# example.sh: simple script example
echo "Hello, $(whoami)! This is example.sh."
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
echo "current time: $CURRENT_TIME"
  • $CURRENT_TIME : $변수 의 구조이면 이 변수를 출력해줌을 의미
  • $(whoami) : 현재 유저가 누구인지 결과를 담음
    $( ) : 명령치환이라고 하며, 이 명령어를 실행한 결과를 담겠다는 의미

  • echo로 example.sh를 만들고, vi로 내용을 작성한다.
  • 권한을 확인해보면 실행권한이 없으므로
    chmod +x example.sh 로 실행에 대한 권한을 추가해주고
    ./example.sh 로 실행해볼 수 있다.

bash 명령으로도 잘 실행되는 것을 확인할 수 있다.


변수와 제어문

  • 선언 및 대입
    VARIABLE_NAME="Hello"
    ➡️공백 없이 = 기호로 값을 할당 (양옆에 공백이 있으면 에러)

  • 변수 참조
    echo $VARIABLE_NAME echo "${VARIABLE_NAME}"
    ➡️$변수이름 혹은 ${변수이름} 형태로 해당 변수를 참조

지역 변수 vs 환경 변수

  • 기본적으로 VARIABLE_NAME="value" 로 할당하면 지역 변수(현재 스크립트 혹은 쉘에만 유효)
    export VARIABLE_NAME="value" 로 선언하면 환경 변수가 되어, 자식 프로세스에서도 인식 가능

  • 환경변수로 지정해놓으면 어느위치에서라도 불러서 사용할 수 있을 것
  • echo $JUUNB 처럼 바로 불러서 사용할 수 있지만
    만약 지역변수 (ex. JUUNB = “gnob”) 로 할당하면 현재 스크립트나 쉘에서만 유효하게된다.

  • 위치 매개변수 : 스크립트가 실행될 때 인자로 받은 값들은 $1 , $2 , …, $9 등으로 접근 가능
    $0 은 스크립트 자체의 이름
    #!/bin/bash echo "첫 번째 인자: $1" echo "두 번째 인자: $2"

▶️실습 - 위치매개변수

  • 이처럼 example.sh 뒤에 인자들을 넣어주면 그대로 위치매개변수를 사용하여 매핑되도록 할 수 있고,
  • echo -n “이름을 입력하세요” 와 read 명령어를 통해 입력받은 이름을 출력하도록 할 수도 있다.
  • read 명령어 : 키보드 입력을 받아 변수에 저장이 가능한 명령어
  • echo -n : 줄바꿈없이 프롬프트만 표시하기 위해 사용 (-p옵션은 출력문을 넣어줄 수 있음)

if문

# 조건이 참(true)일 때 실행되는 부분
if [ 조건식 ]; then

# 위 조건이 거짓이고, 이 조건이 참일 때 실행되는 부분
elif [ 다른_조건식 ]; then

# 모든 조건이 거짓(false)일 때 실행되는 부분
else

fi
  • then 과 fi (if의 반대)처럼 사용
  • 대괄호( [ ] ) 안에 들어가는 조건식에는 test 명령 형식을 사용

ex.

#!/bin/bash
VAR="Hello"
if [ "$VAR" = "Hello" ]; then
	echo "인사말 확인!"
else
	echo "다른 단어입니다."
fi
  • = : 자바에서의 == 와 같은 기능

정수 비교 연산자

#!/bin/bash
NUM=5
if [ $NUM -gt 3 ]; then
	echo "NUM이 3보다 큽니다."
else
	echo "NUM이 3 이하입니다."
fi
  • eq (같다) (=equals)
  • ne (같지 않다) 
  • -gt (크다)
  • -ge (크거나 같다)
  • - lt (작다)
  • -le (작거나 같다)

case 문

#!/bin/bash
read FRUIT
case "$FRUIT" in
	"apple")
		echo "사과입니다."
		;;
	"banana")
		echo "바나나입니다."
		;;
	*)
		echo "기타 과일입니다."
		;;
esac
  • *) : 모든 경우를 포괄하는 기본(default) 패턴
  • 리눅스 기본 명령각 패턴 블록 끝에는 ;; (더블 세미콜론)을 넣어 구분

함수

  • 함수 안에서 인자(매개변수) 사용하기 함수를 호출할 때 인자를 넘기면,
    위치 매개변수( $1 , $2 , …)를 통해 접근 가능
#!/bin/bash
my_function() {
	echo "첫 번째 인자: $1"
	echo "두 번째 인자: $2"
}

my_function "apple" "banana"
#!/bin/bash

#외부파일에서 함수 가져오기
source functions.sh

# . functions.sh
my_function "fail"

echo "함수의 반환값 : $?"
  • 외부파일에서 함수를 가져와서 사용할 수도 있다.

배열

배열 선언

  • 공백 분리 형태
    FRUITS=("apple" "banana" "cherry")
    ➡️인덱스 0 에 "apple" , 1 에 "banana" , 2 에 "cherry" 가 할당

  • 인덱스별 할당
    FRUITS[0]="apple" FRUITS[1]="banana" FRUITS[2]="cherry"
    ➡️배열 요소를 개별적으로 지정

배열 참조

  • 특정 인덱스 접근
    echo ${FRUITS[1]} # banana

  • 전체 요소
    echo ${FRUITS[@]} # apple banana cherry ${FRUITS[*]}

배열 길이

  • 배열의 길이(요소 개수) : ${#배열이름[@]} 또는 ${#배열이름[*]}
    ex. echo "배열 길이: ${#FRUITS[@]}" 예시 결과: 3

요소 추가·삭제

  • 요소 추가: FRUITS[3]="mango"
  • 요소 삭제: unset 명령어를 사용.
    unset FRUITS[1]

  • 전체 배열 삭제: unset FRUITS
#!/bin/bash
# example: arrayexam.sh

# 1) 함수 선언
calc_sum() {
    # 인자로 받은 두 정수를 더해 결과를 echo
    local num1=$1
    local num2=$2
    local result=$((num1 + num2))
    echo $result
}

# 함수 사용(명령 치환)
SUM_RESULT=$(calc_sum 5 10)
echo "5 + 10 = $SUM_RESULT"

# 2) 배열 사용
COLORS=("red" "green" "blue")
COLORS[3]="yellow"

echo "COLORS 배열의 길이: ${#COLORS[@]}"
echo "모든 COLOR: ${COLORS[@]}"

# 인덱스를 이용한 반복
for (( i=0; i<${#COLORS[@]}; i++ ))
do
    echo "COLORS[$i] = ${COLORS[$i]}"
done


▶️실습 - 간단계산기 만들기

#!/bin/bash
# simple_calc.sh: 두 수에 대한 사칙연산 예시

echo -n "1번째 정수 입력: "
read NUM1
echo -n "2번째 정수 입력: "
read NUM2

# 덧셈
SUM=$((NUM1 + NUM2))
# 뺄셈
SUB=$((NUM1 - NUM2))
# 곱셈
MUL=$((NUM1 * NUM2))
# 나눗셈
if [ $NUM2 -ne 0 ]; then
    DIV=$((NUM1 / NUM2))
else
    DIV="나눌 수 없음(0으로 나눔)"
fi

echo "-----[결과]-----"
echo "  $NUM1 + $NUM2 = $SUM"
echo "  $NUM1 - $NUM2 = $SUB"
echo "  $NUM1 * $NUM2 = $MUL"
echo "  $NUM1 / $NUM2 = $DIV"

  • $(( )) : 정수연산을 수행

▶️실습 - 확장자 변경 프로그램

#!/bin/bash
# batch_copy_rename.sh: .sh 파일을 .bak로 복사 후 files 디렉토리로 이동

TARGET_DIR="./files"  # 최종 저장할 디렉토리
SOURCE_DIR="."        # 원본 파일이 있는 디렉토리

echo "=== SH 파일을 BAK로 변경하여 files 디렉토리로 복사 ==="

# files 디렉토리가 없으면 생성
if [ ! -d "$TARGET_DIR" ]; then
    echo "files 디렉토리가 없습니다. 생성합니다: $TARGET_DIR"
    mkdir -p "$TARGET_DIR"
fi

# 현재 디렉토리 내 .sh 파일을 찾아 .bak으로 복사
for FILE in "$SOURCE_DIR"/*.sh
do
    # 파일이 실제 존재하는지 확인
    if [ ! -f "$FILE" ]; then
        echo "대상 파일이 없습니다: $FILE"
        continue
    fi

    BASENAME=$(basename "$FILE" .sh)  # 확장자 없이 파일명만 추출
    NEWFILE="$TARGET_DIR/$BASENAME.bak"  # 변경된 파일 경로

    cp "$FILE" "$NEWFILE"  # 원본 파일을 .bak으로 복사
    echo "Copied: $FILE -> $NEWFILE"
done

echo "=== 완료 ==="

  • 원본은 유지한채 확장자 변경된 파일들을 files 디렉토리에 저장하는 것으로 바꿔서 실습

🚀기존 프로젝트 + 리눅스 서버

  • 기존에는 인텔리J에서 서버를 동작시키고
    localhost:8080/hello 처럼 도메인에 접속해서 그 실행들을 확인할 수 있었다.

  • 리눅스 서버에 IntelliJ를 설치하는 것이 아닌 Java를 설치 후
    gradlew 파일과 .jar파일을 이용해서 서버 동작이 가능하다.
    (=build 후에 생긴 build/libs 에 들어가보면 jar파일이 있는데 이 jar파일을 실행시켜 동작하는 것)

  • ❓리눅스 서버에서 동작하고 애플리케이션을 컨테이너 밖 브라우저가 접속하게하기위해선

    ex. MySQL이 컨테이너 안에서 동작하고 있을때 (Docker - 가상환경)
    밖에있는 브라우저에서 접속이 가능했던 것처럼

    ⭐밖에 있는 포트와 안에 있는 포트를 연결시키는 과정이 필요할 것

 

내부 포트와 외부 포트 연결

  • docker-compose.yml을 수정하는데 ports에 포트를 추가
  • 8080으로 열린 컨테이너를 9090으로 접속할 수 있도록 설정을 추가한 것
  • 정리하자면
    도커 안에 방 여러개가 존재
    도커 안에 있는 22번 방에서 ssh가 동작
    도커 안에 있는 8080번 방에서 http가 동작

    22번 방에 접속하기 위해서는 그 컨테이너 밖에서는 2222로 접속하게끔 설정한 것
    8080번 방에 접속하기 위해서는 그 컨테이너 밖에서는 9090로 접속하게끔 설정한 것

  • ssh는 연결통로를 열어주는 역할 (도커의 컨테이너로 들어갈 수 있는 연결통로를 열어줌)

 

포트 연결 변경사항 적용

  • docker-compose down 을 먼저 해준 후
  • docker-compose up -d --build --force-recreate 수행
    (=다시 재생성하는 것)

  • 리빌드 후 다시 ssh로 접속해볼 수 있다.

jdk 설치

  • yum install -y java-21-amazon-corretto-devel

  • git --version 으로 git설치 확인되었는지 확인

  • util을 찾기 위한 find 명령어 설치

🚀실습 - 간단한 프로젝트와 연동

  • https://아이디:토큰@저장소주소
    처럼 git clone 해주면 인증절차를 받고 clone 가능

  • chmod 로 권한을 부여하고, gradlew를 build

  • .jar파일을 확인하고 java -jar 명령어로 실행해주면 리눅스에서 spring서버를 실행 가능

  • 포트 설정에 따라 리눅스 서버 내부에서 열린 8080서버는 외부 브라우저에서 9090포트로 접속이 가능

🚀회고 결과 :

기존의 프로젝트에서 IntelliJ 없이도 터미널에서 서버가 동작했던 것처럼 리눅스 서버로 동작할 수 있음을 연습해볼 수 있었다.

처음에 구조가 어려울 것 같았지만 포트 연결 설정을 해주면 외부 브라우저에서도 접속이 가능하다는 것을 회고를 통해 더 공부할 수 있었다.

향후 계획 : 

- 스크립트 언어 연습