안녕하세요, Brad입니다. 오늘은 '서버배포', 'Ajax'처리에 대해서 배울 수 있는 기회가 생겼는데요. 비록 삽질도 하긴 했지만 시간이 어떻게 흘렀는지 모르게 흥미로웠습니다. 그럼 정리한 내용을 살펴보도록 하겠습니다.
서버배포 기초
ssh가 가능했던 이유
security-group
- 인바운드 : 서버 입장에서 들어오는 것을 말합니다.
- 아웃바운드 : 서버 입장에서 보내는 것을 말합니다.
인바운드의 SSH인 22번 포트를 열어놓았기 때문에 가능합니다.
SSH는 TCP레벨(HTTP레벨 아래)에서 관리합니다.
서버 명령어
파일 만들기 :
touch
편집기 띄우기 :
vi (파일명)
#!/bin/bash echo "Hello World"
이렇게 저장하고 실행하면 안됩니다. 실행권한이 없기때문입니다.
chmod +x helloworld.sh
: x 권한 부여
서버에 배포하기(발표 : nnn)
- 서버 컴퓨터에 SSH통해 접속합니다.
- 처음 서버 컴퓨터에 들어가면 자바가 설치되어 있지 않기 때문에 자바를 설치합니다.
sudo apt-get install openjdk-8-jre
- 인터넷 검색을 통해 자바 설치는 쉽게 하실 수 있을 것입니다.
- 이제는 저희의 프로젝트를 github으로부터 가져옵니다.
- 그리고 해당 프로젝트 폴더로 들어간 다음 빌드를 해야합니다.
./gradlew
./gradlew build
- build > libs 경로로 이동 후 jar파일을 찾고
java -Dserver.port=7080 -jar java-ims-1.0.0.jar
와 같이 포트번호 부여와 함게 jar파일을 실행시킵니다.
그러면 끝!!(물론 서버 내에 인바운드 편집을 하고 HTTP 추가해놓아야 합니다)
그런데 이 4~5번 과정이 귀찮은 작업이라 shell을 이용하여 자동화를 할 수 있는데요. 저는 루트 경로에서 shell파일을 만들고 다음과 같이 파일을 만들었습니다.(참고)
#! /bin/bash
APPLICATION_NAME=java-ims
SCRIPTPATH=$(cd "$(dirname "$0")" ; cd "java-ims" ; pwd -P) // sh파일이 루트에 있기 때문에 프로젝트 안으로 이동
echo "sh file location : " $SCRIPTPATH
echo "> Git pull"
git pull
echo "> Build project"
./java-ims/gradlew build
CURRENT_PID=$(pgrep -f java-ims) // 혹시 해당 프로젝트가 가동중이라면 그것의 프로세스 아이디
echo $CURRENT_PID
if [ -z $CURRENT_PID ]; then
echo "> There is no application that is operating"
else // 이미 애플리케이션이 돌아가고 있을 경우
echo "> kill -2 $CURRENT_PID"
kill -2 $CURRENT_PID
sleep 5
fi
echo "> New application released"
JAR_NAME=$(ls $SCRIPTPATH/build/libs |grep 'java-ims' |tail -n 1)
echo "> JAR name: $JAR_NAME"
chmod 755 $SCRIPTPATH/build/libs/$JAR_NAME // 권한변경
nohup java -jar $SCRIPTPATH/build/libs/$JAR_NAME & // 백그라운드에서 돌아가도록 설정
이 셸 파일 작성하고 이를 실행하면 위 4~5번 과정을 한번에 처리할 수 있는 것이죠.
부가적으로 위 셸 명령어 중에서 kill부분에 대해 깨닫은 내용을 간략하게 정리해볼게요.
kill -2
: pid 그대로 유지됩니다.kill -9
: pid 바뀝니다
Q & A
예외처리를 다하려고 생각하면 결국 모든 부분에 Ajax처리할 수 밖에 없는데 어떻게 에러처리 하는 것이 좋을까요?(feat. Doby)
Ajax를 모두 처리하려면 개발 비용이 너무나 추가됩니다. 그리고 일부러 잘못된 경로로 접근하는 케이스에 대해 일일이 다 친절히 에러 메시지를 보내줄 필요도 없습니다.
그렇기 때문에 꼭 필요한 부분(유저가 일부러 틀리지 않는 경우, 유저에게 에러 이유를 알려주는 것이 좋은 경우) 이외에는 컨트롤러를 통해 특정 path로 다 보내는 것이 방법이 될 수 있습니다.
또 static/error폴더 내에 '404.html' 처럼 404상태일 경우 이 html을 띄워주게 할 수 있습니다.
- 이 경우 컨트롤러에서 별도의 처리가 없을 경우 실행이 되는 것입니다. 만약 컨트롤러에서 별도로 에러처리를 해준다면 그 에러처리가 우선적으로 실행될 것입니다.
견고한 애플리케이션은 이러한 에러처리를 다 잘하는 것도 그 조건에 해당할텐데요. 모든 부분에 대해 Ajax 처리를 할 수 없기 때문에 위 방법들을 잘 활용해야 할 것입니다.
Js파일 내 ajax 메서드로 보낼 때 어떻게 객체 형식을 만들고 Json으로 보낼 수 있을까요?(feat. Doby)
우선 Json객체는 다음과 같이 만들 수 있습니다.
var user = new Object(); user.name = $('#name').val(); user.email = $('#email').val();
그리고 ajax 메서드는 다음과 같이 만듭니다(Dobi의 코드입니다).
$.ajax({ type : 'put', url : url, data : JSON.stringify(user), dataType : 'json', contentType: 'application/json', error : function (data, xhr) { console.log("이슈수정 실패"); console.log(data); alert(data.responseText.message); }, success : function () { console.log("이슈수정 성공!"); location.href = '/'; } });
위 코드에서 잘 보아야할 부분은
contentType: 'application/json'
입니다. 위 객체를 Json파일로 보내려면 이 ContentType이 꼭 필요합니다. 그렇지 아니면 default인"application/x-www-form-urlencoded"
로 보내져서 의도한 결과가 안나오기 때문입니다.그리고 또 하나!
data : JSON.stringify(user)
를 해줘야하는데요. 저희가 만든 Object를 Server로 전달하기 위해 String값으로 변환해주는 것입니다(참고)이렇게 해주면 API컨트롤러에서
@RequestBody
를 통해 Json 데이터가 자바가 인식하는 객체로 만들어 받을 수 있습니다.
'TIL' 카테고리의 다른 글
Today's Dev Notes(2019-01-05) (0) | 2019.01.05 |
---|---|
Today's Dev Notes(2019-01-04) (0) | 2019.01.04 |
Today's Dev Notes(2019-01-01) (0) | 2019.01.01 |
Today's Dev Notes(2018-12-31) (0) | 2018.12.31 |
Today's Dev Notes(2018-12-30) (0) | 2018.12.30 |