본문 바로가기
CS공부

기본기 닦기(2) - 빌드/컴파일, 웹서버/내장서버

by 티코딩 2023. 12. 22.

ㅇ 빌드

프로젝트를 만들고 개발하는 과정에서 빌드라는걸 들어보거나 해봤을것이다. 근데 이걸 왜 해야하고 빌드가 대체 뭐하는 걸까?

빌드란 소스코드 파일을 실행 가능한 산출물로 변환하는 것이다. 정말 잘 정리해두신 블로그가 있어 거기서 발췌 해 봤다.

빌드?

프로그래머가 작성한 소스 코드를 실행할 수 있는 독립적인 형태(.war, .jar)로 변환하는 과정 및 결과를 말한다. 변환하는 과정에는 컴파일 과정도 포함이 된다.

예를 들어 개발자가 이클립스나 인텔리제이와 같은 IDE로 java코드를 작성하면 개발자는 '실행'버튼을 눌러서 코드의 결과물을 볼 수 있다.

그런데 개발자가 아닌 사용자가 코드의 결과물을 보려면? 사용자가 자바를 설치하고 IDE를 설치하고 해당 코드를 가져와서 실행을 눌러야 하는가?

아니다, 사용자는 어떠한 형태로든 빌드 된 결과물(.war, .jar 등)을 실행만 하면 된다. 그리고 이러한 빌드 결과물을 실제 서버에 업로드하는 것을 배포라고 한다.

만약 java프로젝트가 하나 있다치자, 해당 프로젝트에는 개발자가 작성한 ~~. java 파일들이 있을것이고, 여러가지 정적 파일을 관리하는 resource 파일들이 있을것이다.

이 프로젝트를 빌드 한다면 .java 파일들을 .class 파일로 컴파일하고, resource파일들을 .class를 참조 할 수 있는 위치로 옮기는 등 여러 데이터들을 압축하는 과정을 거쳐 하나의 결과물로 나올것이다.

빌드(Build) : 프로젝트의 소스코드 개발에서 최종 사용자에게 전달되기까지의 모든 과정(프로젝트 생명주기)을 아우르는 행위

그리고 이러한 빌드를 자동화해서 도와주는 도구가 빌드 도구(빌드 툴)이다.

 

그렇다면  빌드 도구를 사용할까?

아니다, 이렇게 생각해보자 만일 빌드 도구를 사용하지 않고 개발자가 직접 프로젝트를 빌드 해야된다면?

우선 개발자는 프로젝트에 필요한 수 많은 라이브러리를 다운받고, 라이브러리에 대한 의존성도 수동으로 잡아주고, 컴파일 하고, 테스트 하고, 실행 파일로 만들고.. 등등 프로젝트 환경을 설정하는데 한 세월을 쏟을것이다.

그런데 빌드 도구는 이러한 과정들을 자동화 시켜준다.
이제 왜 빌드 도구를 사용해야되는지 알것같다..

https://velog.io/@nopecho/Spring-%EB%B9%8C%EB%93%9C-%EB%8F%84%EA%B5%AC-%EB%B6%80%ED%84%B0-%EC%95%8C%EA%B3%A0%EB%B3%B4%EC%9E%90

 

[Spring] 빌드 도구 부터 알고보자

빌드가 뭐죠?

velog.io

 

여기서 의문이 든다.

ㅇ 컴파일과 빌드의 차이는 뭘까?

일단 컴파일은 자바로 생각을 해보면 자바언어로 개발된 소스코드들을 기계가 읽을 수 있는 코드(바이트 코드)로 변환을 하는 과정이다.

고로, 빌드는 컴파일 이후에 일어나는 과정이라고 정리 할 수 있다.

 

ㅇ 빌드 도구

java에서 주로 쓰이는 빌드 도구로는 Maven, Gradle이 있다. 나는 솔직히 아직 경험이 부족해 Maven은 사용해보지 못했고, 여지껏 모든 프로젝트를 Gradle을 사용해와서 Gradle이 가장 편하다. Gradle에 관해서 굉장히 자세히 정리해둔 블로그가 있어 공유해본다.
https://velog.io/@sa1341/Gradle-%EA%B8%B0%EB%B3%B8-%EB%8B%A4%EC%A7%80%EA%B8%B0-1%ED%8E%B8

 

Gradle 기본 다지기 1편

회사에서는 Gradle 대신 다른 빌드 툴인 Maven으로 프로젝트에서 사용하는 외부 라이브러리들을 땡겨오고 빌드를 하고 있습니다. 개인적으로 집에서 스프링 부트를 공부하면서 다른 빌드 툴을 사

velog.io

이런 빌드 도구 들이 하는 역할만 정리해보자면, 

1. 프로젝트 구조 및 라이프사이클 관리:

Gradle은 Groovy나 Kotlin 스크립트(build.gradle)를 사용하여 프로젝트 구조 및 라이프사이클을 정의한다.

2. 의존성 관리:

Maven과 마찬가지로 의존성을 정의하고, 필요한 라이브러리를 자동으로 다운로드하여 프로젝트에 통합함.

3. 빌드 실행:

빌드 스크립트(build.gradle)를 통해 빌드 작업을 실행하며, 필요한 태스크들을 지정하여 특정 작업을 수행할 수 있음.

4. 테스트 실행:

JUnit이나 TestNG와 같은 테스트 프레임워크를 통해 단위 테스트, 통합 테스트 등을 실행하고 결과를 보고함.

5. 자원 복사 및 압축:

프로젝트에서 사용하는 정적 자원을 복사하고, 필요에 따라 압축하여 배포 가능한 형태로 만듬.

 

ㅇ 웹 서버

아파치, NginX가 가장 대표적이다. 나는 저번 프로젝트에서 아파치를 적용해보기도 했다. 얘네의 역할을 알아보자.

간단하게는 웹사이트를 제공하는 서버로 만들어주는 역할을 한다. 웹사이트는 브라우저 위에서 돌아가고, 브라우저가 읽을 수 있는 파일들을 갖다가 서버에서 사용자컴퓨터로 보내줄 수 있어야 한다. 이 파일들은 서버 컴퓨터에 저장되어있고, 이 서버에 특정 폴더, 디렉토리에 파일들을 넣어두면 이 폴더를 외부에서 접근가능하도록 만들어 서버에 지정된 웹사이트 주소로 접속하면 이것들을 받아갈 수 있도록 하는것이웹 서버의 가장 기본적인 역할이다. HTML등의 파일들로 사이트의 내용이 바뀔필요가 없는 정적 웹사이트를 제공할 수도 있고, PHP, MySql 과 연동해 동적 웹사이트를 제공할 수도 있다.

ㅇ 내장 서버

내가 사용해본 내장 서버는 톰캣이다. 요즘엔 스프링 부트에 톰캣이 내장되어있어 자연스럽게 접했다. 하지만, 내가 직접적으로 톰캣으로 뭔갈 하지 않아서 무슨역할을 하는지는 잘 몰랐다. 일단 톰캣같은 Web Application Server(WAS)는 자바랑 JSP로 만든 웹 또는 API 어플리케이션을 실행할때 사용된다. 그런데 왜 웹서버를 앞에두고 내장서버를 뒤에 따로 둘까? 톰캣도 정적웹서비스를 제공할 수 있는데? 웹서버가 하는 일이 여러가지기 때문이다. 그중엔 손님들에게서 서버의 정보를 감추는 리버스 프록시가 있다. 이렇게 보안측면에서 이유가 있다. 그리고 웹서버를 앞에 두는 이유중 로드 밸런싱이 있다. 여러개의 톰캣을 돌릴때 그들의 밸런스를 맞춰준다. 왜 하나의서비스에 여러개의 톰캣을 사용할까? 지속성을 위함이다. 톰캣 하나로 서비스를 돌린다면 새로운 기능을 업데이트할때, 서비스를 멈추고 다시 실행해야하는데 그 순간에 사용자가 서비스에 접근하면 오류가 뜬다. 톰캣이 여러개면 하나하나 차례로 업데이트시키면 서비스를 끊김 없이 제공할 수 있다. 이걸 관장해주는게 웹서버의 역할이기도 하다. 

정리하자면, 웹서버와 내장서버가 하는 역할이 겹치긴하지만, 따로두는건 보안상의 이유, 로드밸런싱 등으로 이점이 많다.