본문 바로가기

JAVA/Spring Boot

스프링부트에서 스프링

반응형

초기 스프링 프레임워크는 XML 구성파일에 지나치게 의존했다.

자바 5 출시 이후 자바클래스(애노테이션)로도 구성할 길이 열리면서 @Configuration(클래스에 선언) 및 @Bean(빈 인스턴스에 선언)으로 스프링 컨테이너를 구성하게 되었다.

스프링 부트 역시 마찬가지로 XML파일이나 애노테이션으로 가능하다.


XML 구성하기

XML구성 파일이 여러 있으면 메인 애플리케이션에서 애노테이션 하나로 합칠수가 있다.

각 XML 구성파일의 경로와 이름을 org.springframework.context.annotaion.ImportResource 애노테이션에 String 배열 형태로 넘기면된다.


@ImportResouce는 스프링 3버전 이후로 지금껏 달라진게 없다.

스프링 부트 앱에서는 리소스를 더 쉽게 임포트할 수 있다.

@ImportResource({"META-INF/spring/services-context.xml", "META-INF/spring/repositories-context.xml"})

@SpringBootApplication

public class SpringXmlApplication {

@Autowired

TaskRepository task;


@Autowired

ServiceFacade service;


// 다른로직

}


기존 메인 스프링 부트 앱의 XML 구성파일(자바구성 클래스)을 위 코드처럼 쓰면된다.

@ImportResource("classpath:applicationContext.xml")

@Configuration

public class SimpleConfiguration {

@Autowired

Connection connection; //applicationContext.xml 파일에서 가져온다.


@Bean

Database getDatabaseConnection(){

return connection.getDBConnection();

}


//이하 생략

}

위코드는 기존 자바 구성 클래스에서 XML 구성파일을 재사용하는 방법이다.


main 메소드에서 XML 파일을 불러올 수도 있다.

public class Application {

public static void main(String[] args) {

ConfigurableApplicationContext ctx = new SpringApplication("/MEATA-INF/spring/integration.xml").run(args);


System.out.println("엔터키를 누르면 종료합니다");


System.in.read();

ctx.close();

}

}

통합 빈을 모두 백그라운드로 작동시키는 스프링 통합 기술과 관련 있다.


단독형 스프링 앱과 스프링 부트 앱

모든 앱이 웹 애플리케이션은 아니다.

스프링 앱을 서버 없이 단독형(standalone) 모드로, 즉 운영체제의 일반 서비스나 잡(job) 형태로 실행하고 끝내고 싶은 경우도 있다.

main메서드에서 실행한다.

public static void main(final String[] args){

final ApplicationContext context = new ClassPathXmlApplicationContext("MEATA-INF/spring/app-ctx.xml");

final Service service = context.getBean(ServiceFacade.class);


//프로세스 실행

//추가작업 실행

}

기존 스프링에서는 ApplicationContext 인터페이스와 ClassPathXmlApplicationContext 클래스로 빈을 로딩하고 컨테이너를 초기화 한다음 getBean 메소드로 빈을 꺼내 특정 프로세스를 수행하거나 어떤 함수를 호출해 원하는 작업을 수행한다.

스프링 부트는 조금 다르다.

스프링 부트를 실행하고 나서 코드를 실행하고 싶은 경우

@SpringBootApplication

public MyApplication implements CommandLineRunner {

public void run(String... args){

//SpringApplication.run(..) 직후에 실행됨

}

public static void main(String[] args) {

SpringApplication.run(MyApplication.class, args);

}

}

org.springframework.boot.CommandLineRunner 인터페이스의 run(String... args) 메소드를 구현해서 SpringApplication.run 메소드를 호출한 이후 특정 프로세스 또는 잡을 실행한다.

앱관련 알림 메시지를 보내거나 앱이 실행되기 전에 SQL문을 날려 DB 레코드를 수정하는 등 원하는 작업 또는 서비스를 수행할 때 좋은 방법이다.

이 코드는 웹 애플리케이션의 아니라 단독형 앱이다.


이 코드도 결과는 같다

@Bean

public CommandLineRunner runner() {

return new CommandLineRunner() {

public void run(String... args){

//프로세스 실행

}

};

}

메서드에 @Bean을 붙여 CommandLineRunner 인터페이스를 하나의 빈처럼 사용했다.

따라서 자바8의 람다 표현식으로 하면

@Bean

public CommandLineRunner runner(Repository repo) {

return args -> {

//프로세스 실행

};

}

메소드 파라미터로 전달한 Repository 객체는 보통 DB 작업용으로 쓰인다.


CommandLineRunner보다 먼저 실행해야 할 코드가 있다면

InitializingBean 인터페이스를 반환한다.


@Bean

InitializingBean saveData(Repository repo){

return () -> {

//DB 데이터 삽입

};


예를 들어 어떤 DB작업을 하려면 먼저 DB에 접속해야한다.

단위 테스트를 할 때도 이런 사전 작업이 필요하다.


스프링 부트에서 스프링 기술 활용

스프링부트는 결국 스프링이고 XML 파일이나 자바 구성 클래스에서 선언한 스프링 빈을 자유롭게 사용할 수 있다.

스프링 JMS, 스프링 AMQP, 스프링 통합, 스프링 캐싱, 스프링 세션, 스프링 REST 등 다른 스프링 기술은 스프링 부트에서 쓸수 있다.


스프링 프레임워크 4 버전부터 새로 드장한 애노테이션을 이용한 자동 구성이 핵심이다.


@EnableJms - JMS메시징

@EnableCaching - 캐시추상화

@EnableRabbit - 래빗MQ로 AMQP 메시징

@EnalbeBatchProcessing - 스프링 배치

@EnalbeWebSecurity - 스프링 시큐리티

@EnalbeRedisHttpSession - 스프링 세션

@EnalbeJpaRepositories - 스프링 데이터

@EnalbeIntegration - 스프링 통합



반응형

'JAVA > Spring Boot' 카테고리의 다른 글

Spring Data JPA  (0) 2018.04.02
스프링 부트 데이터 액세스  (0) 2018.02.12
스프링 부트 테스트  (0) 2018.02.09
스프링과 스프링 부트 비교  (0) 2018.02.08
스프링 부트 작동원리  (0) 2018.02.06