[Server] 빌드와 배포

윤종석·2024년 1월 18일
0

Spring 공부

목록 보기
3/3
post-thumbnail

Spring을 이용해 코드를 짜고, AWS와 GitHub Action을 이용해 서버에 배포하는 과정을 실습해보았다. 내가 그 원리에 대해서는 너무 얕게 알고 있다고 느꼈고, Web 서버의 원리부터 어떻게 코드가 배포되는 건지 차근차근 공부해보았다.


인터넷의 작동 원리

컴퓨터 간에 통신을 할 때에, 컴퓨터는 다른 컴퓨터와 물리적으로나, 무선으로 연결되어야 한다. 이더넷 케이블, WiFi, Bluetooth 등이 있다. 연결되는 컴퓨터가 많아질수록, 이는 더 복잡해질 수 밖에 없는데, 이러한 문제를 해결하기 위해 라우터를 사용한다.

라우터는 컴퓨터들 사이에서 통신을 중계해주는 역할을 한다. 그리고, 라우터는 다른 라우터와 연결될 수 있다. 그리고 세계 어느 곳과도 연결되기 위해 라우터는 전화 시설에 연결된다. 이때 네트워크의 정보를 전화 시설에서 처리할 수 있는 정보로 바꾸는 것이 모뎀이다.

왼쪽부터 컴퓨터, 라우터, 모뎀이다.

이렇게 연결된 네트워크는 다시 인터넷 서비스 제공업체(ISP)의 라우터에 연결되고, ISP는 다른 ISP의 라우터에 연결된다. 이렇게 전체 네트워크 인프라를 구성하고, 이는 인터넷이 된다. 인터넷은 인프라로서 웹, 이메일 등 다양한 서비스가 그 기반 위에 구축된다. 또한 네트워크에 연결된 각각의 컴퓨터는 각각을 특정할 수 있는 식별번호인 IP 주소를 부여 받는다. 그리고 이 IP 주소를 사람이 기억하기 쉽게 도와주는 것이 도메인 이름이다.

구글의 도메인 역시 해당하는 IP번호로 접속 가능하다.

웹 서비스의 작동 원리

웹에 연결된 컴퓨터는 클라이언트/서버의 역할을 하게 된다.

브라우저에서 웹 주소를 통해 다른 사이트로 이동하는 과정을 통해 이해해보자.

  1. 클라이언트가 브라우저에 웹 주소를 입력하면 브라우저는 DNS 서버에서 웹사이트가 있는 서버의 IP 주소를 찾는다.
  2. 브라우저는 서버에게 웹사이트의 사본을 클라이언트에게 보내달라는 HTTP 요청 메시지를 서버에 전송한다. 이때 클라이언트와 서버 간에 전송된 요청과 데이터는 모두 TCP/IP 연결을 통해 전송된다.
  3. 서버가 요청을 승인하면, 클라이언트에게 웹사이트의 파일들을 데이터 패킷으로 나누어 전송한다.
  4. 브라우저는 패킷들을 다시 하나로 만들어 클라이언트에게 화면을 보여준다.

웹 서버

웹 브라우저(클라이언트)에서 HTTP 요청을 받고, HTML 문서와 같은 웹페이지를 정적으로 처리해서 반환하는 소프트웨어와 하드웨어이다.

대표적인 예로 Apache, NginX 등이 있다.

Apache와 NginX

웹 어플리케이션 서버 (WAS)

CGI(Common Gateway Interface)는 정적으로 동작하는 웹서버를 동적으로 기능하게 만드는 것을 도와준다. 웹서버에 들어온 요청을 외부 프로그램과 연결하여 해당 프로그램이 요청을 처리하게 연결해주는 역할을 한다.

WAS는 웹 서버와 CGI가 결합된 것으로 생각할 수 있다. Tomcat, JBoss 등이 있다.

CGI는 요청을 외부 프로그램과 연결만 해주는 것에 반해, WAS는 웹 서버가 외부 프로그램을 직접 실행하도록 도와준다. 이를 통해 더 많은 처리를 한번에 할 수 있다는 장점이 있다.

다만 웹 서버는 빠르고 안정적이라는 장점이 있기에, 큰 규모의 프로젝트를 진행할 때에는 단순 htm 파일과 같이 정적인 데이터는 WAS와 분리하여 사용되기도 한다.

위의 웹 서비스의 작동 순서에서, 3번의 과정 중에 WAS는 데이터베이스에 요청/응답을 통해 동적 요청을 처리하고, 그 결과를 전달한다.


빌드와 배포

빌드

빌드는 소스 코드를 실행 가능한 소프트웨어 산출물로 만드는 과정으로, jar/war 파일 등이 결과물이다.

IntelliJ에서의 Build

IntelliJ에서의 Build

빌드는 자동으로 소스 코드를 컴파일, 테스트, 정적 분석 등의 과정을 거쳐 실행 가능한 어플리케이션으로 생성해주는 과정을 거친다. 이때 이러한 일련의 과정을 도와주는 것을 빌드 도구라하고, Java에는 Maven, Gradle 등이 있다.

Java의 Gradle 사용 예

Java의 Gradle 사용 예

Spring intializr를 사용해 프로젝트를 생성할 때, Gradle로 만들면 자동으로 Gradle 관련 파일들이 프로젝트에 생성된다. 이를 통해 jar 파일을 만들고, 이 파일을 서버 컴퓨터에서 실행한다.

프로젝트의 Gradle 파일들

프로젝트의 Gradle 파일들
# .jar 파일을 ./build/libs에 생성하고, java -jar로 파일을 실행한다.
./gradlew clean build
cd build/libs
java -jar "생성된 .jar 파일 이름"

.jar 파일을 실행 결과

.jar 파일 실행 결과

jar 파일을 성공적으로 빌드하고 실행하면 IDE에서 실행한 것과 같은 결과를 얻을 수 있다.

배포 (Deployment)

처음에는 배포라는 것에 막연히 어렵게만 생각했었다. 이렇게 빌드를 통해 얻은 실행 가능한 파일(jar/war)을 클라이언트가 접근할 수 있는 환경에 배치하는 것을 배포라고 생각하니 간단하다.

이 환경을 설정하는 것에 AWS의 다양한 기능들을 포함한 각종 기술들을 적용할 수 있다. 공부를 하면 할수록 어려워 차근차근 공부해봐야 할 듯 하다.

CI/CD

배포와 관련된 개념을 찾아보면 항상 같이 따라나오는 내용이다.

CI/CD는 "Continuous Integration" 및 "Continuous Deployment"의 약어로, 소프트웨어 개발과 배포 프로세스를 지속적으로 자동화하는 개념이다. 이를 통해 품질을 향상시키고 개발자 팀이 소프트웨어를 더 빠르게, 더 안정적으로 배포할 수 있게한다.

나는 배포를 하는 하나의 방법으로 이해했다. GitHub Action과 AWS의 Elastic Beanstalk을 통해 무중단 CI/CD를 실습해보았다.

Github Action을 통해 배포하려는 브랜치에 커밋이 merge 되면 이를 테스트하고 jar 파일까지 생성한다.

Github Action을 실행하기 위한 yml 파일

Github Action을 실행하기 위한 yml 파일

Elastic Beanstalk은 새로운 EC2를 생성해서 jar 파일을 실행해준다.


참고자료

profile
공부 중인 학부생

0개의 댓글