Spring-Boot에서는 Spring이외의 외부오픈소스 요소와 통합하고

상호운영할수 있도록 잘 구성이 되어 있습니다.

여기서는 Spring-Boot에서 공식 지원하지 않는 외부요소를 SpringBoot에

통합하는 방법을 알아보겠습니다.


Spring Bean

Spirng에서 사용하기위한 특정한 인스턴스라고 우선 간단하게 정의하겠습니다.

일반적으로 특정 라이브러리 인스턴스를 가져와서 사용하기위해,

싱글톤이라는( 오직 하나의 제한된 객체를 핸들링) 단순한 패턴을 사용하여 객체를 생성하고,

생성된 객체를 사용하였지만 SPRING에서는 Bean이라는 특수한 인스턴스를 활용해,

SPRING의 라이프 사이클 내에서  인스턴스를 관리하게 됩니다.

Application Closed 라는 오버라이드 메서드가 있다라고 가정하면, 싱글턴에서 생성한 객체의

해제및 클린작업을 직접 구현에 반영해야 했었지만, Spring에서는 Bean에 등록하여 사용하면

이러한 해제작업 즉 라이프 사이클을 직접 관리해줍니다.

보통 안정적인 어플리케이션 정지를 GraceFulStop이라는 단어를 많이 사용합니다.

Java Bean(Oracle)/Spring Bean 의미및 범위가 완전하게 다르다는것에 유의합니다.


외부 인스턴스등록

스프링에서 외부 인스턴스를 등록하여 사용하는 방법은 크게 두가지가 있습니다.

  • XML을 통해서
  • ApplicationConfig에 사용할 Class를 Bean어노테이션을 통해 등록

XML을 통해  생성할 인스턴스를 관리하는것은 다소 익숙하지 않기때문에

( 메이븐에서 라이브러리 관리만으로 XML 셋팅작업은 상당히 타이핑하기도 관리하기도 힘든녀석입니다.)

ApplicationConfig Class를 직접 생성하여 등록하도록 하겠습니다.  

어노테이션도 의미를 정의하기 어려운단어이며 C#의 어튜리뷰트와 동일한 의미로

설정에관련된 오브젝트의 속성및 작동방식의 반복 코딩량을 줄일수있다 정도로 요약하며

자세한 설명은, 잘 설명된 링크를 언급하겠습니다.


AppicationConfig를 추가하여 등록하기

<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.11</artifactId>
<version>${akka.version}</version>
</dependency>

<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-stream-kafka_2.11</artifactId>
<version>0.19</version>
</dependency>

<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.11</artifactId>
<version>${akka.version}</version>
</dependency>

<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-testkit_2.11</artifactId>
<version>${akka.version}</version>
</dependency>



@Configuration
public class ApplicationConfig {

	  private final ApplicationContext applicationContext;
	  private final SpringExtension springAkkaExtension;

	  @Autowired
	  public ApplicationConfig(ApplicationContext applicationContext, SpringExtension springAkkaExtension) {
	    this.applicationContext = applicationContext;
	    this.springAkkaExtension = springAkkaExtension;
	  }

	  @Bean
	  public ActorSystem actorSystem() {
	    final ActorSystem system = ActorSystem.create("default", akkaConfiguration());
	    springAkkaExtension.setApplicationContext(applicationContext);
	    return system;
	  }

	  @Bean
	  public Config akkaConfiguration() {
	    return ConfigFactory.load();
	  }
	}

여기서는 AKKA를 사용하기 위해 ActorSystem을 등록하였습니다.  SPRING-STARTER에 수많은 외부 호환 라이브러리가 등록되고

상호운영할수 있게 준비를 해놓았지만, AKKA가 추구하는 Spec은 거의 찾을수가 없어서 불가피하게 SPRING과 상호운영하려고

등록을 하였습니다.


AKKA의 수많은 장점중, 하나만 설명한다고 하면 아래와 같은 스트림 처리가 된다는것입니다.

    source
      .groupedWithin(100, Duration.create(5, TimeUnit.SECONDS))
      .map(group -> foldLeft(group))
      .mapAsync(3, c -> c.commitJavadsl())

카프카에서 사용하려고 필요한 소스였으며 , 5초동안 최대 100개씩 처리를해 ( 처리할게 50개밖에 없으면 1초안에 50개 처리도 되겠죠)

라는 아주 유용한 스트리밍 제약을 걸수가 있다라것입니다. 

필터조건/병렬처리/맵리듀스등 자바에서 활용가능한 멋진 람다식이 몇가지 있지만,

실시간 스트림처리에서 GRAPHDSL 은  JPA에서 QueryDSL 처리방식과 유사하게 멋진 람다접근 방식을 제공합니다.   


Application에서 사용하기

@SpringBootApplication
public class Study1Application {	
	public static void main(String[] args) {
		final ApplicationContext context = SpringApplication.run(Study1Application.class, args);		
	    final ActorSystem system = context.getBean(ActorSystem.class);
	    final ActorMaterializer materializer = ActorMaterializer.create(system);	    
	}
}

외부 객체사용을 위해 getBean을 통해  접급가능합니다.   Bean으로 지정하여 객체를  사용하는 대상은 

능동적인 메시지큐를 가진 객체여서 SPRING에서 라이프사이클 관리가 필요한 대상 이라고 정의하는것도 좋을듯보입니다.


특정 위치에서 Bean객체 얻기

//멤버선언
@Autowired
private ApplicationContext context;


//사용 , 싱글턴에서 얻는것과 큰 차이없이 특수객체 참조가 가능합니다.
ActorSystem system = context.getBean(ActorSystem.class);

spring boot에 기본제공하는 콤포넌트사용시 위와같은 불편한 작업은 불필요하지만

spring-boot의 구조를 익히는데 도움이될듯하며, AKKA는 비동기 처리 메시지인 액터개념을 익히는데

도움이 될듯보입니다. 좀더 유연하고 다양한 방법으로 Spring-boot에 통합될수 있으니

여러가지 자료를 참고합니다.








  • No labels

2 Comments

  1. Anonymous

    Was totally stuck until I read this, now back up and ruginnn.
  2. Anonymous

    That saves me. Thanks for being so seenbils!