[DevOps] 빌드와 배포

bien·2024년 4월 12일
0

배포

목록 보기
2/3

빌드와 배포란?

  • 개괄적 이해
    • 빌드(build): 소스 코드를 실행 가능한 소프트웨어로 변환하는 과정
    • 배포(deployment): 해당 소프트웨어를 사용자가 접근 가능한 환경에 제공하는 과정.

빌드와 배포

빌드는 책을 번역하고 만드는 과정, 배포는 책을 출판하는 과정으로 비유할 수 있다. 책을 출판하는 과정에서는 어떤 과정을 거쳐야할까?

  • 책 출판 예시
  • 코드 배포 예시
  1. 아랍어로 된 책을 한국어로 번역하는 과정
    • 컴파일: 자바로 작성된 소스코드를 기계를 이해할 수 있는 2진 바이너리 코드로 번역 (.java -> ```.class````)
  2. 번역이 완료된 글을 책으로 엮고, 책에 오타는 없는지 확인하는 과정
    • 빌드: 컴파일된 여러 코드를 하나의 압축파일로 패키징하고, 틀린 내용이 없는지 체크하는 것. (.jar, .war파일 생성)
  3. 완성된 책을 여러 사람이 읽도록 서점에 진열
    • 배포: 개발자가 만든 서비스를 여러 클라이언트가 볼 수 있도록 환경 구성

요약 정리

  • 빌드(Build)
    • 우리가 만든 소스코드를(.java)를 컴퓨터에서 이해할 수 있는 바이너리 코드(.class)로 변환
    • 기계가 바로 읽고 실행할 수 있는 압축된 파일(jar또는 war)로 패키징
  • 배포(Deployment)
    • 완성된 실행 가능한 파일(jar, war)을 사용자가 접근할 수 있는 환경에 배치하고 실행하는 것 (이후 모니터링, 유지보수도 포함)

빌드

빌드란 소스코드 파일들을 컴퓨터에서 실행할 수 있는 소프트웨어로 변환하는 일련의 과정이다.

빌드 과정

  1. 라이브러리 다운로드
  2. 소스코드를 바이너리 코드로 컴파일
    • 컴퓨터가 이해할 수 있는 기계어로 변환하는 작업.
    • 자바의 경우, JVM에서 실행 가능한 바이트 코드 형태의 '클래스파일'이 생성되는데, 이것이 바이너리 코드.
  3. 바이너리 코드를 패키징
    • 내가 만든 애플리케이션 코드를, 배포하고 동작시킬 수 있도록 패키징하는 것
    • JAR, WAR 파일로 패키징을 한다고 한다.
  4. 테스트 실행
  5. 프로덕션 시스템에 배포
    • package(archive)
      • 아카이브 파일(.war, .ear)로 배포
      • 아카이브 파일은 WAS에 의해 압축이 풀린다.
      • 파일이 많은 경우 압축을 푸는 시간이 오래 걸릴 수 있다.
      • 원격 서버에서 배포 시 한 개의 파일만 전송하면 된다.
      • WAS(Tomcat)에서 제공하는 업로드를 통한 배포 기능을 활용할 수 있다.
    • exploded
      • 아카이브 파일을, 압축 해제한 형태의 디렉터리로 배포
      • 별도의 디렉터리에 원본 소스를 복사하여 만든다
      • 압축 및 해제 과정이 불필요하다
      • 파일이 많은 경우 복사하는 시간이 오래 걸릴 수 있다.
      • 원본 소스를 건드리지 않고 배포를 원하는 경우에 적합하다.
      • 원격 서버에 배포시 파일이 많은 경우 전송 시간이 오래 걸릴 수 있다
    • in-place
      • 소스 디렉터리를 그대로 배포
      • 추가적인 복사 과정 불필요
      • 로컬 서버에 배포하는 경우 적합
      • WAS(Tomcat)가 런타임시 생성하는 파일이 소스와 섞일 수 있는 문제가 있다.

빌드 도구

위의 빌드 과정을 해주는 도구(빌드도구)에 Maven, Gradle 등이 있다.

  • 소스 코드를 컴파일, 테스트, 정적 분석 등을 실시하여 실행 가능한 애플리케이션으로 자동 생성하는 프로그램
  • 계속해서 늘어나는 라이브러리의 자동 추가 및 관리
  • 라이브러리의 버전을 자동으로 동기화

Maven

Maven은 프로젝트 라이프사이클 관리를 중점으로 하는 빌드 도구. XML 파일을 사용하여 프로젝트의 구조, 의존성, 플러그인 등을 정의한다. Maven 중앙 저장소를 통해 필요한 라이브러리와 플러그인을 자동으로 다운로드하고 관리한다.

  • 특징
    • 프로젝트에 필요한 모든 종속성(Dependency)을 리스트 형태로 Maven에게 알려주어 종속성을 관리한다.
    • XML, Repository를 가져올 수 있다.
      • POM.xml이라는 Maven파일에, 필요한 Jar, Class Path를 선언만 하면 직접 다운로드할 필요가 없이 Repository에서 자동으로 필요한 라이브러리 파일을 불러와준다.
  • 단점
    • 라이브러리가 서로 종속할 경우 XML이 복잡해진다.
    • 계층적인 데이터를 표현하기에는 좋지만, 플로우나 조건부 상황을 표현하기 어렵다.
    • 편리하나 맞춤화된 로직 실행이 어렵다.

Gradle

Gradle은 유연성과 성능을 강조하는 빌드 도구. Groovy 또는 Kotlin DSL (Domain Specific Language)을 사용하여 빌드 스크립트를 작성한다. 이는 Maven의 XML 기반 구성보다 더 강력하고 유연한 구성을 가능하게 한다.

  • 특징
    • JVM 기반의 빌드 도구
    • Ant와 Maven의 단점을 보완
    • 오픈 소스 기반의 Build 자동화 도구
    • Groovy 기반 DSL로 작성한다.
    • Build-by-convention을 바탕으로 한다 -> 스크립트 규모가 작고 읽기 쉽다.
    • 설정 주입 방식 (configuration injection)

Maven vs Gradle

  • 가장 중요한 성능은?
    • Gradle이 Maven보다 빌드에 소요되는 시간, 유연성, 종속성 관리 등 다양한 측면에서 뛰어나다는 평가다.
  • 얼마나 간편하게 설정할 수 있는지?
    • 라이브러리가 종속될 경우, 특정 조건을 표현할 경우에 Maven이 이를 처리하기 복잡하다고 한다. 반면 Grlade은 스크립트가 더 짧고 읽기 쉽게 되어있다.
  • 라이브러리 의존성 관리?
    • Gradle이 Maven보다 더 효율적이고 강력한 기능을 제공하고 있다.
    • Gradle은 버전 충돌 또한 관리해준다.

빌드의 과정

  • 웹 자동차 경주 프로젝트의 jar파일과 plain-jar파일 확인 가능

  • plain-jar파일

    • 컴파일된 클래스 파일과 정적 리소스 파일들이 저장되어 있다.
  • jar파일

    • 클래스 파일과 리로스 파일 뿐 아니라, 외부 라이브러리와 스프링 부트를 실행할 수 있는 스프링 부트 로더 라이브러리도 포함되어 있다.

2가지 Jar파일

  • Jar에 의해 생성된 jar(*-plain.jar, PlainArchive)
    • Jar에 의해 생성된 jar는 plain archive라고 하며, 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않고 소스코드의 클래스 파일과 리소스 파일만 포함한다.
      • 의존성을 제대로 포함하지 않고 있기 때문에 java -jar명령어로 제대로 실행이 이루어지지 않는다.
  • BootJar에 의해 생성된 jar (Executable Archive)
    • BootJar에 의해 생성된 jar는 executabel archive라고 하며, 어플리케이션 실행에 필요한 모든 의존성을 함께 빌드한다. 따라서, 해당 jar파일은 java -jar명령어를 통해 실행이 가능하다.

빌드의 결과물: JAR와 WAR

  • jar와 war 파일이란?
    • 프로젝트의 내용을 압축해 담아놓은 파일
  • jar와 war 파일을 왜 만들까?
    • 웹 프로젝트를 폴더 째로 전해줄 수 없으니, 컴퓨터가 읽을 수 있는 형태의 파일을 전달하기 위해서.
      • 컴퓨터가 폴더를 이해할 순 없으므로, 우리가 책을 이해하는 것처럼 컴퓨터가 읽을 수 있는 하나의 파일로 넘겨주는 것!
  • JAR (Java ARchive)
    • JAR 파일 포맷은 Java 클래스 파일, 메타데이터, 리소스 파일 등을 압축하여 하나의 파일로 묶어주는 포맷
    • 주로 Java 라이브러리, 애플리케이션을 배포할 때 사용
  • WAR(Web Applicaion ARchive)
    • WAR 파일 포맷은 웹 애플리케이션과 관련된 파일들, 즉 서블릿, JSP, HTML, 자바스크립트 파일, 이미지, XML, JAR 라이브러리 등을 하나의 파일로 묶어주는 포맷
    • 주로 웹 애플리케이션을 웹 서버나 애플리케이션 서버에 배포할 때 사용

(plain) jar

  • 자바 프로젝트를 압축한 파일
  • .class 파일들과 해당 클래스에서 사용되는 리소스(이미지 등)등 포함
  • 외부 라이브러리를 포함하지 않음
  • 주로 다른 프로젝트에 종속성으로 사용될 때 사용
  • 또는 로컬 환경에서 실행되는 어플리케이션으로 사용(*클래스패스 추가)

(Runnable) jar

  • .class 파일들과 정적 자원(HTML, CSS, JavaScript, 이미지 파일), 웹 애플리케이션의 의존하는 라이브러리나 외부 모듈(프레임워크 라이브러리, DB 드라이버) 등 포함
  • 내장형 서버(톰캣)을 포함시켜 웹 프로젝트를 압축한 파일
  • 외부 웹서버 없이 웹프로젝트를 단독으로 실행, 배포 가능

war

  • JAVA 웹 프로젝트를 압축한 파일
  • 이 파일을 실행하려면, 웹 애플리케이션 서버(WAS)가 필요함
  • 웹 애플리케이션을 통째로 패키징하고 배포하기 위한 목적으로 사용
  • war 사용 시기
    • JSP를 사용하여 화면을 구성해야 하는 경우
    • 외장 WAS를 애용할 계획인 경우

그래서, 스프링부트 프로젝트는 무슨 파일로 빌드할가?

  • 스프링 부트에서 가이드하는 표준 형식은 JAR
    • 외부에 별도의 서버 설치없이 단독으로 웹 애플리케이션 실행이 가능.
    • 하지만, 내장된 서블릿 컨테이너는 JSP를 실행할 수 없다.
      (JSP 엔진을 내부적으로 가지고 있지 않기 때문에)

배포의 과정

  • 배포란?
    • 실행 가능한 파일(jar, war)을 사용자가 접근할 수 있는 환경에 배치하고 실행하는 것
    • 한마디로, 사용자가 웹 애플리케이션을 통해 서비스를 사용할 수 있도록 만들어 주는 것

사용자가 웹 애플리케이션을 사용하는 과정

  • 이 전반의 과정을 백엔드 개발자에게 가까운 환경부터 살펴보면, 그 과정이 배포의 과정과 동일하다!

배포의 과정

  1. 서버 환경 구축
  2. 배포 파일 업로드
  3. 빌드 및 빌드된 파일 실행
  4. 외부 접근 설정
  5. 모니터링 및 유지보수

1. 서버 환경 구축

여러가지 요인에 따라 달라질 수 있다.

  • 어떤 서버를 사용하느냐
    • 클라우드 vs On-premises
  • 어떤 파일을 업로드 하느냐
    • 파일의 유형에 따른 환경 구축의 차이가 있을 수 있음.
    • 스프링 부트 프로젝트의 경우 (서버로 전달하는 방법)
      1. 소스코드로 전달
        • 서버에서 빌드
        • 서버에 jdk 설치
      2. jar 파일로 전달
        • 로컬에서 빌드
        • 서버에 jre 설치
      3. war 파일로 전달
        • 로컬에서 빌드
        • 서버에 jre, WAS 설치(내장 톰캣이 없으므로)
          2, 3번의 경우 jdk 설치해도 잘 작동 가능.

2. 배포 파일 업로드

  • 파일을 전송할 수 있는 다양한 방법이 있다. 이중 git으로 전송하는 방법에 대해 알아보자!
  • 서버에 openJDK 설치
  • git 설치
  • git clone

3. 빌드 및 빌드된 파일 실행

  • 빌드
  • 실행
    • nohup&는 터미널이 종료된 이후에도 프로그램이 백그라운드에서 계속 실행되기 바랄 때 사용한다.

📌 nohup과 &

  • nohup
    • 목적: 터미널이 종료된 후에도 프로그램이 실행해야 할 때
    • 생명 주기: 로그아웃 후에도 적용
  • & (백그라운드 실행)
    • 목적: 사용자가 터미널을 다른 작업에 사용해야할 때 (멀티태스킹)
    • 생멍 주기: 현재 세션에서만 작동

4. 외부 접근 설정

⛑️ 문제상황: 외부망 접근 불가

  • 이때, 내부망에서는 서버에 접근이 가능하지만, 외부망에서 접근하는 경우 서버에 접근할 수 없다는 알림이 뜬다!

🔎 문제 분석: 서버 측 2가지 장애물(방화벽, 포트포워딩)

  • 사용자의 웹 애플리케이션 사용 과정 중, 서버를 자세히 살펴보면,
  • 아래와 같은 홈 네트워크 구조를 확인할 수 있다.
    • 외부망은 WAN 포트를 이용해 공유기에 연락되고, 공유기는 LAN포트를 통해 NAS에 접근한다. 이 경우, 2가지 장애물이 있다. 방화벽포트포워딩이 그것이다.

🛠️ 해결방법: 방화벽, 포트포워딩 설정

  • 방화벽 설정을 해주지 않았기 때문에, 외부에서 공유기로 접근하지 못하는 상황
      • 공유기의 방화벽 설정에 가서 해당 Port로 들어오는 모든 IP 허용.
  • 공유기가 요청 수령 후, 어느 장치에서 처리해야 할지 연결해주지 못해 연결이 이루어지지 않는 상황.
    • 공유기의 접속 포트와 라우트 포트를 설정해줌.

포트포워딩이란 내부 네트워크의 포트와 인터넷의 포트를 연결시켜 서로 통신할 수 있도록 열어주는 것을 말한다. 라우터의 NAT에서 처리하는 기능이다.

5. 모니터링 및 유지보수

+) CI/CD 무중단 배포


Reference

profile
Good Luck!

0개의 댓글