여니의 프로그래밍 study/Spring & Spring Boot

[Spring] 스프링 시작하기 (빌드 관리 도구, 메이븐, 그래들, 빈 객체, 컨테이너)

여니's 2023. 7. 16. 14:13

참고 자료 : 초보 개발자를 위한 스프링5 프로그래밍 입문

해당 게시글은 초보 개발자를 위한 스프링5 프로그래밍 입문

chapter 2 . 스프링 시작하기 내용을 기반으로 작성되었습니다. 


1.빌드 관리 도구

: 메이븐과 그래들은 프로젝트 빌드 관리 도구임.

 

 

빌드란?

> 소스 코드(java 파일)를 실제 실행 가능한 형식으로 만드는 작업임

java 파일을 컴파일해서 class 파일로 변환하고,

resource를 class 파일에서 참조할 수 있는 적절한 위치에 옮기는 등의 과정임

 

Build는 Compile + 그 외 작업

Run은 Build +실행

 

https://eboong.tistory.com/645

 

[Java] 자바 프로그램 실행 과정 및 동작 원리 (feat. JVM)

1. 컴파일이란? (Compile) : 컴파일은 사람이 이해할 수 있는 언어로 작성된 코드를 컴퓨터가 읽을 수 있는 언어(기계어)로 변환하는 과정을 의미한다. 컴파일의 목적은 코드의 구문과 의미를 확인(e

eboong.tistory.com

 

빌드 관리 도구 (Build Tool)란?

> 말그대로 빌드 과정을 도와주는 도구임

빌드 툴의 종류는 Maven , Gradle, Ant 등이 있음

 전처리, 컴파일, 패키징, 테스팅, 배포 기능을 제공함

 


2. 메이븐 (Maven)

> 메이븐은 자바용 프로젝트 관리 도구이고 Ant의 대안으로 나옴

프로젝트, 빌드 순서, 외부 라이브러리 종속성 관계 등의 정보를 pom.xml에 명시함

프로젝트를 진행하며 사용되어지는 수많은 라이브러리를 관리해주는 도구임

라이브러리들과 연관된 라이브러리들까지 모두 연동시켜줌

 

참고로 pom.xml은 정적인 형태의 XML 기반으로 작성되어 동적인 빌드 적용시 어려움이 있음 

(POM의 약자는 Project Object Model)

 

(넥서스는 라이브러리, 프레임워크, 플러그인 및 기타 바이너리 파일등을 저장하는 저장소 관리자 도구임)

 

 

 

 

dependencies

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.2.RELEASE</version>
</dependency>

> 아티팩트에 대한 의존을 추가하는 것은 

일반적인 자바 어플리케이션에서 클래스 패스에 해당 모듈을 추가한다는 것을 뜻한다. 

각 아티팩트의 완전한 이름은 "아티팩트이름-버전.jar"임

 

 

 

따라서 위 설정은 메이븐 프로젝트의 소스 코드를 컴파일하고 실행할 때 사용할 클래스 패스에

spring-context-5.0.2.RELEASE.jar 파일을 추가한다는 것을 의미함.

 

 

 

.jar 파일을 클래스 경로에 추가하는 이유는?

- 애플리케이션이 외부 라이브러리에 엑세스하고 활용할 수 있도록 함

- .jar 파일에 패키지된 자체 클래스 또는 라이브러리를 개발한 경우, 클래스 경로에 추가하면 

사용자 지정 클래스를 로드하고 사용할 수 있음 

-JVM이 요청시 클래스를 찾아 로드할 수 있음

- .jar 파일에는 클래스 외에도 구성 파일, 속성파일, XML 파일 또는 이미지 파일과 같은 다른 리소스도 포함할 수 있음

- 외부 종속성 또는 사용자 지정 라이브러리를 jar 파일로 패키징하면 배포 프로세스가 간소화된다. 

 

 

 

메이븐 로컬 리포지토리 : [사용자홈폴더]\.m2\repository 폴더

실제 아티팩트 파일 위치 : [사용자홈폴더]\.m2\repository\groupId\artifactId\version 폴더

 

 

 

만약 메이븐 로컬 리포지토리에 jar 파일이 존재하지 않으면

프로젝트 폴더로 이동한 뒤 mvn compile 명령을 실행하기

그러면 실제 해당 jar 파일이 필요할 때 원격 리포지토리에서 다운로드함

 

 

 

메이븐 중앙 리포지토리 경로 주소

: http://repo.maven.apache.org

 

 

 

의존 전이 (Transitive Dependencies)

> 메이븐은 의존하는 대상 뿐만 아니라 의존 대상이 다시 의존하는 대상도 함께 다운로드함

 

 

 

메이븐 프로젝트의 폴더 구조

프로젝트폴더명
--- pom.xml
----- src
    ------- main
        --------- java > 자바 소스 코드가 위치하는 폴더
        --------- resources > 자바 소스 이외의 다른 자원 파일 (xml, 프로퍼티 파일 등)
        --------- webapp > 웹 어플리케이션 기준 폴더 (jsp 소스 코드나 web.xml 파일 등)
            ----------- WEB-INF
            ----------- web.xml

2. 그래들 (Gradle)

> Maven과 Ant의 대안으로 나온 빌드, 프로젝트 구성/관리, 테스트, 배포 도구

빌드 속도는 메이븐의 10~100배만큼 빠름

Groovy를 사용해서 동적인 빌드는

Groovy 스크립트로 플러그인을 호출하거나 혹은 직접 코드를 짜면 된다. 

그래들은 build.gradle 파일에 작성함

 

 

 

Groovy란?

> JVM (Java Virtual Machine)에서 실행되는 

동적 객체지향 프로그래밍 언어임

 

 

 

Build.gradle

> 파일 자체가 Project Object(객체)임. 

project Object는 Project 인터페이스를 구현하는 구현체

 

 

가장 대표적인 메서드는

plugins, repositories, dependencies, application 메서드

 

[Build.gradle 기본구조]

plugins {
	id 'java'
}

repositories {
	mavenCentral()
}

dependencies {
	...
}

test {
	...
}

group 'org.example'
version ...

 


3. 스프링은 객체 컨테이너

> 스프링의 핵심 기능은 객체를 생성하고 초기화하는 것임

 

BeanFactory 인터페이스는 객체 생성과 검색에 대한 기능을 정의함

ApplicationContext 인터페이스는 메세지, 프로필/환경변수 등을 처리할 수 있는 기능을 추가로 정의함

 

ApplicationContext는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리해서 컨테이너라고도 부른다.

 


4. 싱글톤 객체

> 단일 객체를 의미하며

스프링은 기본적으로 한 개의 @Bean 어노테이션에 대해

한 개의 빈 객체를 생성한다.

 

 

아래 예시에서는 한 개의 빈 객체를 생성했으므로

G1과 G2는 같은 객체이다.

 


아래 예시에서는 @Bean어노테이션을 이용해서

2개의 빈 객체를 생성했다.

따라서 g1과 g2는 다른 객체이다.