웹앱 만들기의 마지막 과정이라 할 수 있는 배포 deploy를 배웠다. AWS를 이용한 클라우드 서비스를 이용하여 로컬이 아닌 완전히 다른 곳에서 배포를 할 수 있게 하였다. 사용된 서비스는 크게 세가지로 EC2, RDS, S3 이다.
스프린트에선 간단하게 연습해 볼 수있게 클라이언트와 서버는 기본적으로 다 구축이 되어있었다.
참고로 클라우드 서비스를 이용한 배포의 장점은 포괄적으로 안정성과 서비스 속도 등등 외에 보안적으로도 로컬에서 배포하는 것보다 좋다.
단점으로는 서비스를 제공해주는 사이트 서버에 의존적이라 만약 그 서버가 문제가 발생한다면 복구가 될 때까지 배포가 중단 된다는 것이다. 그리고 서비스의 품질이나 조건에 따라 비용이 유동적으로 발생하는 것 정도가 있다.
스프린트를 이용하여 한번 따라가보자. 참고로 도메인을 구입 하지않은 상태라 인증서를 발급받지 못하여 https환경에서 진행할 수 없었다.
이 작업을 하기위해 AWS의 S3를 이용해 버킷을 만드는 과정이 필요하다.
내 버킷 이름은 practice-bucket-deploy-sangrae이다. (굉장히 쓸데없이 길다. 이렇게 길 필요는 없다 그 대신 꼭 유니크 해야한다.) 지금은 정적파일을 객체로 올리지 업로드 하지 않았기 때문에 비었다.
먼저 코드스테이츠에서 받은 클라이언트 앱을 build해주자. build를 하는 이유는 코드를 배포가 가능한 압축된 형식으로 간단하게 만들어 주는 것이다.
react를 사용하면 npm run build 명령어로 가능하다.
빌드가 완료되면 빌드 디렉토리가 생기는데 안의 모든 파일을 드래그 앤 드롭으로 업로드가 가능하다 그러나 awscli를 이용해 터미널에서 업로드가 가능하다.
$ aws s3 sync [빌드경로] s3://[버킷이름]
위 명령어를 입력하면,
위와같은 작업이 진행이 되고 완료가 되면,
$ aws s3 ls s3://[버킷이름]
위 명령어로 확인이 가능하다.
물론 직접 AWS 웹 자체에서 확인이 가능하다.
그리고 속성을 눌러보면 나의 도메인을 볼 수 있다.
눌러 보면,
클라이언트 배포에 성공했다. 그러나 아직 서버가 열려 있지가 않다.
이 작업을 하기 전에 EC2 인스턴스가 필요하고 RDS에 데이터베이스를 만들어야 한다.
처음 할 작업은 미리 구성된 스키마를 sequelize를 이용해 데이터베이스에 migration 그리고 seed 작업을 해주는 것이다.
데이터베이스 구축이 완료 되었다면 mysql을 이용해 구성하였기애 직접 로컬에서 mysql을 통해 확인이 가능하다.
$ mysql -u admin --host [RDS 엔드포인트] -P [포트번호] -p
위와 같이 입력 후 확인 해보자.
잘 들어가있는 것을 볼 수 있다.
다음은 EC2 인스턴스를 이용해 서버를 오픈해 볼 차례이다.
먼저 서버 파일을 받아온다. 그리고 node [서버파일] 명령어를 통해 서버를 개방할 수 있다.
서버가 연결이 된것을 볼 수 있다.
그러나 한가지 문제 점이 있다. 이 상태에서 터미널을 닫는다면 node 프로세스 자체가 꺼져버리기 때문에 서버의 연결이 끊킬 것이다. 그렇다고해서 컴퓨터를 계속 켜놓을 수 없을 터이다. 그리고 EC2를 이용하는 이점이 사라질 것이다.
물론 방법은 있다. 명령어 뒤에 &를 붙이면 백그라운드로 실행이 가능하다. 그러나 node 스스로 서버의 변경을 감지하지 못할 것이다.
이러한 불편한 점을 해소 해주고 또 부가적인 여러기능을 제공해주는 프로그램이 있다.
$ npm install pm2 -g
npm을 이용해 pm2를 설치한다. 그리고 간단한 명령어를 통해 프로세스를 관리 할 수 있다.
pm2 start [파일이름] - 백그라운드로 실행
pm2 ls - 프로세스 리스트
pm2 stop - 프로세스 중지
pm2 restart - 프로세스 재시작
이제 터미널을 종료해도 계속 서버가 구동이 될 것이다.
끝!
배포를 하는 과정도 정말 정말 길고도 험하다~! 웹 앱 하나를 만들기 위해 엄청난 공을 들이는 구나 싶었다. 이렇게 다 배우고 나니 직접 나만의 웹앱을 배포하고 싶어진다. 배운 만큼 활용할 수 있어야한다. 그리고 내 도메인을 구입하여 사용해 볼 것이다. 내 이름이 들어간 도메인 생각만해도 너무 멋지다 ㅎㅎㅎ