본문 바로가기
개발/SpringBoot

[SpringBoot5] Ch02) 스프링 컨테이너 & Maven과 Gradle 비교

by 반비🥰 2024. 5. 21.
반응형

 

본 포스팅은 "초보 웹 개발자를 위한 스프링 5 프로그래밍 입문" 책을 공부하고 정리한 내용입니다.

 

📌  Maven과 Gradle


1) Maven(메이븐)

Maven은 자바 프로젝트를 위한 빌드 자동화 도구이다.

Maven 프로젝트에서 핵심은 pom.xml 파일로, 프로젝트에 대한 설정 정보를 관리하는 파일이다. 또한, 프로젝트에서 필요로 하는 의존 모듈이나 플러그인 등에 대한 설정을 담는다.

 

[ Maven 프로젝트의 기본 디렉토리 구조 ]

 

  • src/main/java : 자바 소스파일 위치
  • src/main/resources : 프로퍼티나 XML 등 리소스파일 위치
  • src/test/webapp : 웹 어플리케이션 관련 파일 위치(WEB-INF 폴더 및 JSP 파일 등 위치)
  • src/test/java : 테스트 자바 파일 위치
  • src/test/resources : 테스트 과정에 사용되는 리소스 파일 위치

[ POM.xml 파일 기본 ]

POM.xml 파일은 Project Object Model 정보를 담고 있는 파일이다.

  • 프로젝트 정보 : 프로젝트의 이름, 개발 자 목록, 라이센스 등의 정보를 기술
  • 빌드 설정 : 소스, 리소스, 라이프 사이클별 실행할 플러그인 등 빌드와 관련 설정
  • 빌드 환경 : 사용자 환경별로 달라질 수 있는 프로파일 정보를 기술
  • POM 연관 정보 : 의존 프로젝트(모듈), 상위 프로렉트, 포함하고 있는 하위 모듈 등을 기술

 

[ 의존 설정 ]

<dependency> 부분의 설정은 Maven을 사용하지 않을 경우, 코드에서 필요로 하는 라이브러리뿐만 아니라 그 라이브러리가 필요로 하는 또 다른 라이브러리도 직접 찾아서 설정해주어야 한다.

 

 하지만, Maven에서 직접 사용하는 모듈에 대한 의존성만 추가해 주면 된다.

<dependency>
	<groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.2.1</version>
</dependency>

 

따라서 개발자가 필요한 모듈을 다운로드할 필요가 없이 직접 필요로하는 모듈만 <dependency>로 등록하면 된다.

 

[ 의존의 scope : compile, runtime, provided, test ]

pom.xml 파일에서 <scope>를 포함하고 있는 것은 의존하는 모듈이 사용되는 시기를 설정한 것이다.

<scope>안에 들어가는 값은 총 4가지이다.

  • compile : 컴파일할 때 필요, <scope>의 default값
  • runtime : 런타임에 필요, 코드를 컴파일할 때는 필요하지 않지만 실행할 때 필요(배포시 포함)
  • provided : 컴파일할 때 필요, 하지만 런타임할 때는 기본으로 제공되는 모듈 (배포시 제외)
  • test : 테스트 코드 컴파일할 때 필요, Mock테스트를 위한 모듈 (배포시 제외)

[ Maven 라이프사이클(LifeCycle)과 플러그인 실행 ]

Maven은 프로젝트의 빌드 라이프사이클 크게 clean, build(default), site 3가지 제공한다.

각 라이프사이클은 순서를 갖는 단계(phase)로 구성되며, 각 단계별로 실행할 플러그인(plugin) 골(goal)이 정의되어 알맞은 작업을 실행한다.

단계 설명 단계에 묶인 플러그인 실행
generate-source 컴파일 과정에 포함될 소스 생성  
process-sources 필터와 같은 작업을 소스코드에 처리  
generate-resources 패키지에 포함할 자원을 생성  
process-resources 필터와 같은 작업을 자원 파일에 처리하고, 자원 파일을 클래스 출력 폴더에 복사 resources:resources
compile 소스 코드를 컴파일해서 클래스 출력 폴더에 클래스를 생성 compiler:compile
generate-test-sources 테스트 소스 코드 생성  
processs-test-sources 필터와 같은 작업을 테스트 소스 코드에 처리 resources:testResources
generate-test-resources 테스트를 위한 자원 파일을 생성  
process-test-resources 필터와 같은 작업을 테스트 자원 파일에 처리하고 테스트 자원 파일을 테스트 클래스 출력 폴더에 복사  
test-compile 테스트 소스 코드를 컴파일해서 테스트 클래스 출력 폴더에 클래스를 생성 compiler:testCompile
test 테스트를 실행 surefire:test
package 컴파일 한 코드와 자원 파일들을 jar, war와 같은 배포 형식으로 패키징 패키징에 따라 다름
jar : jar:jar
war : war:war
install 로컬 리포지토리에 패키지를 복사 install:install
depoly 생성한 패키지 파일을 원격 리포지토리에 등록하여, 다른 프로젝트에서 사용할 수 있도록 함 deploy:deploy

 

특정 단계를 실행하려면 mvn [단계이름] 명령어를 실행하면 되고, 특정 단계를 실행하면 그 단계의 앞에 위치한 모든 단계를 실행한다.

 

2) Gradle(그레이들)

Gradle은 그루비(Groovy)를 이용한 빌드 자동화 시스템으로, 프로젝트 생성 과정은 Maven과 유사하다. 

Gradle은 POM.xml 대신 build.gradle 파일을 생성하여 java 플러그인들을 관리한다.

 

build.gradle 파일에서 gradle wrapper 설정을 해주면 그레이들 설치없이 그레이들 명령어를 실행할 수 있다.

빌드 속도가 Maven에 비해 10 ~ 100배가량 빠름

 

[ Gradle 빌드 단계 ]

  • 초기화
    빌드 환경을 설정하고 빌드에 참여할 프로젝트 결정
  • 구성
    빌드에 대한 태스크 그래프를 구성하고 설정, 태스크 순서 설정
  • 실행
    선택된 태스크들을 구성 단계의 마지막에 실행

3) Maven과 Gradle 비교

Maven은 pom.xml 파일을 통해 플러그인을 관리하고, Gradle은 build.gradle 파일을 통해 관리한다.

스크립트 가독성은 grdle이 더 좋으며, 빌드와 테스트 결과가 gradle이 더 빠르다.

 

 

📌 객체 컨테이너(Object Container)


스프링의 핵심 기능은 객체를 생성하고 초기화하는 것으로 ApplicationContext라는 인터페이스에 해당 기능이 정의되어 있다.

 

스프링의 각 구현 클래스는 설정 정보로부터 빈(Bean)이라고 불리는 객체를 생성하고 그 객체를 내부에 보관하고, get() 메서드를 통해 해당 빈 객체를 제공한다. ApplicationContext나 BeanFactory는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하고 있어 컨테이너(Container)라고 부르며 스프링 컨테이너라고 표현한다.

 

[ 스프링 컨테이너의 빈 객체 관리 ]

스프링 컨테이너는 내부적으로 빈 객체와 빈 이름을 연결하는 정보를 가지고 있으며, 이름과 실제 객체의 관계뿐만 아니라 실제 객체의 생성, 초기화, 의존 주입 등 객체 관리를 위한 다양한 기능을 제공한다.

 

[ 싱글톤(Singleton) 객체 ]

싱글톤은 단일 객체(single object)를 의미하는 단어로서 스프링은 기본적으로 한 개의 @Bean 어노테이션에 대한 한 개의 빈 객체를 생성한다. 메모리 절약을 위해, 인스턴스가 필요할 때 같은 인스턴스를 반환하는 기법이다.

Greeter g1 = ctx.getBean("greeter", Greeter.class);
Greeter g2 = ctx.getBean("greeter", Greeter.class);

위의 경우, getBean()메서드가 같은 객체를 리턴한다.

 

 

참고 사이트

https://jisooo.tistory.com/entry/Spring-빌드-관리-도구-Maven과-Gradle-비교하기

https://inpa.tistory.com/entry/GOF-💠-싱글톤Singleton-패턴-꼼꼼하게-알아보자#

 

반응형