Spring + Java
[Spring] 스프링 빈(Bean)을 함수형으로 등록하기
Stark97
2023. 8. 9. 16:43
반응형
이전 포스팅에 이어서 함수형 프로그래밍의 사용방식을 알아보자.
함수형 프로그래밍에 대한 것은 아래의 포스팅을 읽어보자.
1. 함수형 프로그래밍으로 Spring Bean 등록하기
Spring Framework는 전통적인 애노테이션 기반 빈 등록 방식 외에도 함수형 프로그래밍을 활용한 빈 등록 방식을 지원한다.
함수형 빈 등록은 특히 이벤트 처리, 스트림 처리 등에서 유용하게 사용될 수 있으며, 코드의 간결성과 유연성을 높여준다.
예시: Consumer 인터페이스를 활용한 Bean 등록
- 아래 코드는 Consumer<PaperViewEvent> 타입의 빈을 함수형 프로그래밍 방식으로 등록하는 예제다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.function.Consumer;
@Configuration
public class EventHandlerConfig {
private final PaperRepository paperRepository;
public EventHandlerConfig(PaperRepository paperRepository) {
this.paperRepository = paperRepository;
}
@Bean
public Consumer<PaperViewEvent> handlePaperViewEvent() {
return event -> {
event.setPaper(paperRepository.findPaperByPaperSn(event.getPaperSn()));
// Insert Logic here
System.out.println("insert here");
};
}
}
- 위 코드에서는 람다 표현식을 사용하여 이벤트 처리 로직을 간결하게 정의하고 있다.
2. 코드 예시 및 설명
코드 분석 (3번 목차의 '람다 표현식의 동작 원리' 를 보고 오면 조금 더 이해가 쉽다.)
@Bean
public Consumer<PaperViewEvent> handlePaperViewEvent() {
return event -> {
event.setPaper(paperRepository.findPaperByPaperSn(event.getPaperSn()));
// 추가 로직..
System.out.println("insert here");
};
}
주요 구성 요소
- @Bean 어노테이션: 해당 메서드가 반환하는 객체를 Spring 컨테이너의 빈으로 등록한다.
- Consumer<PaperViewEvent>: 자바의 함수형 인터페이스 중 하나로, 입력으로 PaperViewEvent 객체를 받아 처리하고 반환값은 없다. (이것도 3번 목차를 보고 오면 더 이해가 쉽다.)
- 람다 표현식: event -> { ... } 형태로, Consumer의 accept 메서드를 구현한다.
동작 방식
- 입력 파라미터: 람다 표현식의 event는 PaperViewEvent 타입의 객체다.
- 로직 수행
- event.setPaper(...): PaperViewEvent 객체의 paper 필드를 설정
- System.out.println("insert here"): 콘솔에 메시지를 출력
이렇게 정의된 Consumer<PaperViewEvent> 빈은 다른 곳에서 이벤트가 발생할 때 accept 메서드를 호출하여 처리할 수 있다.
3. 함수형 인터페이스와 람다 표현식의 관계
함수형 인터페이스란?
- 함수형 인터페이스는 하나의 추상 메서드만을 가지는 인터페이스를 말한다. Java 8부터 도입된 람다 표현식을 지원하기 위해 사용된다. 대표적인 함수형 인터페이스로는 Consumer, Function, Supplier, Predicate 등이 있다.
예시: Consumer 인터페이스
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
람다 표현식의 동작 원리
- 람다 표현식은 함수형 인터페이스의 추상 메서드를 구현하는 간결한 방법이다.
- 예를 들어, 2번 목차의 예시코드에 작성된 Consumer<PaperViewEvent>는 바로 위에 적어둔 void accept(PaperViewEvent event) 메서드를 가지며, 람다 표현식은 이 메서드를 구현하게 된다.
람다 표현식 예시
Consumer<PaperViewEvent> consumer = event -> {
// 처리 로직
};
- 위 예시는 accept 메서드를 구현한 것으로, event는 PaperViewEvent 타입의 입력 파라미터다.
입력 파라미터의 타입 결정
- 람다 표현식의 입력 파라미터 타입은 람다 표현식이 구현하는 함수형 인터페이스의 메서드의 입력 파라미터 타입과 일치해야 한다. 따라서 Consumer<PaperViewEvent>의 경우, 입력 파라미터 event는 PaperViewEvent 타입이어야 한다.
4. 함수형 Bean 등록의 장점
코드 간결성
- 함수형 빈 등록은 전통적인 빈 등록 방식에 비해 코드가 간결해진다. 애노테이션과 메서드 오버라이드를 줄이고, 람다 표현식을 통해 필요한 로직만을 명확하게 정의할 수 있다.
// 함수형 빈 등록
@Bean
public Consumer<PaperViewEvent> handlePaperViewEvent() {
return event -> {
event.setPaper(paperRepository.findPaperByPaperSn(event.getPaperSn()));
System.out.println("insert here");
};
}
유연성 및 재사용성
- 함수형 프로그래밍은 함수를 일급 객체로 취급하여, 변수에 저장하거나 다른 함수의 인자로 전달할 수 있다. 이를 통해 로직을 유연하게 구성하고, 재사용할 수 있다.
테스트 용이성
- 작은 단위의 함수로 로직을 분리함으로써, 개별 함수를 독립적으로 테스트할 수 있다. 이는 코드의 품질을 높이고, 버그를 줄이는 데 기여한다.
반응형