Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4 Weeks - [빌드 툴] #65

Open
Hot-ttu opened this issue Sep 3, 2023 · 1 comment
Open

4 Weeks - [빌드 툴] #65

Hot-ttu opened this issue Sep 3, 2023 · 1 comment

Comments

@Hot-ttu
Copy link
Member

Hot-ttu commented Sep 3, 2023

문제

빌드 툴이 무엇인지 궁금합니다.

contents - 세부 내용

책에서 maven이나 gradle과 같은 빌드 도구(빌드 툴)에 대해서 자주 언급하는데 빌드 툴이란 무엇이고, 빌드 툴이 하는 역할이 무엇인지 궁금합니다.

참고

@hgene0929
Copy link
Collaborator

hgene0929 commented Sep 6, 2023

4장 이슈

빌드란?

  • 빌드(build) : 개발자가 작성한 소스코드(.java)와 프로젝트에서 사용된 각각의 파일 및 자원(.xml, .properties, .jpg)을 JVM이나 WAS가 인식할 수 있는 구조로 패키징하는 과정 및 산출물.
    • 사람이 알아들을 수 있는 언어 → JVM이 알아들을 수 있는 형태.
    • 프로젝트 자원 → WAS가 찾아 사용할 수 있는 구조.
    • 결과물 : 실행 가능한 독립적인 소프트웨어 산출물.
  • 빌드 과정 :
    1. 전처리(preprocessing)
      • 전처리기에 의해 소스코드에 포함된 매크로나 지시자 같은 것을 포함시켜주는 단계.
      • 이미 정해져있는 것들을 먼저 처리하여 이후에 일일이 다시 찾아 쓸 필요 없이 정리해두는 과정.
    2. 컴파일(compile)
      • 컴파일러에 의해 기계어와 고급언어의 중간단계인 저수준 언어로 소스코드를 번역하는 단계.
    3. 어셈블(assemble)
      • 어셈블러에 의해 컴파일된 저수준언어를 컴퓨터가 알아들을 수 있는 형태(목적 파일)로 번역해주는 단계.
        • 어셈블리어 같은 저수준 언어가 아닌 바로 기게어로 번역되는 경우는 어셈블 과정이 생략되고 컴파일 단계만 존재.
        • 언어마다의 대표적인 컴파일 방식에 대한 정리는 [여기]에 잘 정리되어 있습니다.
    4. 링크(linking)
      • 어셈블까지의 과정을 거쳐 기계어로 번역된 각각의 파일들을 연결시켜, 최종적으로 하나의 실행가능한 파일(JAR, WAR)로 만드는 과정.

빌드툴?

  • 빌드툴(build tool) : 소프트웨어 개발에 있어 소스코드를 실행 가능한 애플리케이션으로 만들어주는 도구. 개발자가 작성한 스크립트에 따라 위의 과정(빌드)을 자동화해준다.
  • 빌드툴 역할 :
    • 소스코드를 컴파일하거나 패키징.
    • 테스트를 자동으로 수행.
    • 의존성 주입 및 배포.
  • 빌드툴 필요성 :
    • 다양한 개발이 가능해지면서 필요한 라이브러리들이 많아지게 되었다.
    • 만약 이 라이브러리들을 직접 다운로드하고 추가하면 개발자들 간의 버전 관리 및 다운로드한 jar 파일의 보안 위험 문제 등, 번거로울 것이다.
    • 또한 빌드 프로세스를 수동으로 호출할 시 무엇을 빌드할지, 어떤 순서를 가지고 빌드할지, 어떤 의존성이 있는지 모두 파악하기 쉽지 않아 실용적이지 않다.
    • 따라서 이러한 문제들을 방지하고 해결하기 위해 빌드툴을 사용한다.

Java의 빌드툴(출시순)

  • Apache Ant

    • XML 기반으로 스크립트를 작성한다(build.xml).
    • 프로젝트 디렉터리 구조나 기본 동작과 같은 공식적인 규약을 따로 가지지 않는다.
      • 어떠한 코딩 규칙이나 프로젝트 구조를 강조하지 않으며 유연성을 가진다.
      • 정해진 규칙이나 구조가 없기 때문에 개발자가 모든 명령을 스스로 작성해야 하기 때문에 빌드과정을 이해하기 어렵고, 유지보수가 어렵다.
  • Maven

    • XML 기반으로 스크립트를 작성한다(pom.xml).
    • Ant의 단점을 극복하기 위해 공식적인 규약 추가 + 필요한 라이브러리를 자동으로 불러오고 관리하는 기능 추가.
      • 빌드 파일이 표준화됨으로써 유지보수가 가능해지고, Ant에 비해 빌드시간이 단축되었다.
      • 여전히 빌드 스크립트가 복잡하고 거대하다.
      • 빌드 파일이 표준화되어 Ant의 장점인 유연성이 사라졌다.
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- (1) <project> : Maven의 XML 네임스페이스를 지정 -->
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
        <!-- (2) <modelVersion> : Maven의 model Version -->
    		<modelVersion>4.0.0</modelVersion>
        <!-- (3) <groupId> : 그룹 ID(모든 프로젝트 중에서 당신의 프로젝트를 식별하게 해주는 식별자) 태그 -->
    		<groupId>daeik.co.kr</groupId>
    		<!-- (4) <artifactId> : 아티팩트ID(버전 없는 jar파일의 이름) 태그 -->
        <artifactId>daeik</artifactId>
        <!-- (5) <version> : 버전명 태그 -->
    		<version>1.0-SNAPSHOT</version>
    		<!-- (6) <packaging> 패키징 형식을 지정하는 태그 -->
        <packaging>war</packaging>
    		<!-- (7) <name> : 프로젝트의 이름 -->
        <name>대익건설</name>
    
    		<!-- (8) <properties> : 프로젝트 관련 속성 -->
        <properties>
            <java-version>1.8</java-version>
            <org.springframework-version>5.3.3</org.springframework-version>
            <org.slf4j-version>1.7.29</org.slf4j-version>
        </properties>
    
    		<!-- 
    		(9) <dependencies> : 프로젝트가 의존하는 라이브러리들의 정보
    				- <groupId> : 라이브러리 그룹 아이디
    				- <artifactId> : 라이브러리 아티팩트 아이디
    				- <version> : 라이브러리 버전
    				- <scope> : 라이브러리가 프로젝트 내에서 사용되는 범위
    		-->
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.18</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- Test -->
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.5.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <compilerArgument>-Xlint:all</compilerArgument>
                        <showWarnings>true</showWarnings>
                        <showDeprecation>true</showDeprecation>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.2.1</version>
                    <configuration>
                        <mainClass>org.test.int1.Main</mainClass>
                    </configuration>
                </plugin>
                <!--Java 설정을 하기 때문에 web.xml이 없어도 오류가 나오지 않게 설정-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
  • Gradle

    • JVM 위에서 동작하는 Groovy나 Kotlin으로 스크립트 작성(build.gradle).
    • 유연함 : 동적인 스크립트로 설정 파일을 작성한다. 이에 어떤 설정이 필요하다면 로직 안에 플러그인을 호출하거나 직접 코드를 짜면 된다.
    • 가독성 : pom.xml보다 더 간략하게 표현할 수 있으므로, 프로젝트 유지보수와 직결된다.
    • Configuration Injection : 설정 정보를 변수에 값을 넣는 형태로 필요한 모듈에만 주입하는 Configuration Injection 방식을 사용해서 Maven에서의 공통을 모듈을 상속할 때의 단점을 커버한다.
      • Ex. 만약 루트 모듈 아래 서브모듈에만 필요한 설정이 있다면 해당 모듈에만 설정을 주입할 수 있다.
    • 성능 : Maven에 비해 빌드 속도가 거의 모든 시나리오에서 두 배 이상 빠르다.
      • 점진적인 빌드 : 빌드 실행 중 마지막 빌드 호출 이후에 task의 입력, 출력 혹은 구현이 변경되었는지 확인하고, 최신상태가 아니라면 빌드하지 않는다.
      • 빌드 캐시 : task의 결과가 이미 존재한다면, 이전에 생성된 task의 결과물을 재사용할 수 있다.
      • 그레이들 데몬 : 빌드하는 인스턴스를 빌드가 종료된 이후에도 백그라운드에서 대기시킴으로써, 빌드시마다 초기화하는 시간을 단축한다.
    // 특정 빌드과정에 필요한 기본정보를 포함하고, 필요에 따라 정보를 수정하여 목적에 맞게 사용
    plugins {
    	id 'org.springframework.boot' version '2.3.0.RELEASE'
    	id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    	id 'java'
    	id 'war'
    }
    
    // gralde이 지원하는 저장소 설정
    repositories {
    	mavenLocal()
    	mavenCentral()
    	maven { url "http://repo.company.com/maven }
    }
    
    // 의존성 관리
    // implementation : 프로젝트 컴파일 과정에서 필요한 라이브러리
    // providedCompile : 컴파일시에는 필요하지만, 배포시에는 제외될 의존성
    // providedRuntime : 런타임시에만 필요하고, 실행환경에서 제공되는 의존성
    // testImplementation : 테스트 시에 필요한 의존성
    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-web'
    }
    
    // 테스팅 : gralde을 통해서 테스트 간편하게 지원
    test {
    	useJUnitPlatform()
    }

@devjy39 devjy39 closed this as completed Sep 8, 2023
@devjy39 devjy39 reopened this Dec 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants