0. 개요
우리는 프론트 엔드든, 백엔드든 통합개발 환경(IDE)에서 코드를 작성하고 디버깅, 컴파일, 등의 작업을 수행합니다. 최종적으로 우리가 작성한 코드는 웹사이트나 앱으로써 소비자가 접근할 수 있게 만들어야합니다. 하지만 이러한 작업을 우리의 개인PC, 즉 로컬환경에서 하는 것은 쉽지 않을 것입니다. 이를 위해 우리는 우리가 만든 코드, 서비스를 배포하는 작업을 가져야 합니다. 제가 배운 배포에 대한 내용을 한번 정리해보는 시간을 가져보고자 합니다.
1. 사전지식
컴파일(Compile)
컴파일(Compile)은 우리가 작성한 소스코드를 기계어나 다른 프로그래밍 언어로 번역하는 과정을 의미합니다.
한마디로, 우리가 작성하는 C, C++, Java와 같은 코드는 사람이 이해하고 작성하기 쉬운 형태로 코드를 작성할 수 있도록 고안된 고수준의 언어입니다. 이러한 고수준의 언어는 기계어나 어셈블리어에 비해서 추상화 되어 있어서 사람이 이해하기 쉽습니다. 하지만 이러한 고수준의 언어는 컴퓨터는 이해하지 못하므로, 이를 기계어로 변환해주는 작업이 필요한데, 이것이 컴파일러가 수행하는 컴파일 과정입니다.
Java의 경우 Java 소스코드는 Java 컴파일러에 의해 바이트 코드(bytecode)로 변환됩니다. 바이트코드는 중간 형태의 코드로 Java가상머신(Java Virtual Machine, JVM)에서 실행됩니다. 이렇게하면 Java프로그램이 여러 플랫폼에서 동일한 바이트 코드로 실행되며, 특정 운영체제나 아키텍쳐에 종속되지 않습니다.
여기서 Interpretation이라는 개념도 있는데, Interpretation은 JVM에서 컴파일된 기계어를 분석하고 실행하는 프로세스입니다. Java 컴파일러가 소스코드를 바이트코드로 만들고, JVM에서 해당 코드를 이용해서 프로그램을 실행합니다.
링크(Link)
링크(Link)는 여러 개로 분리된 소스 코드들을 컴파일한 결과물들에서 최종 실행 가능한 파일을 만들기 위해 필요한 부분을 찾아서 연결해주는 작업을 말합니다.
예를들어 board라는 클래스와 board를 사용하는 boardList라는 클래스가 있다고 하면, 컴파일하게 되면 각기 다른 파일이 기계어로 변환되기 때문에 서로 연관이 되어 있다는 것을 모릅니다. 이 연결과정을 링크라는 과정으로 해주어야 합니다. 링크단계에서 파일들이 서로의 함수나 변수를 참조할 수 있도록 하고, 각각의 코드 블록이 어떻게 메모리에 배치될지 결정합니다. 이러한 과정으로 최종적으로 하나의 실행파일이 생성됩니다.
빌드(build)
빌드(build)는 소스 코드를 실행가능한 소프트웨어 산출물로 만드는 일련의 과정입니다. 우리는 소스 코드를 작성하면서 이 과정을 한 적이 있습니다. 우리가 코드를 작성하는 Eclipse, Vscode, IntelliJ와같은 IDE에서 소스 코드를 작성하고 "run" 같은 버튼을 클릭해서 소스 코드가 동작하는 것을 볼 수 있었습니다. IDE 내부에서 빌드도구(gradle,maven)을 통해서 빌드기능을 이용한 것입니다.
하지만 이렇게 IDE의 지원없어도 나의 웹서비스를 사용자들이 이용가능해야 하기 때문에 실행파일, 라이브러리, 설정파일 등등이 포함된 패키지를 만들어야합니다. Java에서는 주로 jar파일로 패키징을 합니다. 이러한 배포용 파일을 통해서 사용자에게 프로그램을 이용하도록 합니다.
빌드 도구(build tool)는 소스 코드를 컴파일, 테스트, 정적 분석 등을 실시해서 실행 가능한 애플리케이션을 자동 생성하는 프로그램입니다. IDE에서는 Maven, Grdle같은 빌드 도구를 사용해서 프로젝트를 관리할 수 있습니다. 예전에는 라이브러리같은 파일들을 일일히 추가해서 사용했지만 빌드 도구를 통해서 라이브러리를 자동으로 추가하고, 연동해줘서 편의성을 증가했다고 합니다.
Maven의 경우, 모든 종속성(Dependency)를 리스트 형태로 Maven에게 알려주어서 종속성을 관리합니다. pom.xml이라는 Maven파일에 필요한 jar, class Path를 선언하면, 직접 다운로드할 필요 없이 Repository에서 라이브러리파일을 자동으로 불러옵니다. 장점으로는, Gradle보다는 오래되었으므로 지원되는 플러그인이 많습니다. 단점으로는 라이브러리 끼리의 종속이 늘어날 수록 XML이 복잡해지고, 맞춤화된 로직실행이 어렵습니다.
Gradle의 경우, JVM 기반의 빌드 도구로서, ant, maven의 단점을 보완해줍니다. Groovy 기반의 DSL로 작성합니다. Build-by-convention을 바탕으로 하기 때문에 스크립트의 규모가 작고 읽기 쉽다는 장점이 있습니다.
성능면에서는 Gradle이 Maven보다 빌드에 소요되는 시간, 유연성, 종속성 관리 등의 다양한 측면에서 뛰어나다는 평가입니다. 또한 가독성이 좋다는 장점외에 Gradle은 버전 충돌 또한 관리해줍니다. 그래서 저는 일단 Gradle을 주로 사용하고 있습니다.
일련의 과정
그럼 이때까지 설명한 내용을 바탕으로 IntelliJ에서 시작버튼을 누르면 이루어지는 과정에 대해서 생각해보겠습니다.
1. IntelliJ IDEA에서 새 프로젝트를 구성하거나 프로젝트를 열면서, 프로젝트에 대한 설정과 디렉터리 구조가 자동으로 생성됩니다. 프로젝트의 구성은 프로젝트 SDK, 빌드 도구(Maven, Gradle), 언어버전 등이 포함됩니다.
2. 소스 코드를 작성합니다. HelloWorld.java를 작성해보겠습니다.
3. 코드 작성이 완료되면 IntelliJ는 내부적으로 자바 컴파일러(Javac) 또는 해당 언어에 해당하는 컴파일러를 사용해서 소스코드를 컴파일합니다.
4. 실행할 클래스 등을 지정해서 어떻게 프로그램을 실행할 것에 대한 실행구성을 구성한 후에 실행 버튼을 눌러줍니다.(HellowWorld를 실행시켜줘! 혹은 CurrentFile 실행!)
5. "Run"버튼을 눌러서 빌드 도구(Maven, Gradle)를 통해서 필요한 의존성을 관리하고 프로그램을 실행합니다. 이 과정에서 빌드가 일어나는데, 빌드 도구는 빌드 구성에 의해서 실행가능한 JAR파일을 생성하고 IntelliJ에서는 해당 JAR파일로 프로그램을 실행합니다.
6. 실행이 완료되면, IntelliJ는 결과를 출력창에 표시하고, 원하는 경우 디버깅을 할 수 있습니다.
2. 배포
배포란, 작성한 코드를 빌드하고, 빌드가 완성된 실행가능 파일을 사용자가 접근할 수 있는 환경에 배치하는 과정을 의미합니다. 위에서 설명한 코드,라이브러리 등등을 빌드를 통해 패키징한 Jar같은 파일을 사용자가 웹사이트에 접근할 수 있도록 하는 과정입니다. 이제까지의 개발과정은 개발자 혼자만의 시간이었다면, 배포를 통해서 개발자가 개발한 서비스를 사용할 사용자와 연결되는 것입니다.
jar와 같은 빌드된 파일을 WAS(Web Application Server)에 배포를 함으로써 우리가 만든 소스코드가 naver,google와 같이 어떤 사용자도 접근이 가능한 사이트가 되었습니다.
하지만 배포에 대해서 간단하게 설명했지만, 배포를 하는 과정에서 테스트를 어떻게 할 것인가, 배포된 상황해서 새로운 버전이 나오면 서버를 멈춰야 하는가?, 서버가 꺼지면 자동으로 켜져야하는것 아닌가? 등등에 대한 많은 고민들이 존재합니다. 이는 이후에 작성할 CI / CD에 내용을 포스팅하면서 설명하고자 합니다.
'Project > AWS 및 배포' 카테고리의 다른 글
AWS - 3-1. 베이직 하게 배포해보기 - 백그라운드 실행, 로그파일 분리 (0) | 2024.01.31 |
---|---|
AWS - 3. 베이직 하게 배포해보기 - EC2 서버에 프로젝트 배포하기 (1) | 2024.01.31 |
AWS - 2. 키페어와 RSA (0) | 2024.01.30 |
AWS - 1. AWS에 대해서 (0) | 2024.01.30 |
DevOps 그리고 CI/CD에 대해서 (2) | 2024.01.30 |