Chapter 01~02 - Spring 시작하기

이현빈·2024년 3월 14일

1. Spring Framework의 주요 특징

  • 의존성 주입(Dependency Injection) 지원
  • AOP(Aspect-Oriented Programming) 지원
  • MVC 웹 프레임워크 지원
  • JDBC, JPA 연동, 선언적 트랜잭션 처리 등 DB 연동 지원
  • 자바 기반 어플리케이션 개발에 필요한 기능 지원
    (스케줄링, 메시지 연동, 이메일 발송, 테스트 지원 등)

2. Maven 프로젝트

Maven 의존 설정

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번만 수행한다.

의존 전이(Transitive Dependencies)

Maven에서 의존 설정 대상이 되는 모듈뿐만 아니라 그 모듈이 다시 의존하는 또다른 모듈까지도 의존 대상에 포함하는 것을 의미한다.

Maven 기본 폴더 구조

  • src/main/java: java 소스코드 저장 위치
  • src/main/resources: java 소스코드 이외의 파일(xml, property 등) 저장 위치
  • src/main/webapp: 웹 어플리케이션에서의 기준 폴더, 작성했던 JSP 소스코드, WEB-INF, web.xml 파일 등을 저장하는 위치

3. Gradle 프로젝트

Maven과의 비교

Gradle은 기본 폴더 구조, 프로젝트 생성 방식 모두 Maven과 동일하지만 Maven 프로젝트와는 달리 build.gradle 파일을 작성함으로써 의존 설정을 한다는 점에서 차이가 있다.

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'
}

4. Spring = 객체 컨테이너

주요 용어 정리

  • Bean 객체: Spring이 생성하는 객체
  • 컨테이너: Bean 객체의 생성, 초기화, 보관, 제거 등의 객체 관리 기능을 제공하는 패키지

@Configuration, @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에서 제공하는 아래의 인터페이스들은 공통적으로 Bean 객체의 생성, 초기화, 보관, 제거 등을 관리하기 때문에 Spring은 객체 컨테이너라고 볼 수 있다.

  • BeanFactory 인터페이스: 객체 생성/검색 기능 정의, 객체가 Singleton/Prototype Bean인지 확인하는 기능 제공
  • ApplicationContext 인터페이스: BeanFactory 인터페이스의 하위 인터페이스로, 메시지, 프로필, 환경변수 등을 처리하는 기능 정의

Spring의 객체 생성/초기화 기능 구현 클래스

아래의 클래스들은 BeanFactory 인터페이스에서 정의된 기능을 최종적으로 구현한 클래스로, 설정 정보로부터 Bean이라고 불리는 객체를 생성하여 그 내부에 저장한다. 그리고 getBean() 메서드 실행 시 해당되는 Bean 객체를 제공하는 기능을 공통적으로 수행한다.

  • AnnotationConfigApplicationContext : 객체 설정 정보를 java 어노테이션을 사용한 클래스로부터 가져옴
  • GenericXmlApplicationContext : 객체 설정 정보를 xml로부터 가져옴
  • GenericGroovyApplicationContext : Groovy 코드를 이용해 객체 설정 정보를 가져옴

싱글톤(Singleton) 객체

  • 싱글톤이란 단위 객체를 뜻하며, Spring에서는 별도 설정이 없을 경우, 기본적으로 1개의 @Bean 어노테이션에 관해 1개의 Bean 객체를 생성한다.

Reference

  • 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문(최범균)

0개의 댓글