본문 바로가기
배포/Linux(Ubuntu)

2. 로컬 리눅스에서 애플리케이션 빌드 및 배포

by moca7 2024. 12. 4.

 

 

 

 

ㅁ ftp에 들어가서 guestbook.zip을 내 pc로 복사해서 가져온다.

 

 

 

 

 

 

- 내 pc로 가져온 guestbook.zip을 압축된 상태 그대로 MobaXterm으로 드래그한다. 

 

 

 

 

 

 

- 드래그해서 가져온 후 ls를 쳐서 파일이 보이는지 확인한다.

 

 

- cmd 창은 닫으면 안된다. cmd 창을 닫으면 서버가 꺼진다.

cmd 창이 꺼져버리면 시스템이 꺼지는 것이고, 꺼진 시스템에 접속은 불가능하다.

 

- 만약 cmd 창을 껐다면 다시 검색에서 ubuntu를 찾아서 키고, sudo service ssh start를 한다.

그래야 MobaXterm으로 접속할 수 있다.

MobaXterm은 서버가 켜져있으면 접속하는 프로그램일 뿐이다.

 

 

 

 

 

ㅁ 참고(guestbook.zip 내용)

 

 

 

- 이렇게 생겼다.

 

 

 

 

 

 

 

 

○ sudo apt install unzip

- unzip 유틸리티를 설치하는 명령어다.

 

 

 

 

 

- unzip 유틸이 설치되었다.

 

 

 

 

 

 

 

 

○ unzip guestbook.zip

- guestbook.zip 파일의 압축을 해제하는 명령어다.

 

 

 

 

 

 

○ ls 

- 압축이 다 풀렸으면 ls로 현재 디렉토리 내 파일 및 디렉토리 목록을 확인한다.

guestbook.zip 압축파일과 guestbook 폴더가 있다.

 

 

○ cd guestbook

- guestbook으로 이동한다.

 

 

○ ls  

- 다시 ls로 현재 디렉토리 내 파일 및 디렉토리 목록을 확인한다.

 

- src 디렉토리에는 소스 코드가 들어 있다.

- mvnw는 Maven Wrapper로 Maven을 간편하게 실행하기 위한 스크립트이다.

이제 Maven을 사용해 빌드 작업을 수행하여 JAR 파일을 생성할 것이다.

 

 

 

 

 

 

○ cd src

○ ls

 

○ cd main

○ ls

 

○ cd resources

○ ls

- 우리가 이클립스에서 보던 구조다.

 

 

○ nano application.properties

- Spring Boot 또는 Java 애플리케이션에서 사용되는 설정 파일(application.properties)을 열어서 편집하는 명령어다.

 

- nano는 터미널 기반의 텍스트 편집기다.

- application.properties는 애플리케이션의 환경 설정 정보를 담고 있는 파일이다.

 

 

 

 

 

 

- application.properties가 열렸다.

 

 

 

 

 

 

- 맨 윗줄의 server.port=80는 애플리케이션의 서버 포트를 80번 포트로 설정하는 구문이다.

주석처리하면 8080 포트가 된다. 주석처리한다.

 

- 맨 아래 Use Environment Variable 부분의 3줄을 주석처리한다.

- 가운데 Static setting 부분의 3줄은 주석을 해제한다.

 

 

 

 

 

 

 

- ip주소를 바꾼다.

현재 시스템에 디비가 있으면 localhost를 쓰면 되고, 디비가 별도로 있으면 db 서버의 ip주소를 적으면 된다.

 

- 보통 오라클은 외부에서 접속이 다 되는데 MariaDB 등은 외부접속을 할 수 있게 그쪽에서 권한을 줘야 한다.

 

- guestbook은 데이터베이스명이다.

 

- username을 admin, 비번을 1234로 바꾼다.

 

 

 

 

 

 

- ctrl+x, y, 엔터로 저장하고 나간다.

 

 

 

 

 

 

 

○ cd

- cd하고 바로 엔터치면 홈 디렉터리로 돌아온다.

 

○ cd -

- cd -하고 엔터치면 직전 디렉토리로 돌아간다.

 

 

○ sudo apt install mariadb-server 

- 디비를 설치한다. 마리아 디비로 설치한다.

- y를 누른다.

 

 

 

 

============================================================================

 

 

 

[4교시]

 

 

 

ㅁ사용자를 만들고, guestbook이라는 db를 만들어 본다.

 

 

 

 

 

○ netstat -ntlp

- 3306이 떠있다. 마리아디비 서버가 동작하고 있다는 얘기다.

 

- 중요한건 그 앞의 주소다. 127.0.0.1 이렇게 되어있으면 로컬에서만 접근이 가능하다.

이 서버에서만 접속이 가능하다. 외부에선 못들어간다.

 

- 외부에서도 들어올 수 있도록 하려면 0.0.0.0으로 바꿔야 한다. 나중에 바꿔본다.

 

 

 

 

 

 

 

○ sudo mariadb -uroot -p

- MariaDB에 루트 사용자로 접속하기 위한 명령어다.

- Enter password라고 뜬다. 그냥 엔터쳤다.

나는 Enter password가 한번 떴는데, 두번 뜨면 첫번째는 사용자의 패스워드다. 

- 아무튼 Enter password는 엔터를 두번 쳤다.

 

- sudo : 관리자 권한으로 명령어 실행.

- mariadb: MariaDB 클라이언트를 실행하여 데이터베이스 서버에 접속.

- -uroot: root 사용자로 접속.

- -p: 패스워드 입력을 요청한다. 명령어 실행 후 MariaDB 루트 계정의 비밀번호를 입력해야 접속할 수 있다.

 

 

 

 

 

 

○ create database guestbook;    

- MariaDB에서 guestbook이라는 이름의 새 데이터베이스를 생성하는 명령어다.

 

 

○ create user admin@localhost;  

- admin이라는 사용자를 하나 만들었다.

 

 

○ grant all privileges on guestbook.* to admin@localhost identified by '1234'; 

- 그리고 사용자에게 디비를 사용할 수 있는 권한을 줬다.

 

 

 

 

 

 

 

○ show databases;   

- guestbook이 만들어져 있다.

 

○ exit

- exit으로 나온다.

 

 

 

 


======================================================================

 

 

 

ㅁ 이제 빌드를 한다.

 

 

 

 

○ ls

- 현재 디렉토리 내 파일 및 디렉토리 목록을 확인한다.

 

○ cd guestbook

- 현재 작업 디렉토리를 guestbook 디렉토리로 변경한다.

 

○ ls -l

- 현재 디렉토리의 파일 및 디렉토리 목록을 자세한 정보와 함께 출력하는 명령어다. (long)

 

 

- rw-, rwx 등은 파일 권한을 나타낸다.

r은 read(읽기), w는 write(쓰기), x는 execute(실행)이다.

 

- rwx가 연달아 3개 있다. 순서대로 유저, 그룹, 그외(유저도 그룹도 아닌사람)를 뜻한다.

유저는 파일 소유자를 뜻한다.

그룹은 소유자와 같은 그룹에 속한 사용자들을 뜻한다. 

그외는 소유자도 아니고 그룹에도 속하지 않은 사용자들을 뜻한다.

 


- mvnw는 Maven Wrapper로 CLI에서 Maven 빌드 명령을 실행할 수 있는 스크립트다.

- mvnx에는 지금 x권한이 없다. 그러면 실행할 수가 없다.

 

 

 

 

 

 

○ chmod u+x mvnw

- u+x, g+x, o+x로 유저, 그룹, 그외에 실행권한을 줄수있다.

 

 

 

- 현재 프로젝트의 pom.xml 파일은 MariaDB에 맞게 설정되어 있다.

만약 Oracle 데이터베이스를 사용할 계획이 있다면, 나중에 pom.xml 파일에서 관련 설정을 변경해야 한다.

지금은 MariaDB가 설치된 상태니까 이대로 쓰면된다.

 

- 그럼 이제 빌드를 해본다.

 

 

 

 

 

 

 

○ mvnw

- mvnw 엔터를 해본다. 분명히 있는데도 not found라고 뜬다.

 

 

○ echo $PATH

- 현재 환경 변수 PATH의 값을 출력하는 명령어이다.

 

 

 

- 윈도우는 현재 디렉토리에서 실행 파일을 먼저 찾고 없으면 PATH 변수에 등록된 디렉토리에서 검색하지만,

리눅스에서는 PATH 변수에 등록된 디렉토리 내에서만 찾고 실행할 수 있다.

 

- 만약 PATH에 등록되지 않은 프로그램이나 스크립트를 실행하려면 절대 경로 또는 상대 경로를 사용해야 한다.

 

 

 

 

 

 

 

○ pwd

- 현재 작업 디렉토리(Working Directory)의 절대 경로를 출력하는 명령어다.

 

 

○ ./mvnw clean package

 

- 상대경로에서 .은 현재디렉토리를 의미한다.

'현재 디렉토리에 있는 mvnw를 실행해라'라는 명령어다.

- clean package는 기존에 있던게 혹시 있으면 다 지우라는 것이다.

 

- clean package: Maven 명령어로 두 가지 작업을 수행한다

- clean: 이전 빌드 결과물을 삭제한다.

- package: 소스 코드를 컴파일하고, 테스트 후 JAR(또는 WAR) 파일을 생성한다.

 

 

- 근데 에러가 발생했다. Maven은 Java 환경이 필요하며, JDK가 설치되어 있지 않으면 작동하지 않는다.

 

 

 

○ sudo apt install openjdk-17-jdk

- OpenJDK 17 개발 키트(JDK)를 설치하는 명령어다.

- 지금은 수업 프로젝트에 맞는 jdk 버전이고, 내 프로젝트를 할 때는 내 jdk 버전에 맞춰서 하면 된다.

 

- 코레토를 쓰든 openjdk를 쓰든 오라클에 있는 jdk를 쓰든 기본적인건 다 똑같고 약간의 차이가 있다.

 

- JRE: Java 프로그램을 실행하기 위한 환경. 

- JDK: Java 프로그램을 개발하고 실행할 수 있는 도구.

(JRE를 포함, 자바 애플리케이션을 개발하고 빌드하기 위한 도구가 추가됨)

 

 

 

 

 

 

○ ./mvnw clean package

- JDK를 설치한 후 다시 실행하면 Maven 빌드가 제대로 작동한다.

 

 

 

 

 

 

- 빌드가 성공적으로 완료되면 "BUILD SUCCESS" 메시지가 표시된다.

 

 

 

※ (참고) sudo apt remove openjdk-17

- OpenJDK 17 패키지를 제거하는 명령어다.

 

 

 

 

 

 

○ ls

- 현재 디렉토리 내 파일 및 디렉토리 목록을 확인한다.

 

○ ls target

- 현재 디렉토리 내 target 디렉토리의 파일 및 디렉토리 목록을 출력하는 명령어다.

- Maven 빌드 후 target 디렉토리에는 빌드 결과물(예: JAR, WAR 파일 등)과 관련된 파일이 생성된다.

- 이 명령어를 사용하여 빌드 결과물을 확인한다.

 

- guestbook-1.0.jar : 빌드된 JAR 파일.

- classes/ : 컴파일된 클래스 파일이 저장된 디렉토리.

- generated-sources/ : Maven에서 생성된 소스 코드 디렉토리.

 

 

 

○ java -jar target/guestbook-0.0.1-SNAPSHOT.jar

- 적당히 쓰다가 tab키를 누르면 자동완성이 된다.

- Maven 빌드 결과로 생성된 JAR 파일을 실행하는 명령어다.

 

- java: Java 실행 명령어.

- -jar: JAR 파일을 실행하도록 지정하는 옵션.

- target/guestbook-0.0.1-SNAPSHOT.jar: 실행할 JAR 파일의 경로와 이름.

 

 

 

- 이 명령어 실행 시 JAR 파일에 포함된 메인 클래스가 실행된다.

정상적으로 동작하면 애플리케이션이 시작되고 로그가 출력된다.

 

 

 

 

 

 

ㅁ 브라우저로 접속해보기

 

 

 

 

- 브라우저 주소창에 ip주소 다음 :8080을 입력한다.

ip주소는 ubuntu에서 ip address를 입력해서 나오는 서버 ip 주소다. MobaXterm의 탭에도 써있다.

 

- 사이트에 접속이 되었다. 애플리케이션이 정상적으로 실행되고 배포되었음을 의미한다.

다만 로컬이니까 내 pc에서만 접속 가능하다.

- ngrok을 쓰면 로컬 서버를 외부 네트워크에 노출시켜 외부에서도 접근 가능하게 할 수 있다.

 

 

 

- 우리가 개발한 소스를 JAR 파일로 만들어 두고 데이터베이스를 오라클로 설정한 후 필요한 데이터베이스만 생성한 다음 이렇게 동작시키면 해당 애플리케이션을 실행할 수 있는 상태가 된다.

 

 

 

 

 

 

 

- 현재 애플리케이션이 실행 중이므로 프롬프트를 사용할 수 없다. 

Ctrl + C를 눌러 실행 중인 애플리케이션을 중단한다.

 

 

 

○ java -jar target/guestbook-0.0.1-SNAPSHOT.jar &

- 띄어쓰기하고 &를 붙이면 애플리케이션이 백그라운드에서 동작한다.

- 이로써 애플리케이션은 실행되면서도 프롬프트는 자유롭게 사용할 수 있다.

 

 

 

 

 

 

 

- 엔터를 여러번 치면 저렇게 입력할 수 있게 뜬다.

 

 

 netstat -ntlp

- netstat -ntlp 명령어로 현재 리스닝 상태(대기 상태)인 포트를 확인한다.

 

 

○ jobs

- 현재 실행 중인 백그라운드 작업 목록을 확인하는 명령어다.

- running 이라고 뜨면 작업이 현재 백그라운드에서 실행 중이라는 상태다.

이러면 이제 프롬포트를 하면서도 서비슬를 계속 사용할 수 있다.

 

 

 

 

 

 

ㅁ cd

- cd는 Change Directory(디렉토리 이동)를 의미한다. 작업 디렉토리를 변경하는 명령어다.

 

 

(1) cd

- 홈 디렉토리로 이동한다. (예: /home/admin으로 이동.\)

 

(2) cd 경로

- 지정한 디렉토리로 이동한다.

 

(3) cd ..

- 현재 디렉토리의 상위 디렉토리로 이동합니다. (한 단계 위로 이동)

 

(4) cd ../..

- 현재 디렉토리에서 두 단계 상위 부모 디렉토리로 이동합니다. (두 단계 위로 이동)

 

 

 

 

 

ㅁ cd [절대경로|상대경로]

 

 

(1) 절대경로

 

- '/' 부터 전체경로를 입력하여 이동한다.

- '/'가 없으면 안된다. 루트 디렉토리다.

- 루트 디렉토리(/)부터 시작하는 전체 경로를 입력하여 이동한다.

- 반드시 '/'로 시작한다.

 

- ex) /etc/sysconfig/network-scripts

- ex) 현재 위치가 /home/admin이고, admin 디렉토리에 있는 test 디렉토리로 이동할 경우 cd /home/admin/test

 

 

 

(2) 상대경로

 

- 현재위치를 기준으로 이동한다.

- '/'로 시작하지 않는다.

 

- ex) 현재 위치가 /home/admin이고, admin 디렉토리에 있는 test 디렉토리로 이동할 경우 cd test

 

 

 

 

 

ㅁ 로컬 리눅스에서 애플리케이션 빌드 및 배포

 

(1) JDK와 Maven을 설치하여 빌드 환경 구성

(2) 소스 코드를 로컬 서버로 전송하고 mvnw clean package 명령어로 JAR 파일을 생성.

(3) 생성된 JAR 파일은 java -jar 명령어를 통해 실행하며, 필요 시 백그라운드 실행(nohup)을 설정해 서버를 계속 동작시킬 수 있다.

(4) 애플리케이션이 실행되면 브라우저에서 서버 IP와 포트를 통해 접속하여 정상 동작 여부를 확인할 수 있습니다.

 

 

 

 

 

ㅁ 로컬 리눅스 vs 도커(컨테이너)

 

- 지금 해본 방식은 리눅스에 애플리케이션과 필요한 구성 요소를 직접 설치하여 동작시키는 방식이다. 

앞으로 이를 컨테이너 환경에서도 실행해해볼 예정이다.

 

- 리눅스는 설치파일만 10몇기가 된다. 그리고 설치하고 나면 그것도 10몇기가 된다.

컨테이너는 필요한 최소한의 환경만 포함하기 때문에 용량이 매우 작다.

 

- 기존의 리눅스 방식에서는 추가 서버가 필요할 때 새로 설치 및 환경 구성이 필요하지만, 

컨테이너를 사용하면 이 과정을 간단히 반복할 수 있다.