으나님의 잡다한 개발상식
[Spring] Maven? 빌드 도구란? 본문
스프링 프로젝트를 경험해봤지만 Maven이 정확히 뭔지 몰랐던 것 같아 정리해보기로 했다.
빌드 도구란?
빌드 도구를 알기 위해서는 먼저 '빌드'가 뭘 의미하는지부터 알아야 한다.
빌드란 소스코드 파일들을 컴퓨터에서 실행할 수 있는 소프트웨어로 변환하는 일련의 과정으로, 컴파일, 테스팅, 배포 등 모든 과정의 집합이다.
빌드 도구는 이러한 빌드 과정을 자동으로 수행해주는 도구를 의미한다.
자바 빌드 도구에는 Ant, Maven, Gradle 등이 있다.
아래는 빌드 툴의 역사에 대해 잘 설명된 블로그의 글 링크이다!
https://starrykss.tistory.com/276
Maven을 사용하는 이유?
스프링이 나온 초기, 자바 빌드 도구가 없을 때는 웹 프로젝트를 생성한 후 직접 스프링 기능에 필요한 라이브러리를 다운로드하여 사용했었다.
하지만 스프링 버전이 자주 업데이트됨에 따라 불편함이 따랐다.
업데이트할 때마다 관련 기능의 라이브러리를 일일이 수정해야 했고, 라이브러리의 기능 사용법이 달라지면 소스도 같이 수정해주어야 했기 때문이다.
Maven 이전에 사용되었던 빌드 도구인 Ant는 빌드 도구로만 이용이 되었는데, 빌드 + 자동 라이브러리 관리 기능이 추가된 Maven이 등장하게 된다.
Maven은 라이브러리를 자동으로 추가 및 관리해주고, 라이브러리 버전을 자동으로 동기화해준다.
나같은 경우 이전에 스프링 프로젝트를 진행할 때 maven을 사용하긴 했지만 maven에서 지원하지 않는 것도 있었다.
그런 라이브러리들은 WEB-INF 폴더 내에 'lib'라는 폴더를 따로 만들어 그 안에 다운 받은 라이브러리 jar 파일을 추가하여 관리했었다.
아마 메이븐같은 자바 빌드 도구를 사용하지 않으면 프로젝트에 사용할 모든 라이브러리를 다운받아서 lib 폴더 내에 넣었을 것이다.
Maven 이후에 Gradle이 나왔는데, 요즘은 Gradle로 넘어가는 추세인 것 같다.
Gradle은 안드로이드 앱을 만들 때 필요한 공식 빌드시스템이다.
Gradle의 공식 문서에 따르면 그레이들이 메이븐보다 최대 100배 빠르다고 한다.
아래는 메이븐과 그레이들을 잘 비교한 블로그 글이다!
https://hyojun123.github.io/2019/04/18/gradleAndMaven/
Maven 사용하는 방법
자바 프로젝트의 빌드 툴로 maven을 설정했다면, 프로젝트 최상위 디렉토리에 'pom.xml'이라는 파일이 생성된다.
pom.xml은
1) 프로젝트의 전반적인 정보를 태그를 이용해 나타낸다.
2) <dependenceise> 태그를 이용해 해당 프로젝트가 의존하는 여러 가지 라이브러리를 설정한다.
3) <build> 태그를 이용해 빌드와 관련된 정보를 설정할 수 있다.
아래 내용은 STS로 Spring legacy project를 만들었을 때 생성되는 pom.xml 중 일부이다.
1) 프로젝트의 전반적인 정보를 나타내는 부분을 살펴보자.
<?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.euna</groupId>
<artifactId>board</artifactId>
<name>SpringProject</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
- <modelVersion> : maven의 pom.xml의 모델 버전이다. 여기서는 형식이 4.0.0 버전이라고 이해하면 된다.
- <groupId> : 프로젝트 그룹 id를 나타내며 일반적으로 도메인 이름을 사용해 설정한다. 나는 처음에 com.euna.board으로 패키지를 만들어서 'com.euna'로 들어가 있다.
※ 참고로 패키지명은 보통 도메인 이름을 역순으로 쓰는 경우가 많다고 한다. ex) com.naver.npay
- <artifactId> : 프로젝트 아티팩트 id를 설정한다. 대개는 패키지 이름으로 설정한다. 나는 처음에 com.euna.board으로 패키지를 만들어서 'board'로 들어가 있다.
- <name> : 해당 프로젝트의 명이다. 나는 처음에 'SpringProject'라는 이름으로 Spring legacy project를 만들었다.
- <packaging> : 애플리케이션 배포 시 패키징 타입을 설정한다. 이 경우는 war로 패키징된다. 그 외에 jar, ear, pom 등으로 패키지 유형을 설정할 수 있다.
- <version> : 프로젝트의 버전을 설정한다. 접미사로 SNAPSHOT이 붙으면 아직 개발단계라는 의미이며, 메이븐에서 라이브러리를 관리하는 방식이 다르다고 한다.
- <properties> : pom.xml에서 중복해서 사용되는 설정(상수) 값들을 지정해놓는 부분. 다른 위치에서 ${...}로 표기해서 사용할 수 있다. 여기에서는 자바 버전은 1.6(즉 jdk가 1.6버전이란 뜻이다), 스프링 버전은 3.1.1로 되어있다.
2) 라이브러리를 설정하는 <dependencies> 태그 하위 내용 중 일부를 살펴보자.
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
- <dependency> : 해당 프로젝트에서 의존하는 다른 라이브러리 정보를 기술한다.
- <groupId> : 의존하는 프로젝트 그룹의 id이다.
- <artifactId> : 의존하는 프로젝트의 artifactId이다.
- <version> : 의존하는 프로젝트의 버전 정보이다. 여기서는 <properties>에 이미 서술된 스프링 버전의 값을 가져왔다.
라이브러리를 추가할 일이 있으면 <dependencies> 태그 내에 추가하면 된다.
- 먼저 https://mvnrepository.com/에 들어가서 내가 찾는 라이브러리가 maven에서 지원이 되는지 검색해서 확인한다.
- 버전을 선택하면 나오는 텍스트를 복사해서 pom.xml <dependencise> 태그 내에 추가한다.
- 만약에 maven에서 지원하는 라이브러리가 아니라면.. 따로 jar파일을 찾아서 다운로드를 받아서 추가해야 한다.
3) 빌드와 관련된 정보를 설정하는 <build> 태그를 살펴보자.
<bulid> 태그 내에는 빌드를 할 때 사용할 플러그인 목록을 기록한다.
<plugin> : 어떠한 액션 하나를 담당하는 것으로 가장 중요하지만 들어가는 옵션은 제 각각이다.
<build> 부분 및 maven 구조에 대해 잘 정리된 블로그 글이 있어 링크를 남긴다.
https://jeong-pro.tistory.com/168
(!!!!!!!!!!)
이 글의 글쓴이는 초보 개발자로 글 내용이 부족하거나 오류가 있을 수 있습니다.
부족한 점이나 오류가 있다면 댓글로 알려주시면 감사하겠습니다 :)
저뿐만 아니라 혹시나 이 글을 보게 될 다른 초보 개발자 분들에게도 도움이 될 것입니다!
또한, 의견이 있으시거나, 글 내용이 유익했다면 댓글을 남겨주시면 감사하겠습니다.
즐코하세여~
'Spring' 카테고리의 다른 글
[Spring] 게시판 만들기_2. 개발환경 세팅 (1) | 2020.07.11 |
---|---|
[Spring] 게시판 만들기_1. 프로젝트 생성 (0) | 2020.07.10 |