본문 바로가기
Spring

[Spring] Spring Bean 설정 방법 - XML Config

by dbjh 2019. 12. 10.
반응형

 Spring의 Bean 설정 방법을 알아보도록 하자. 예전에는 XML Config 방식을 사용하였지만 최근에 와서는 Java Config 방식을 사용한다. 각 설정 방식을 보고 Bean이 등록되는 방법을 알아보자.

Bean 설정 실습을 위해 폴더경로 및 BookService와 BookRepository 클래스를 생성하도록 하자.

폴더 및 파일구조

BookService

package com.example.demo;

import org.springframework.stereotype.Component;

public class BookService {

    BookRepository bookRepository;
    
    public void setBookRepository(BookRepository bookRepository){
        this.bookRepository = bookRepository;
    }
}

BookRepository

package com.example.demo;

public class BookRepository {
}

 

1. 순수 XML Bean 태그를 사용한 설정

resources 디렉토리하위에 application.xml 파일을 생성 후 아래와 같이입력한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bookService" class="com.example.demo.BookService">
        <property name="bookRepository" ref="bookRepository"/>
    </bean>

    <bean id="bookRepository" class="com.example.demo.BookRepository"/>

</beans>

<bean> 내부의 설정 값들에 대해 알아보자

id : 자바 네이밍 규칙과 동일하게 맞춰서 bookService로 입력하면되고, 태그의 고유키로 사용한다.

class : 해당빈의 Type 즉 클래스를 말하며 경로 및 클래스명 까지 입력해줘야한다.

scope : 해당 빈의 생성 주기를 말한다. prototype은 매번 해당 객체를 새로 생성해서 쓰는 것, request는 HttpRequest가 있을때 마다 생성, session은 Httpsession이 있을때 마다 생성, 그리고 단한번만 생성하여 사용하는 singleton이 있다. 설정을 하지 않으면 기본적으로 singleton으로 생성된다.

autowired : 기본적으로 타입과 이름, 생성자 등이 있다.

BookService에서 BookRepository를 주입받으려면 <property> 태그를 사용하여 주입하도록 하면된다. <property>태그 안에는 설정 값이 nameref가 있는데 name은 BookService에서 setBookRepository()메소드를 사용 하는데, 메소드 이름에서 set 뒤에 값을 말하는 것이다. 또한 필드명을 bookRepository로 설정하고 @Autowired 어노테이션을 붙여도 된다. refid가 bookRepository인 밑에 적힌 <bean> 태그를 가르킨다. 결국 XML 설정파일에따라 BookService 빈과 BookRepository 빈이 모두 생성되는데 BookService에서 사용할 bookRepository에 BookRepository 빈이 주입된다.

Xml Config를 설정한 후 main 메소드에 아래와 같이 코드를 작성하여 의존성주입이 제대로 되었는지 확인해 보자. 

package com.example.demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Arrays;

public class DemoApplication {
    public static void main(String[] args) {

        //ApplicationContext : Bean을 관리하는 IOC 컨테이너
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        String[] beanNames = context.getBeanDefinitionNames();
        // IOC 컨테이너에 등록된 Bean들의 이름 출력
        System.out.println(Arrays.toString(beanNames));
        // XML Config 파일에 설정해둔 것처럼 BookService에 BookRepository가 주입되었는지 확인
        BookService bookService = (BookService)context.getBean("bookService");
        // BookService 필드인 bookRepository 객체가 null 인지 확인
        System.out.println(bookService.bookRepository != null);

    }
}

 

빈생성 및 의존 주입이 잘된 결과

문제 없이 주입이 되어서 BookSerivce 안에 BookRepository 객체가 생성된 것을 확인할 수 있다.

만약 실행하였는데, 오류가 난다면 Project Rebuild 후에 재시도해보자. 

하지만 위와 같은 경우 xml 파일에 일일이 Bean 설정을 해줘야 하는 번거로움이 있다. 그래서 XML Config를 좀더 효율적으로 사용할 수 있게 제공해주는 방식을 사용해보자. 


2. Component-scan 및 어노테이션을 사용한 설정

바로 context의 component-scan을 사용한 방법이다. base-package에 명시해둔 디렉토리 부터 하위에 있는 파일 및 디렉토리를 스캔하여 Bean으로 설정되어있는 Class를 찾아서 Bean으로 등록해준다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.example.demo"/>

</beans>

 

이 경우에는 기본적으로 @Component라는 어노테이션을 Bean으로 만들고 싶은 Class 위에 명시해줌으로써 등록할 수 있다. 하지만 @Component 어노테이션을 바로 사용하지 않고 이를 확장하여 Class의 기능을 조금더 명확히 구분지은 어노테이션을 사용하도록하자. 바로 @Service@Repository 어노테이션이다. 

만들어두었던 BookService와 BookRepository에 해당 어노테이션들을 명시하도록하자.

BookService

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookService {

    @Autowired
    BookRepository bookRepository;

    public void setBookRepository(BookRepository bookRepository){
        this.bookRepository = bookRepository;
    }
}

클래스위에 @Service 어노테이션을 명시해주면 Bean으로는 등록이 된다. 하지만 내부 필드에는 의존성 주입이 되지 않기 때문에 객체를 주입해주고 싶은 필드가 있다면 그 위에 @Autowired 어노테이션을 명시해준다. 주입하고 싶은 객체는 반드시 Bean으로 등록이 되어있어야 한다.

BookRepository

package com.example.demo;

import org.springframework.stereotype.Repository;

@Repository
public class BookRepository {
}

 

설정을 모두해준 후 다시 어플리케이션을 실행하면 , 

component-scan을 이용하여 빈생성 및 의존성 주입이 잘된 결과

위와 같이 빈생성 및 의존성 주입이 잘된 결과를 확인할 수 있다.

Annotation을 스캐닝하여 빈등록 및 설정방식은 Spring 2.5 부터 제공된 기능이다.

 

내용 출처

 

반응형

댓글