개발새발

[Java] 빌드(Bulid) feat.컴파일, 링크 - (1) 본문

코딩지식

[Java] 빌드(Bulid) feat.컴파일, 링크 - (1)

칸쵸. 2023. 12. 3. 03:36
728x90

 

스프링부트에 입문하면서 처음 접한 개념이 있었습니다.

바로 메이븐(maven)과 그레이들(gradle).

 

프로젝트를 생성할 때마다 보는 녀석들이긴 한데..

사실 나는 이게 무슨 뜻인지도 모르고,

일단은 프로젝트 빌드에 가장 대표적이라는 빌드툴이라는 것만 알고 지나쳐왔는데요.

 

그러고 또 지나고 생각해보니 저는 여태 빌드(build)가 뭔지도 정확히 모르고 있다는 사실을 깨달았습니다;;

대충 느낌은 알겠는데...

빌드가 뭔지도 모르는데 빌드툴을 이해하려는 것도 어불성설인 노릇이지.

 

그래서 궁금해진 이번 기회에 개념을 알아보자~해서 쓰는 글

 

레지고

 


 

1. 빌드(Build)

소스 코드 파일을 컴퓨터에 실행할 수 있는 독립(standalone) 소프트웨어 가공물로 변환하는 과정을 말하거나 그에 대한 결과물

 

 

사실 사전적 정의는 저렇다 하는데, 이런 딱딱한 말 뿐으로는 이해하기가 쉽지 않았네요.

직관적으로는 알겠는데, 또 막상 정확히는 모르겠고...

그래서 또 이것저것 열심히 찾아보고 나름대로 이해한 결과를 단계별로 풀어보자면... (틀린 정보 있을 수 있음)

 


 

1) 소스코드 작성

 

저는 자바를 배웠으니까, 자바 기준으로 이야기를 하겠습니다.

자바(Java)란 무엇인가? 소프트웨어를 조작하기 위한 프로그래밍 언어의 한 종류입니다.

 

그리고 우리가 프로그래밍 언어를 배울 때, 처음 작성하는 국룰 코드가 무엇인가요? 바로..

 

안녕 세상아!

 

이렇게 인삿말을 던져주는 것으로 시작하죠.

 

2) 컴파일(Compiling)

 

그러고는 언제나처럼 이 코드가 적힌 파일을 Run해주면, 콘솔창에는 해당 문구인 "Hello World!"가 출력될 것입니다.

그렇다면 이 친구를 실행했을 때, 컴퓨터에서는 어떤 일이 일어났을까요?

 

우리의 컴퓨터는 똑똑하니까 바로 저 말을 알아듣고서는,

'아휴.. 콘솔창에 또 문구 한번 찍어줘야겠군' 하고 냅다 실행을 해줬을까요?

 

안타깝게도 컴퓨터는 0과 1로 이루어진 말 외에는 아무것도 알아듣지 못합니다..

그럼 도대체 컴퓨터는 저 코드를 무슨 수로 알아듣고 출력까지 해줄 수 있었던걸까요?

 

여기에서 나오는 개념이 바로 컴파일입니다

 

자바는 '사람'이 사용하는 언어입니다. 컴퓨터는 멍청해서 이 언어를 이해할 줄 몰라요.

그렇다고 사람이 또 매번 컴퓨터에 맞춰서 0과 1로만 이루어진 말을 할 수도 없는 노릇이구요.

그래서 사람의 말을 다 쓰고난 뒤에, '이걸 번역해줘!' 하고 요청을 하면, 자바언어로 쓰인 소스코드들이 컴퓨터가 알아들을 수 있게끔 0101001...과같은 형태로 변환이 됩니다. 우리는 이러한 과정을 컴파일이라고 합니다.

 

cf) 소스코드를 작성하고 수동으로 번역을 요청하는 컴파일과 달리, 소스코드 작성과 동시에 한 줄씩 자동 번역이 되는 과정을 '인터프리트'라고 합니다. 그래서 자바는 컴파일링 언어의 일종이라고 볼 수 있습니다.

 

3) 링크(Link)

 

와! 그럼 이제 컴퓨터 언어로 변환까지 됐겠다, 이제 그럼 컴퓨터는 제가 작성한 코드를 이해하고 실행할 수 있을까요?

 

아직 한 가지 과정이 더 필요한데요, 번역된 컴퓨터 말을 해석할 수 있도록 하는 것입니다.

저도 처음에는 '아니, 너네 말로 번역해줬으면 끝난거 아니야? 대체 뭘 더 해달라는건지...' 했는데, 비유하자면 이렇습니다.

 


 

A라는 사람이 있는데, 어떤 상황에서 배워본 적도 없는 아랍어로 이루어진 문서를 읽고, 그에 따른 감상문도 제출해야 한답니다. 갑자기?

 

عندما يلتقي منحنيان للسواء عند نقطة التوزيع x، تكون نقطة التوزيع x هي نقطة باريتو المثالية إذا انخفض المعدل الهامشي للإحلال.

 

'나는 아랍어는 고사하고, 문자도 읽을 줄도 모르는데....!' 하며 어쩔줄 몰라하던 도중, A의 눈에 들어온 것은 바로 ㅍ파고! 

 

그래서 열심히 번역기를 돌려서 해당 문서를 자국 언어로 변환하는 것까지는 성공을 했습니다. 

그런데 번역을 하고 보니 뭔가 이상해요. 분명 우리나라 말인데 알 수가 없어요. 막 이상한 말이 난무합니다.

 

배분점 x에서 두 개의 무차별곡선이 접할 때, 만일 한계대체율이 체감한다면 배분점 x는 파레토 최적이다.

 

문장은 강의노트 문장 그냥 한번 긁어와봤습니다 ㅎ

아무튼, 여기서 A는 분명 모르는 단어가 있기에 막막함을 느꼈을 것입니다. 그래서 A는 열심히 경제학 용어 사전을 뒤져서 단어의 뜻을 찾아냅니다. '파레토 최적이란?', '무차별곡선이란?', '한계대체율이란?' 하면서요.

 

그렇게 우여곡절 끝에 A는 드디어 저 문장의 의미를 깨닫고, 비로소 감상문을 쓸 수 있게 됩니다.

 


이 상황을 프로그래밍에 대입을 해보자면 

 

  • 사람 A : 컴퓨터
  • 아랍어 및 아랍어문장 : 자바 및 그로 이루어진 소스코드 파일(.java)
  • 번역기 돌리기 : 컴파일 > 바이너리 형태의 오브젝트 파일 (.class)
  • 경제학 용어 사전 뒤지기 : 링크

 

가 될 것입니다. 링크(Link)란 결국, 컴퓨터가 문장을 이해할 수 있도록 일종의 용어사전을 연결시킴으로써 해석을 하게끔 만드는 것입니다. 바이너리 형태로 변환된 오브젝트 파일이 참고하는 용어사전에는 라이브러리, 함수 등등 여러 리소스가 존재할 수 있겠네요.

 

자바의 경우에는 여타 언어들과 다르게 JVM(Java Virtual Machine)으로 동작하기 때문에 별도의 링크과정이 존재하지 않는다고도 하는데, 이건 관점 차이인 것같습니다.

 

아무튼 이렇게 컴파일 및 링크 과정을 거치면 드디어 컴퓨터가 알아들을 수 있는 형태의 실행파일(.jar) 이 나오게 됩니다.

 


 

결국, 빌드(Build)란 위에서 말한 사전적 정의와 같이

 

사람들이 알아들을 수 있는 형태로 이루어진 소스코드 파일(.java)을 실제 컴퓨터에서 실행할 수 있게끔 만드는(.jar),

일련의 과정을 일컫는다고 할 수 있겠습니다!

 

어우 저도 이해하면서 풀어쓰려다보니 말이 너무 길어졌어요 또.

 

다 쓰고보니 진짜 별거 아닌 개념에 너무 많은 시간을 썼나?싶기도해요.

하지만 세상에 쓸모 없는 지식이 어딨겠어요. 다 어디든 필요한 곳이 생기기 마련이겠죠.

 

그리고 결국 빌드툴의 일종인 메이븐과 그레들에 대해서는 다음 글로 이어서 써야겠군요 푸하하

빌드 글 2탄을.. 기대해주세요... 그럼 20000

 

 

 

'코딩지식' 카테고리의 다른 글

URI / URL / URN  (0) 2024.01.05
HTTP의 정의 및 구조  (0) 2024.01.02
[IT] WAS란 무엇인가? (핵단순 주의)  (1) 2023.12.11