참조한 강의 : 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
- 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
'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 |