Spring

Spring Framework - XML 파일 없이 스프링 설정하기

728x90

참조한 강의 : Spring & Hibernate For Beginners (www.udemy.com/course/spring-hibernate-tutorial/)

 

 

 

이번에 알아볼 내용은 xml 파일을 작성하지 않고, 스프링 설정을 하는 방법에 대해서 알아본다

앞에 포스팅들에서는 xml 파일만 사용하거나, xml 파일 + 어노테이션 을 사용하는 방법으로 만들었다.

그러나 여기선 오로지 자바 코드로만 설정하는 방법을 알아보자.

 

 

- Java Spring Configuration File

방법은 다음과 같다

1. xml 파일을 대신할 스프링 설정용 자바 클래스를 만들고 @Configuration 을 붙여준다.

 

여기선 자바 클래스 파일을 SportConfig.java 라 지었고, 코드를 다음과 같이 작성한다

 

- SportConfig.java

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@ComponentScan("com.luv2code.springdemo")
public class SportConfig {
 
}
cs

 

2. @ComponentScan("패키지이름")

: 이 어노테이션은 어떤 패키지의 Bean 들을 스캔해서 스프링에게 알려줄지를 나타내는 어노테이션이다.

위에서 @Component("com.luv2code.springdemo") 라 했는데,

com.luv2code.springdemo 의 패키지 내부의 모든 bean 들을 스캔한다는 의미가 된다.

 

 

3. 메인 함수에서 스프링 설정 자바 클래스 파일을 로드할 수 있도록 해준다.

여기서 메인 함수가 될 자바 파일을 JavaConfigDemoApp.java 라 이름 붙여줬고, 코드를 다음과 같이 작성해줬다

 

- JavaConfigDemoApp.java

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
public class JavaConfigDemoApp {
 
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SportConfig.class);
        
        Coach theCoach = context.getBean("tennisCoach", Coach.class);
        
        System.out.println(theCoach.getDailyFortune());
        
        System.out.println(theCoach.getDailyWorkout());
        
        context.close();
    }
 
}
cs

 

주의할점은 앞선 예제들과는 다르게 ClassPathXmlApplicationContext 가 아니라

AnnotationConfigApplicationContext 클래스를 사용했다는 것이다.

이는 xml 을 전혀 쓰지 않았기 때문이다.

 

 

4. 사용하려는 bean 찾아내기

: 위의 JavaConfigDemoApp.java 에서 8번줄에 해당하는 코드이다.

앞선 포스팅들과 완전히 똑같은 방식으로 bean 을 찾아낸다.

(TennisCoach.java 는 앞선 포스팅에서 코드 그대로 있으므로 참조 : sdy-study.tistory.com/178)

 

실행해보면, 앞선 포스팅과 똑같은 결과를 보여준다.

 

 

* 빨간글씨의 로그 메시지가 보이지 않을때

: 스프링 5.1 버전이후, 로그 메시지가 더이상 보이지 않게 설정되었다.

그래서 아마 5.1 이후 버전을 쓴다면 아무런 로그 메시지가 보이지 않을 것이다.

해결책은

 

1. logging properties file 을 만든다

- mylogger.properties

root.logger.level=FINE
printed.logger.level=FINE
cs

 

2. logging configuration class 를 만든다

이 클래스의 이름은 MyLoggerConfig.java 라 지정해줬고 (다른 이름도 가능)

코드를 다음과 같이 쓴다

 

- MyLoggerConfig.java

import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
 
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
public class MyLoggerConfig {
    private String rootLoggerLevel;
    private String printedLoggerLevel;
    
    public void setRootLoggerLevel(String rootLoggerLevel) {
        this.rootLoggerLevel = rootLoggerLevel;
    }
    
    public void setPrintedLoggerLevel(String printedLoggerLevel) {
        this.printedLoggerLevel = printedLoggerLevel;
    }
    
    public void initLogger() {
        // parse levels
        Level rootLevel = Level.parse(rootLoggerLevel);
        Level printedLevel = Level.parse(printedLoggerLevel);
        
        // get logger for app context
        Logger applicationContextLogger = Logger.getLogger(AnnotationConfigApplicationContext.class.getName());
        
        // get parent loger
        Logger loggerParent = applicationContextLogger.getParent();
        
        // set root logging level
        loggerParent.setLevel(rootLevel);
        
        // set up console handler
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(printedLevel);
        consoleHandler.setFormatter(new SimpleFormatter());
        
        // add handler to the logger
        loggerParent.addHandler(consoleHandler);
    }
}
 
cs

 

더 자세한 사항은 아래 참조

www.vogella.com/tutorials/Logging/article.html

 

Java Logging API - Tutorial

The Java Logging API, Stuart Dabbs Halloway (JavaPro, June 2002) is another good introduction to the API]

www.vogella.com

 

 

- Defining Spring Bean 

다음은 자바 코드로만 Bean 을 정의하는 방법에 대해 알아보자

 

먼저, 실습을 위해 다음의 두 코드를 만든다

- SwimCoach.java

public class SwimCoach implements Coach {
    
    private FortuneService fortuneService;
    
    public SwimCoach(FortuneService fortuneService) {
        this.fortuneService = fortuneService;
    }
 
    @Override
    public String getDailyWorkout() {
        return "Practice Swim at least 5 hours in a day";
    }
 
    @Override
    public String getDailyFortune() {
        return fortuneService.getFortune();
    }
 
}
cs

 

- SadFortuneService.java

public class SadFortuneService implements FortuneService {
 
    @Override
    public String getFortune() {
        return "Today is so sad day";
    }
 
}
cs

 

그리고 이들을 spring bean 으로 등록하기 위해서는 앞서 만들었던 SportConfig.java 파일에 

아래 같은 코드 방식으로 추가해준다

 

- SportConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@ComponentScan("com.luv2code.springdemo")
public class SportConfig {
    
    // define bean for our sad fortune service
    @Bean
    public FortuneService sadFortuneService() { // method name will be bean id
        return new SadFortuneService();
    }
    
    // define bean for our swim coach and inject dependency
    @Bean
    public Coach swimCoach() {
        return new SwimCoach(sadFortuneService()); 
    }
}
cs

이 코드에서 알 수 있는 것들은 다음과 같다.

1. spring bean 으로 등록하기 위해서는 @Bean 을 써야 한다.

2. 의존성 주입을 위한 코드를 생성자에 매개변수를 넘겨주는 방식으로 사용했다.

3. bean id 는 메소드의 이름이다.

4. bean scope 에 대한 설정을 따로 안했으므로, singleton scope 로 설정되어 있다.

 

위 코드에서 사실 @ComponentScan 은 꼭 해야되는 부분은 아니다

패키지의 모든 bean component 를 스캔하기 때문이다. 

SadFortuneService 와 SwimCoach 이 두개만 처리하고 싶으면 @ComponentScan 부분은 빼도 된다.

 

 

 

- Inject properties value

마지막으로, properties 파일에서 값을 불러와서 사용하는 방법을 알아보자

 

전체적인 과정은 앞에서 했던 xml 파일, 어노테이션 때랑 똑같다

 

1. properties 파일 만들기

-sport.properties

foo.email=test@gmail.com
foo.team=good team
cs

 

2. @PropertySource 어노테이션 사용하기

스프링 설정 파일인 SportConfig.java 에서 @PropertySource 어노테이션을 붙여야 sport.properties 파일이 어디에 위치해있는지 스프링에게 알려줄 수 있다.

 

- SportConfig.java

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
 
@Configuration
@ComponentScan("com.luv2code.springdemo")
@PropertySource("classpath:sport.properties")
public class SportConfig {
    /*
        중간 생략
    */
}
cs

 

 

3. @Value 어노테이션을 써서 값 불러오기

 

- SwimCoach.java

import org.springframework.beans.factory.annotation.Value;
 
public class SwimCoach implements Coach {
    
    /*
        나머지 부분 생략
    */    
            
    @Value("${foo.email}")
    private String email;
 
    @Value("${foo.team}")
    private String team;
    
    public String getEmail() {
        return email;
    }
 
    public String getTeam() {
        return team;
    }
 
}
cs

 

실행시 다음과 같이 정상적으로 나옴을 볼 수 있다.

 

 

지금까지 xml 파일 없이 자바 코드로만 스프링 설정하는 방법을 알아 보았다.

다음은, spring MVC 에 대해서 알아본다.

 

 

 

 

- References)

1. Java Logging API : www.vogella.com/tutorials/Logging/article.html

 

 

 

 

728x90

'Spring' 카테고리의 다른 글

Spring Framework - MVC 코드 예제  (0) 2021.01.27
Spring Framework - Spring MVC Overview  (0) 2021.01.27
Spring Framework - Annotation  (0) 2021.01.20
Spring Framework - Bean Scope, Life Cycle  (0) 2021.01.19
Spring Framework - Dependency Injection  (0) 2021.01.18