나만의 폰 서버에 Spring WAS 올리기 [#02]

전반숙·2024년 3월 6일
17

자체 서버 구축

목록 보기
2/2
post-thumbnail

지난 글에 이어서,,

바로 이전 글에서 안드로이드 폰을 웹서버로 활용하기위한 초기 세팅을 모두 끝마쳤다.

이제 이 서버에 Java 와 MySQL을 설치한 뒤 내 Spring WAS를 올려서 잘 동작하는지 살펴볼 것이다.

그 전에 이전 글에서 언급하지 않은 내용이 하나 있는데, 안드로이드 11이상의 경우 Phantom Process Killer 라는 녀석 때문에 정상적으로 서버를 운영할 수 없다.

https://namu.wiki/w/Termux#s-7.3
위 링크설명을 보면

Android OS는 자식 프로세스가 32개를 초과하는 모든 프로세스 및 과도한 CPU를 사용하는 프로세스를 워치독을 이용하여 강제 종료하게 되어 사용자가 쉘 프로세스를 종료하지 않았음에도 터미널에서 [Process completed (signal 9) - press Enter] 메시지가 표시될 수 있다.

라고 되어있는데, 한마디로 시간이 지나면 Phantom Process Killer가 Termux 위에서 실행되고 있는 Ubuntu를 그냥 꺼버린다.

조금 찾아보면 이 기능 때문에 Termux를 제대로 이용하지 못하고 있는 사람들이 많은 것을 볼 수 있다.

나도 서버를 모두 세팅하고 난 뒤 다음날 [Process completed (signal 9) - press Enter] 메시지를 보고 나서 잠시 절망에 빠졌었다.

하지만 Phantom Process Killer 를 끄면 해결이 되는 문제이다. 조금 복잡하긴 하지만 아무튼 해결가능하다.

이 문제는 글의 맨 마지막에 소개했다. 우선 Spring 서버부터 세팅해보자.



Java 설치

이전 글의 세팅을 모두 마쳤다면 노트북에서 원격으로 ssh 터미널을 통해 간편하게 작업할 수 있다.

  • apt 패키지 update, upgrade

우선 우분투에서 새로운 패키지를 설치하기 전에는 항상 패키지를 모두 최신화 해주는 것이 좋다고 한다.

오랜만에 우분투에 들어왔다면 습관처럼 해주자.

sudo apt update

sudo apt upgrade

  • Java 17 설치

프로젝트에서 사용하는 Java 17 을 설치했다.

sudo apt install openjdk-17-jdk

  • 설치된 Java 버전 확인

해당 버전이 잘 설치되었나 확인하자.

java -version

Java 17 이 잘 설치되었다.

참고로 apt 로 자바를 설치하면, update-alternatives 으로 자바 버전을 관리하게 된다.

그래서 따로 환경변수를 설정 안해줘도 위 명령어가 동작하는 것이다.



MySQL 설치, 세팅

MySQL 설치

sudo apt install mysql-server

  • MySQL 시작
sudo service mysql start

  • MySQL 접속
sudo mysql


  • MySQL 유저 생성

여기서 '%' 는 호스트 설정인데 모든 ip로 부터의 접근을 허용한다는 의미다.

(비밀번호 작은 따옴표로 감싸주기 필수)

create user jjp@'%' identified by '12341234';
create user <유저 이름>@'%' identified by '<비밀번호>';


  • 데이터베이스(스키마) 생성
create database smartwire;
create database <데이터베이스 이름>;


  • 생성한 유저에게 해당 데이터베이스에 대한 모든 권한 부여
grant all privileges on smartwire.* to jjp@'%';


MySQL 외부 포트 열기

  • MySQL 설정

이제 다시 터미널로 돌아와서 MySQL 설정 파일을 수정해야 한다.

exit

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf


  • 모든 ip로 열어주기

bind-address 를 찾아 모든 ip 를 의미하는 0.0.0.0 으로 바꿔 준다.

나의 경우에는 31번째 줄에 있었다.

// before
bind-address            = 127.0.0.1

// after
bind-address            = 0.0.0.0


  • MySQL 재시작

설정을 저장했으면 MySQL을 재시작해준다.

sudo service mysql restart

이렇게 외부에서 MySQL DB에 접속하는데에도 성공했다.

이제 빌드된 jar 파일을 가져와서 Spring WAS 를 실행시켜보자.



jar 파일 업로드

  • WinSCP 다운로드, 설치

이상하게 SFTP, FTP 접속이 안됐다. 그래서 FileZila 같은 FTP 클라이언트도 사용이 불가했는데, WinSCP의 SCP 프로토콜로는 접속이 가능했다.

별의별 설정을 다 만져봤는데도 안되서 우선 이 방법을 사용했다.

WinSCP는 Windows 에서만 사용할 수 있다. 아래 링크에서 다운받을 수 있다.

https://winscp.net/eng/download.php


  • SCP 연결

아래와 같이 프로토콜을 SCP로 선택해주고, 호스트 이름에는 ip 주소, 사용자 이름, 비밀번호는 우분투 계정의 이름과 비밀번호를 입력해주면된다.

접속에 성공한 모습이다.

여기서 .jar 파일을 옮겨주고 실행하면된다.



환경변수 설정

그 전에 프로젝트에서 사용할 각종 환경변수들을 설정해야한다.

환경변수는 Map 과 같이 key, value 형태로 되어있는 하나의 저장소인데, 여러 어플리케이션이 이 환경변수를 많이 참조해서 사용한다.

한 예로 PATH 라는 이름의 환경 변수가 많이 익숙할 것이다.

말 그대로 디렉토리의 경로를 담아두는 환경변수 인데, 터미널에서 실행 파일을 호출하여 실행하면 가장 먼저 현재 속해있는 디렉토리에 해당 실행 파일이 있는지 확인한다.

만약 헤당 디렉토리에 실행 파일이 없다면, 환경 변수의 PATH 에 있는 디렉토리에 하나씩 접근하여 해당 실행 파일을 찾아 실행한다.

그래서 환경변수 PATH 변수에 Java 설치 경로를 지정해 놓으면 어디에서든 java -version 같은 명령어를 사용할 수 있는 것이다.

이렇게 환경변수는 각 컴퓨터마다 고유한 값을 가지게 되므로 운영, 테스트, 로컬 환경마다 다른 설정을 가지게할 수 있다.

Spring 에서도 환경변수에 접근하여 값을 가져오도록 할 수 있다.

그래서 프로젝트 내부에 MySQL 계정 비밀번호와 같은 민감한 정보들을 포함하지 않을 수 있다.

그럼 이제 환경 변수를 설정해보자.


  • 사용중인 shell script 종류 확인

shell script 마다 환경변수 파일이 다르기 때문에 먼저 종류를 확인해야 한다.

사실 크게 상관은 없다. 하지만 다른 종류의 설정 파일에 환경변수를 저장하면, 컴퓨터를 재부팅했을때 자동으로 환경변수가 지정되지 않는다.

echo $SHELL

나는 bash 를 쓰고 있다.


  • 환경 변수 설정
sudo vi ~/.bash_profile   // bash

또는

sudo vi ~/.zshrc          // zsh

여기에 내 어플리케이션에서 사용하는 환경변수를 key=value 형태로 추가해주면 된다.


  • 설정 저장
source ~/.bash_profile

또는

source ~/.zshrc

그러고 나서 꼭 source 명령어로 이를 적용시켜줘야 한다.



Spring WAS 실행

  • 실행
java -jar smartwire-backend-2.0-0.0.1-SNAPSHOT.jar

이렇게 실행해주면 되는데, 매번 이걸 입력하기 귀찮으니, shell script 파일을 하나 만들어주자.


  • run.sh 파일 생성
vi run.sh

이 파일에 아래 내용을 추가한다.

nohup java -jar smartwire-backend-2.0-0.0.1-SNAPSHOT.jar &
nohup java -jar <jar 파일> &

shell script 는 그냥 명령어 집합이라고 보면 된다.

이 파일을 실행시키면 파일안에 있는 명령어들이 차례대로 수행된다.

Java 버전을 따로 지정해주거나, JVM 설정을 추가하는 등 유용하게 쓰인다.

앞으로 이 파일을 실행시켜주면 된다.

그리고 nohup은 백그라운드에서 어플리케이션을 실행하는 명령어다. 이렇게 해야 ssh 접속을 끊고 나서도 WAS가 계속 실행 상태에 있을 수 있다.


  • run.sh 파일 실행
chmod +x run.sh   // .sh 파일에 실행 권한 부여

./run.sh

실행완료! 간단한 테스트 컨트롤러 API를 호출해보자.

이렇게 요청과 응답이 성공적으로 이루어졌다.

참고로 실행 중인 Java 어플리케이션을 확인하려면

jps -l

앞의 숫자는 pid 이다. 정상적으로 Spring WAS 가 실행중인 것을 볼 수 있다.

방화벽 설정은 따로 하지 않았는데 잘 되는 것을 보면, 처음에는 관련 설정이 안되있나보다.

끝!



Phantom Process Killer 끄기

서두에 말했듯 예전에 내가 이렇게 서버를 세팅하고 자고 일어났더니 [Process completed (signal 9) - press Enter] 메시지와 함께 우분투에서 로그아웃 되어있는 모습을 볼 수 있었다.

그런데 지금 다시 해보니 현재 3일째 멀쩡하게 돌아가고 있다..?

해당 에러를 재현한 뒤 해결하는 과정을 담으려고 했는데, 우선은 필요가 없어졌다.

일단 이렇게 계속 운영해보다가 해당 문제가 생기면 다시 수정해서 업로드해야겠다.

해보지는 않았지만, 이 Phantom Process Killer 를 끄는 방법을 정리해봤다.

https://www.youtube.com/watch?v=s2fYaRvMzk4

위 유튜브를 참고했고, 아래는 정리한 내용이다. 자세한건 해당 영상을 보자. (아직 안해봐서 안될수도 있다.)

개발자 옵션 -> 무선 디버깅 on

apt update

apt install android-tools

분할 디스플레이 하고나서
adb pair  // 이 명령어를 통해 장치를 페어링

개발자 옵션 > 무선 디버깅 > 페어링 코드로 기기 페어링 선택 // 여기서 끄면 안됨

adb pair <ip 주소>:<포트번호>
페어링코드 입력 -> 이러면 페어링 성공

이후 맨 위의 IP 주소와 포트 클릭 후 복사
adb connect {ip 주소}:{포트번호} // 붙여넣기 -> 이러면 연결 성공

https://github.com/KitsunedFox/termux-monet // 아래는 여기에 있는 3가지 명령어
adb shell "/system/bin/device_config set_sync_disabled_for_tests persistent"
adb shell "/system/bin/device_config put activity_manager max_phantom_processes 2147483647"
adb shell settings put global settings_enable_monitor_phantom_procs false

위 3가지 명령어 입력

exit -> 끝


다음 포스팅은?

이제 점점 할게 보인다. 아직 학습하지 않아서 잘 모르지만 도커도 설치해보고, CI/CD 구축 등에 필요한 것들을 여기에 하나씩 쌓아볼 것이다.

그리고 다른 핸드폰에 친구들이랑 같이 할 24시간 마크 서버도 구축했는데 생각보다 간단했고, 또 렉도 별로 없이 쾌적했다. 폰 서버에 마크 서버 돌리기 과정도 번외편으로 하나 작성해야겠다.

다음 포스팅에는 APM Scouter를 설치해서 실시간 모니터링을 하는 과정을 담아볼 것이다.

profile
과정 기록

7개의 댓글

comment-user-thumbnail
2024년 3월 7일

재밌어 보이네요 글 잘 읽었습니다!!

1개의 답글
comment-user-thumbnail
2024년 3월 9일

apt install android-tools은 설치가 안되서 찾아보니
apt install android-tools-adb 로 해야 설치되는것 같습니다..

좋은글 작성해주셔서 감사합니다.

1개의 답글
comment-user-thumbnail
4일 전

반숙님 글이 딱 여섯갠데 하나하나 깊이가 어마어마하네요.. (아직 다는 못 읽어봤지만) 혹시 직무가 데브옵스쪽이신가요?!

1개의 답글