빌드와 컴파일을 아직도 헷갈려하는 개발자가 있다고;;?

NANA·2023년 10월 18일
0

그냥일기

목록 보기
4/6

저에요.

깃을 사용하지 않던 회사분이 퇴사하시면서 최종 소스 파일을 남기고 가셨다.
상사는 버전 관리를 위해 이걸 깃에 올려야 하니 최종 소스를 다시 한 번 정리를 해달라고 요청했다.
나는 떠나신 분이 남긴 프로젝트 폴더를 그대로 드렸고.. 나는 한소리를 듣고야 말았다.

상사 : 박주임.. 우리가 깃에서 관리해야하는 건 소스 파일이야
나 : 넹 'ㅅ'
상사 : 타켓 파일들이 그대로 있으면 될까..?
나 : 앗..! 'ㅅ'넵넵. 근데 이사님이 gitignore에 타겟 폴더 추가 하시면 되잖아용ㅋ
상사 : 내가.. 그걸 몰라서.. 이걸 박주임에게 시켰을까..? 오픈 소스 같은 거 배포할 때 이대로 할거야?
나 : 아앗~~~ 근데 저희는 소스 배포 안하잖아용😜😜😜😜😜😜

여러분은 나같은 후배/동료/상사 만나지 마세요~

암튼 target 폴더만 덜렁 지워서 보내려다가.. 흐린 눈 하고 있던 문제들을 조금 정리해보려고 한다.

빌드/컴파일/run 등등이 헷갈려

주고 메이븐~스프링, 혹은 그래들~스프링을 쓸 때 생기는 문제들이다.
상사는 소스 코드를 받으면 일단 컴파일을 해보는 것이 먼저라고 하는데
나는 IDE에서 냅다 ▶ 버튼만 누르고 돼용~😘👌 안돼용~😫 해버리는 덜떨어진 새끼였다.
그러니 IDE에서 제공하는 '버튼'으로만 뭐가 잘 안되면 당황해버리는 것이다..

  • 컴파일 : 사람이 쓴 코드를 컴퓨터가 실행 가능한 바이트 코드로 변환
  • 빌드 : 컴파일 단계를 '포함'하며, 프로젝트의 의존성 관리, 리소스 복사, 패키징 등을 처리하여 배포 가능한 소프트웨어의 형태로 만드는 것. 주로 Maven, Gradle 등의 도구를 사용한다.

즉, 빌드는 컴파일을 포함한 단계라고 보는 것이 맞다. 그런데 대부분의 IDE에서는 컴파일을 자동으로 처리하고 우리에게는 '빌드 할 거야 말 거야' 정도의 선택지만 주니 빌드 과정을 하지 않고 컴파일만 해보는 경험(?)을 하기가 어려운 것이다.

아 아니다 사실 해보긴 했다.

public class MyClass {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
javac MyClass.java
java MyClass

콘솔에서 자바 명령어로 직접 코드를 컴파일/실행하는 거. 알잖아?ㅋ

그렇지만 '빌드'를 자바 명령어로 직접 수행해본 적은 없다. 맨날 IDE가 알아서 촥촥해주는 것만 경험하다보니 '빌드'에 대해 고민해보지도 않은듯 하다.

챗사수께
스프링 프로젝트를 빌드도구를 사용하지 않고 컴파일 할 수 있어?

라고 질문했더니 다음과 같은 과정을 알려줬다.


1. 프로젝트 구성: 프로젝트 디렉토리를 생성하고 소스 코드 및 리소스 파일을 구성합니다.

2. 스프링 라이브러리 다운로드: 스프링 프레임워크 라이브러리(JAR 파일) 및 관련 의존성을 수동으로 다운로드하고 프로젝트 디렉토리에 추가합니다. 
이것은 일반적으로 스프링 웹 사이트 또는 Maven 중앙 저장소에서 다운로드할 수 있습니다.

3. 컴파일: 소스 코드를 javac를 사용하여 컴파일합니다. 이때 클래스 파일이 생성됩니다. 예를 들어:
javac -classpath .:spring-core.jar:spring-web.jar MyClass.java
위의 예에서는 클래스패스에 현재 디렉토리(.) 및 스프링 라이브러리 JAR 파일(spring-core.jar 및 spring-web.jar)을 포함시켰습니다.

실행: 컴파일된 클래스 파일을 java 명령어를 사용하여 실행합니다. 예를 들어:
java -cp .:spring-core.jar:spring-web.jar MyClass
위의 명령은 Main 클래스의 main 메서드를 실행하고 "Hello, World!"를 출력할 것입니다.

웅웅 챗사수말이 다 맞아용~^^
사실 따지고보면 여기까지는 컴파일의 과정이고, 의존 라이브러리를 추가하여 패키징까지 하는 '빌드'의 과정은 아직 덜 보여진 듯하다.

이건 컴파일 과정아냐? 나는 빌드를 이야기한거야.
그러니까 이 과정을 IDE없이 java명령어로만 진행하는 과정을 보여줘.
패키징하는 것까지 보여줘.

1. 프로젝트 디렉토리 구성:
프로젝트 디렉토리를 생성하고 Java 소스 파일과 필요한 라이브러리(JAR 파일)를 추가합니다. 아래와 같은 디렉토리 구조를 예로 들어 보겠습니다
my-java-project/
    src/
        Main.java
    lib/
        some-library.jar

자바 소스 코드 작성, 컴파일, 실행까지는 위와 같다.

4. 라이브러리 추가:

프로젝트에서 사용하는 외부 라이브러리(JAR 파일)가 있다면 이를 lib 디렉토리에 추가합니다. 예시에서는 some-library.jar를 사용합니다.

5. 패키징:

패키징은 프로젝트 파일 및 리소스를 목적에 따라 묶는 작업을 말합니다. 이 예시에서는 JAR 파일로 패키징합니다. 다음 명령어를 사용하여 패키징할 수 있습니다:
jar -cvmf manifest.txt my-java-project.jar -C src . -C lib .
위 명령어는 manifest.txt 파일을 사용하여 JAR 파일을 생성하며, src 디렉토리의 모든 파일과 lib 디렉토리의 some-library.jar를 포함합니다. 
생성된 JAR 파일은 my-java-project.jar로 저장됩니다.

그럼 이제 생성된 jar 실행은

java -jar my-java-project.jar

로 하면 되는 것이다!

소스 코드가 많고 의존하는 라이브러리가 많아질수록 명령어로 모든 것을 빌드하기 어려울테니 maven이나 gradle같은 빌드 도구를 쓰는 것이다.
그럼 다시 처음으로 돌아가서 target 폴더란 무엇인가? Maven build의 결과물을 보관하는 디렉토리다.

Maven의 target 폴더는 빌드 프로세스 중에 생성됩니다. 

Maven 빌드 프로세스의 주요 단계는 다음과 같습니다:

컴파일: Maven은 프로젝트의 소스 코드를 컴파일하여 바이트 코드 클래스 파일을 생성합니다. 컴파일된 클래스 파일은 target/classes 디렉토리에 저장됩니다.

리소스 복사: Maven은 프로젝트의 리소스 파일 (예: 프로퍼티 파일, 설정 파일, 이미지 등)을 복사하여 target/classes 디렉토리에 저장합니다.

테스트 실행: Maven은 프로젝트의 단위 테스트 및 통합 테스트를 실행하고 테스트 결과 및 보고서를 생성합니다.

패키징: Maven은 프로젝트를 JAR, WAR, 또는 다른 패키징 형식으로 묶고 생성된 아티팩트를 target 디렉토리에 저장합니다.

즉 내가 war, jar 등등을 배포해야 한다면 이 target폴더 내부에 있는 생성물을 배포하는 것이 맞고,
소스 파일 배포를 한다면 이 target 폴더를 굳이 전달할 필요가 없는 것이다.

profile
일단 나만 알아보면 된다는 마음으로, 작더라도 꾸준히

0개의 댓글