- 의존성 주입(Dependency Injection) 지원
- AOP(Aspect-Oriented Programming) 지원
- MVC 웹 프레임워크 지원
- JDBC, JPA 연동, 선언적 트랜잭션 처리 등 DB 연동 지원
- 자바 기반 어플리케이션 개발에 필요한 기능 지원
(스케줄링, 메시지 연동, 이메일 발송, 테스트 지원 등)
Maven은 1개의 모듈을 아티팩트라는 단위로 관리하며, 의존 설정 시 pom.xml 파일에 아래와 같은 형식으로 작성한다.
<dependency>
<!-- 불러올 모듈이 속한 패키지-->
<groupId> org.springframework</groupId>
<!-- 불러올 모듈-->
<artifactId>spring-context</artifactId>
<!-- 불러올 모듈의 버전 정보-->
<version>5.0.2.RELEASE</version>
<dependency>
위와 같이 의존 설정을 수행한 후 코드 컴파일 또는 실행 시 Maven 로컬 리포지토리에서 [groupid]\[artifactID]\[version]에 해당하는 폴더 내부에 artifactId-version.jar 형식의 이름을 갖는 파일이 있는지 검사하고, 해당 파일이 존재하면 이 파일을 사용한다.
만약 파일이 없다면 Maven 원격 중앙 리포지토리에서 해당하는 파일을 다운로드하여 로컬 리포지토리에 저장하는 작업을 처음 1번만 수행한다.
Maven에서 의존 설정 대상이 되는 모듈뿐만 아니라 그 모듈이 다시 의존하는 또다른 모듈까지도 의존 대상에 포함하는 것을 의미한다.
src/main/java: java 소스코드 저장 위치src/main/resources: java 소스코드 이외의 파일(xml, property 등) 저장 위치src/main/webapp: 웹 어플리케이션에서의 기준 폴더, 작성했던 JSP 소스코드, WEB-INF, web.xml 파일 등을 저장하는 위치Gradle은 기본 폴더 구조, 프로젝트 생성 방식 모두 Maven과 동일하지만 Maven 프로젝트와는 달리 build.gradle 파일을 작성함으로써 의존 설정을 한다는 점에서 차이가 있다.
/* 프로젝트 빌드 시 gradle java 플러그인 적용 */
apply plugin: 'java'
/* 컴파일 결과의 기준이 될 java 버전과 인코딩 방식 설정*/
sourceCompatibility = 1.8
targetCompatibility = 1.8
compileJava.options.encoding = "UTF-8"
/* 의존 모듈을 다운로드받을 리포지토리 */
repositories {
mavenCentral()
}
/* 사용할 모듈에 관한 의존 설정 */
dependencies {
compile 'org.springframework:spring-context:5.0.2.RELEASE'
}
/* gradle wrapper 사용 설정: 소스 공유 시 gradle 설치 없이도 gradle 명령어 실행 가능*/
task wrapper(type: Wrapper) {
gradleVersion = '4.4'
}
- Bean 객체: Spring이 생성하는 객체
- 컨테이너: Bean 객체의 생성, 초기화, 보관, 제거 등의 객체 관리 기능을 제공하는 패키지
@Configuration
해당 어노테이션이 사용된 클래스를 Spring 설정 클래스로 지정@Bean
getBean() 메서드 실행 시 해당 어노테이션이 사용된 메서드를 통해 생성한 Bean 객체를 Spring이 관리하는 Bean 객체로 등록한다. 그렇게 생성된 Bean 객체는 @Bean이 사용된 메소드 이름으로 참조한다.
/* 생성할 Bean 객체의 클래스 정의 */
public class Greeter {
private String format;
/* greet(): 새로운 문자열 포맷 생성 */
public String greet(String guest) {
return String.format(format, guest);
}
public void setFormat(String format) {
this.format = format;
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppContext {
/* greeter(): Greeter 타입인 Bean 객체 생성 및 초기화*/
@Bean
public Greeter greeter() {
Greeter g = new Greeter();
g.setFormat("%s, Hello World!");
return g;
}
}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
/* AppContext 클래스 내부에서 @Bean 설정 정보를 읽어와 Bean 객체 생성*/
AnnotationConfigApplicationContext ctx
= new AnnotationConfigApplicationContext(AppContext.class);
/* getBean([@Bean의 메서드 이름], [검색할 Bean 객체 타입]) */
Greeter g = ctx.getBean("greeter", Greeter.class);
String msg = g.greet("스프링");
System.out.println(msg);
ctx.close();
}
}
Spring에서 제공하는 아래의 인터페이스들은 공통적으로 Bean 객체의 생성, 초기화, 보관, 제거 등을 관리하기 때문에 Spring은 객체 컨테이너라고 볼 수 있다.

BeanFactory인터페이스: 객체 생성/검색 기능 정의, 객체가 Singleton/Prototype Bean인지 확인하는 기능 제공ApplicationContext인터페이스: BeanFactory 인터페이스의 하위 인터페이스로, 메시지, 프로필, 환경변수 등을 처리하는 기능 정의
아래의 클래스들은 BeanFactory 인터페이스에서 정의된 기능을 최종적으로 구현한 클래스로, 설정 정보로부터 Bean이라고 불리는 객체를 생성하여 그 내부에 저장한다. 그리고 getBean() 메서드 실행 시 해당되는 Bean 객체를 제공하는 기능을 공통적으로 수행한다.
AnnotationConfigApplicationContext: 객체 설정 정보를 java 어노테이션을 사용한 클래스로부터 가져옴GenericXmlApplicationContext: 객체 설정 정보를 xml로부터 가져옴GenericGroovyApplicationContext: Groovy 코드를 이용해 객체 설정 정보를 가져옴