8주차 - 2) Restful API 및 EC2 무중단 배포

변현섭·2023년 6월 15일
0

4th UMC Server-Spring Study

목록 보기
25/30

Ⅱ. 실습

1. 새로운 엔티티를 생성하여 기존 엔티티와 관계 매핑하기

자세한 설명은 아래의 링크를 참조하기 바란다.
>> JPA 관계매핑

1) Board 클래스

2) Board Controller

① create board API

② get board by Id API

③ delete board by title API

④ modify board API

  • jwt를 헤더에 포함해야 API가 동작한다.

이로써, Board Entity에 대한 CRUD 요청을 모두 처리해본 것이다. 연동된 DB에서도 결과가 잘 나타나는지 확인해보기 바란다.

2. API sheet 작성하기

API 명세서의 작성법은 사람마다 다르다. 참고만 하도록 하자.

3. API를 EC2 서버에서 테스트해보기

이전 7주차 포스팅에서 .jar파일을 만드는 방법에 대해서 다루었다. 동일한 방법으로 지금까지 만든 파일을 git clone하여 빌드해주면 된다.

지금까지는 Postman에서 localhost:8080에 요청을 했지만, 이제부터는 AWS EC2의 퍼블릭 IPv4 DNS 또는 탄력적 IP주소를 localhost 자리에 입력해주면 된다. 포트는 그대로 8080번을 사용한다.

여기서 더 발전시켜보고 싶은 사람은 2주차에서 다루었던 도메인 연결 및 HTTPS 적용도 해보길 바란다.

4. EC2 무중단 배포

3번에서 배포가 끝난게 아닌가 생각할 수도 있겠지만, 그렇지 않다. IntelliJ의 SSH Session으로 실행하건, Putty에서 실행했건 간에 IntelliJ나 Putty가 종료되면 서버도 같이 종료된다. 서버를 사용하는 이유는 고사양의 스펙 때문도 있지만, 서버로 사용할 컴퓨터를 항상 켜둘 수 없기 때문이기도 하다. 근데, 이렇게 같이 꺼져버리면, 서버를 사용하는 의미가 퇴색되는 것이다.

Putty나 IntelliJ를 종료하더라도, 더불어 컴퓨터를 끄더라도 서버가 동작할 수 있도록 만드는 것을 무중단 배포라 한다. 우리는 EC2 서버를 사용할 것이기 때문에 EC2 무중단 배포라고 부르는 것이다.

생각보다 어렵지 않게 중단 없는 배포가 가능하다. 이전에 실행한 명령의 앞에 nohup 키워드를 붙이고 맨 뒤에 &만 붙이면 된다. 예시로 실행파일이 아래와 같이 만들어졌다고 하자.

// 중단 배포
java -jar UMC4_Heron_Template_JPA-0.0.1-SNAPSHOT.jar
// 무중단 배포
nohup java -jar UMC4_Heron_Template_JPA-0.0.1-SNAPSHOT.jar &

리눅스에 대한 배경지식이 있는 사람이라면 실행파일 뒤에 &를 붙여 background 실행이 가능하다는 것을 알고 있을 것이다. 그럼 nohup은 무엇인가? nohup은 "no hang up"의 줄임말로, "끊지마"라는 의미를 갖는다고 한다. 즉, 세션과의 연결이 끊어지더라도 nohup으로 돌린 프로세스는 데몬 형태로 실행되어 종료되지 않는다.

※ 데몬
멀티태스킹 운영 체제에서 데몬은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다.

인텔리제이 Session이 연결된 상태와 Session 연결이 종료된 상태에서 모두 API를 테스트해보았다. 당연히 실행이 잘 된다.

인텔리제이를 끌 때 원래 같으면 실행 중인 프로세스가 있는데 꺼도 괜찮겠냐는 경고창이 나오지만, 아예 경고창조차 나오지 않는다. 이는 인텔리제이를 꺼도 프로세스가 중단되지 않기 때문이다. 아래는 인텔리제이를 껐다가 다시 켜서 SSH session에 접속한 모습이다.

인텔리제이가 꺼진 상태에서도, 껐다 킨 상태에서도 API가 잘 동작한다. 또한 process가 여전히 실행되고 있었음을 ps -ef로 확인할 수 있다.

만약, 서버를 종료하고 싶다면 어떻게 해야할까? 이것도 리눅스에 배경지식이 있는 사람이라면 정답을 유추할 수 있을 것이다. 바로 kill 명령을 사용해 프로세스를 죽이는 것이다. kill의 옵션은 보통 9를 사용하고(옵션은 안 붙여도 됨), 파라미터는 pid이다. pid는 바로 위의 캡쳐본의 좌측에 있는 값이다. 또는 아래 캡쳐본에서와 같이 파일을 실행할 때 뱉어내는 값도 pid이다.

프로세스를 종료시켜보자.

이제 더 이상 ps -ef를 해도 실행파일이 검색되지 않는다.

당연히 API도 실행되지 않는다. 정상적으로 프로세스가 종료된 것이다. 프로세스가 종료되어도 DB의 정보는 그대로 남아있다. 만약 서버를 종료했다가 다시 가동할 때 DB의 정보가 초기화되길 바란다면, yml파일에서 아래와 같이 jpa 속성을 설정해주어야 한다. ddl-auto의 속성 값이 create이면, 서버 재가동시에 모든 테이블이 새로 만들어지면서 기존의 데이터가 사라진다.

반면, 서버 재가동시에도 데이터가 남아있길 바란다면, 아래와 같이 ddl-auto의 속성 값을 none으로 변경해주어야 한다.

테이블에 대한 변경사항이 있는 경우, 또는 새로운 엔티티를 만든 경우 반드시 create로 변경하고 애플리케이션을 실행해야 한다.

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글