컴파일

  • 컴파일: 소스 코드를 기계가 읽을 수 있는 바이너리 코드로 변경하는 과정. 소스 코드 분석 및 문법 오류 분석이 이루어진다.
  • 인터프리터: 소스 코드를 바이너리 코드로 변경해주는 컴파일러와는 다르게, 인터프리터는 바이너리 코드로 변환해주는 과정이 없다. 인터프리터는 실행 중에 한 문장씩 기계어로 변환하여 바로 실행한다.
  • Java의 호환성
    • Java는 위의 컴파일러와 인터프리터를 둘 다 활용해 높은 호환성을 가질 수 있는 언어가 되었다.
    • 바로 기계어로 변환하는 C와 다르게 바이트 코드라는 중간 단계의 언어로 컴파일을 한다. 그리고 실행하게 되면 JVM(Java Virtual Machine) 상에서 인터프리터를 통해 바이트 코드를 해석하여 실행하게 된다. 따라서 Java는 시스템 아키텍쳐를 고려하지 않고 코드를 작성할 수 있게된다.

    Java-Compile

빌드

  • 빌드: 소스 코드를 실행 가능한 독립적은 소프트웨어 산출물로 만드는 과정
  • 빌드의 과정 컴파일 → 링크 → 패키징 → 테스트
    • 컴파일: 소스코드를 바이너리 코드로
    • 링크: 클래스 파일들끼리 연결 (외부 라이브러리 포함)
    • 패키징: 연결된 클래스 및 리소스 파일 묶어주기
    • 테스트: 기능 테스트
  • 빌드의 산출물
    • JAR (Java Archive): 자바에서 사용되는 압축 양식, 클래스 + 리소스파일로 구성
    • WAR (Web Archive): 웹 어플리케이션을 압축하고 배포하는데 사용되는 파일 형태. JAR에 비해 자바 서블릿, XML 파일, 정적 파일 등 필요한 자원이 더 많다.

빌드 도구

  • Ant
    • 장점
      • XML 형식으로 작성
      • 자유도가 높다는 특징을 가짐
      • 절차적으로 작성이 됨
      • 스크립트 직접적으로 명시, 다양한 Task 가능
    • 단점
      • 스크립트 재사용 불가능
      • 복잡해 질수록 구조 및 스크립트 파악이 힘듬
  • Maven
    • 장점
      • pom.xml 형식으로 작성
      • 전체적인 프로젝트 관리 가능
      • 편리한 의존성 관리 및 다운로드 가능
      • 표준화된 빌드 스크립트
      • Lib가 존재하여 빌드 속도가 빨라 짐
    • 단점
      • 지원하지 않는 복잡한 빌드 과정 추가시 난이도 상승
      • pom.xml 고나리가 까다로워 짐
      • Repository 관리가 불편함
  • gradle: Ant와 Maven을 모은 새로운 빌드 도구
    • 장점
      • JVM 위에서 동작하는 Groovy 기반으로 작성
      • 자바 문법과 유사하여 익히기 쉬움
      • Maven의 세팅 및 줒앙 저장소를 활용 가능
      • 프로젝트를 설정 주입식으로 정의, 재사용이 용이
      • Wrapper를 활용하여 Gradle이 설치 되어 있지 않아도 사용 가능
    • 단점
      • Maven에 비해 커뮤니티 크기가 적음

Gradle 훑어 보기

├── build.gradle
├── gradle
   └── wrapper
       ├── gradle-wrapper.jar
       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
       ├── java
          └── temp
              └── App.java
       └── resources
    └── test
        ├── java
           └── temp
               └── AppTest.java
        └── resources
  • settings.gradle
    • 빌드 이름과 하위 프로젝트를 정의하는 파일을 설정
      rootProject.name = 'gradle-example'
    
    • gradle 빌드 당 하나의 파일만 가지며, 다중 프로젝트 빌드를 정의하는 사용할 수 있다. 다중 프로젝트 빌드일 경우 이 파일이 있어야되지만, 단일 프로젝트 일 경우에는 없어도 괜찮다.
      include 'foo', 'bar'
    
    • 빌드의 다른 라이프 사이클 훅의 일부로 코드를 등록할 수도 있다.
  • build.gradle
    • 프로젝트 빌드 정보 및 구성을 표현하는 스크립트
      apply plugin: 'java'
      apply plugin: 'eclipse'
    
      version = '1.0.0'
      sourceCompatibility = 1.8
    
      repositories {
          mavenCentral()
      }
    
      dependencies {
          testCompile('org.junit.jupiter:junit-jupiter:5.6.0')
          testCompile('org.assertj:assertj-core:3.15.0')
      }
    
      test {
          useJUnitPlatform()
      }
    
  • .gradlew, .gradle.bat
    • gradle wrapper의 약자로, gradle의 선언된 버전을 호출하여 필요한 경우 미리 다운로드하는 스크립트
    • 결과적으로 개발자는 수동 설치 프로세스를 따르지 않고도 gradle 프로젝트를 빠르게 시작하고 실행할 수 있다.

배포

  • 배포: 사용자가 사용할 수 있도록 소프트웨어를 제공하는 과정
  • CI (Continuous Integration): 지속적 통합이라고도 하며, 코드 변경사항마다 빌드, 테스트까지 자동으로 진행하고 결과물을 보고 받고 리포지토리에 자동 통합되는 프로세스
  • CI가 필요한 이유
    • 협업 시 마지막에 프로젝트를 합칠 시에 Integration Hell이 발생
    • 협엽 시 중간마다 프로젝트를 합칠 시에 지속적으로 시간 소모
  • CI Tool을 사용하여 각자의 코드를 받을 때, 각자 코드의 성공 여부를 Slack, 이메일 등으로 전송받을 수 있다.
  • CI 특징
    • 변경 사항이 클래스, 기능 더 나아가 전체 애플리케이션에서의 테스트를 수월하게 수행
    • 신규 코드와 기존 코드의 충돌을 빠르게 수정 가능
    • 협업 시에 애플리케이션이 최신 상태로 유지됨을 믿을 수 있음

CI Tools

  • Travis
    • 장점
      • Github와 연계가 매우 좋다.
      • 클라우드 기반으로 서버 없이 작동 가능
      • yml 형식을 통하여 쉽게 설정 가능
      • 모든 작업이 독립적이다.
    • 단점
      • 유료 서비스
      • 상대적으로 부족한 플러그인
  • Jenkins
    • 장점
      • 다양한 IDE를 지원함
      • 호스팅을 직접 하기때문에 커스터마이징 가능
      • 가장 커뮤니티가 크기 때문에 문서가 다양
    • 단점
      • 중구난방 플러그인 때문에 파편화된 세팅
      • 규모가 작아도 따로 서버를 운영 해야함
      • 서버 운영 비용 발생

CD

  • CD (Continuous Deployment): 개발자들이 코드에 변경 사항을 줄 경우, 파이프 라인을 통해 이동하여 프로덕션 단계까지 자동으로 배포하는 프로세스
  • 리포지토리까지만 가고 수동으로 배포하는 프로세스의 경우에는 Continuous Delivery가 구축되었다고 표현한다.

CI&CD

  • CI & CD에 운영, 모니터링 그리고 다음 기능 기획에 반영하게 하려는 것을 구현한 것이 DevOps이다.
  • DevOps: Development와 Operation을 결합한 단어로 개발고 ㅏ운영이 연계하여 협력하여 서비스를 이끌어 나가는 방법론

DevOps.png

  • CD 특징
    • 애플리케이션을 프로덕션으로 빠르고 쉽게 배포
    • 소비자들의 요구를 빠르게 만족시키는 서비스 출시가 가능
    • 개발팀과 운영팀의 간극을 메워줄 생산성 향상
  • DevOps에 사용되는 도구들

DevOps-tools

참고 자료

http://www.tcpschool.com/java/java_intro_programming

https://www.guru99.com/difference-compiler-vs-interpreter.html

https://www.baeldung.com/gradle-build-settings-properties

https://docs.gradle.org/current/samples/sample_building_java_applications.html

https://www.redhat.com/ko/topics/devops/what-is-ci-cd

https://blog.gds-gov.tech/that-ci-cd-thing-principles-implementation-tools-aa8e77f9a350

https://harness.io/blog/devops/devops-tools-lifecycle-mesh/

댓글남기기