스프링 시작하기

HeeSeong·2021년 7월 24일
1
post-thumbnail

스프링 시작하기


Greeter.java

package chap02;

public class Greeter {
    private String format;

    public String greet(String guest) {
        return String.format(format, guest);
    }

    public void setFormat(String format) {
        this.format = format;
    }
}

Greeter 클래스의 greet() 메서드는 String의 문자열 포맷을 이용해서 새로운 문자열을 생성한다.
greet() 메서드에서 사용할 문자열 포맷은 setFormat() 메서드를 이용해서 설정하도록 구현했다.


AppContext.java

package chap02;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppContext {
    
    @Bean
    public Greeter greeter() {
        Greeter g = new Greeter();
        g.setFormat("%s, 안녕하세요!");
        return g;
    }
}

@Configuration 어노테이션은 해당 클래스(AppContext)를 스프링 설정 클래스로 지정한다.
스프링은 객체를 생성하고 초기화하는 기능을 제공한다. @Bean 이하의 코드가 한 개의 객체를 생성하고 초기화하는 설정을 담고있다. 스프링이 생성하는 객체를 빈(Bean) 객체라고 부르는데, 이 빈 객체에 대한 정보를 담고있는 메서드가 greet() 메서드이다.

@Bean 어노테이션이 붙으면 해당 메서드가 생성한 객체를 스프링이 관리하는 빈 객체로 등록한다.
Bean 어노테이션을 붙인 메서드의 이름은 빈 객체를 구분할 때 사용한다. 빈 객체를 참조할 때 greeter라는 이름을 사용하는 것이다. Bean 어노테이션을 붙인 메서드는 객체를 생성하고 알맞게 초기화 해야한다.


Main.java

package chap02;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
        // 첫번째 파라미터는 메서드 이름인 빈 객체의 이름, 두번째는 검색할 빈 객체의 타입
        Greeter g = ctx.getBean("greeter", Greeter.class);
        // Greeter 객체의 greet 메서드를 실행
        String msg = g.greet("스프링");
        System.out.println(msg);
        ctx.close();
    }
}

AnnotationConfigApplicationContext는 자바 설정에서 정보를 읽어와 빈 객체를 생성, 관리한다.
AnnotationConfigApplicationContext는 AppContext에 정의한 @Bean 설정 정보를 읽어와 Greeter 객체를 생성, 초기화한다. getBean() 메서드는 AnnotationConfigApplicationContext가 생성한 빈 객체를 검색할 때 사용된다. 여기서 getBean() 메서드는 greeter() 메서드가 생성한 Greeter 객체를 리턴하게 된다.

AppContext 설정으로 생성한 Greeter 객체의 format 필드의 값은 "%s, 안녕하세요!"가 된다.
따라서 g.greet("스프링") 코드는 다음과 같은 결과이다.

String.format("%s, 안녕하세요!", "스프링") // "스프링, 안녕하세요!"

스프링은 객체 컨테이너


스프링의 핵심 기능인 객체를 생성하고 초기화하는 관련 기능은 ApplicationContext라는 인터페이스에 정의되어 있다. AnnotationConfigApplicationContext 클래스는 이 인터페이스를 알맞게 구현한 클래스 중 하나다. AnnotationConfigApplicationContext 클래스는 자바 클래스에서 정보를 읽어와 객체 생성과 초기화를 수행한다. XML, Groovy 설정 코드를 이용한 객체 생성, 초기화 수행 클래스도 존재한다.

BeanFactory 인터페이스는 객체 생성과 검색에 대한 기능을 정의한다. (객체를 검색하는 것 이외에 싱글톤/프로토타입 빈인지 확인하는 기능도 제공)

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

계층도의 제일 아래에 위치한 세개의 클래스는 BeanFactory와 ApplicationContext에 정의된 기능의 구현을 제공한다.

  • AnnotationConfigApplicationContext : 자바 어노테이션을 이용한 클래스로부터 객체 설정 정보를 가져온다.

  • GenericXmlApplicationContext : XML로 부터 객체 설정 정보를 가져온다.

  • GenericGroovyApplicationContext : 그루비 코드를 이용해 설정 정보를 가져온다.


Groovy

JVM에서 실행되는 스크립트 언어. 문법이 JAVA와 유사하다.
그루비 소스는 컴파일하면 자바 클래스가 만들어진다.


각 구현 클래스는 설정 정보로부터 빈이라고 불리는 객체를 생성하고 그 객체를 내부에 보관한다. ApplicationContext(BeanFactory)는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하고 있어서 컨테이너(Container)라고도 부른다. 이것이 스프링 컨테이너이다.

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


싱글톤 객체

package chap02;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = 
				new AnnotationConfigApplicationContext(AppContext.class);
		Greeter g1 = ctx.getBean("greeter", Greeter.class);
		Greeter g2 = ctx.getBean("greeter", Greeter.class);
		System.out.println("(g1 == g2) = " + (g1 == g2)); // true
		ctx.close();
	}
}

(g1 == g2)의 결과가 true라는 것은 g1과 g2가 같은 객체라는 것을 의미한다. 별도 설정을 하지 않을 경우 스프링은 한 개의 빈 객체만을 생성하며, 이때 빈 객체는 싱글톤(Singleton) 범위를 갖는다. 싱글톤은 단일 객체를 의미하는 단어로서 스프링은 기본적으로 한 개의 @Bean 어노테이션에 대해 한 개의 빈 객체를 생성한다.



profile
끊임없이 성장하고 싶은 개발자

0개의 댓글