Spring + Java

[Spring] 스프링 빈(Bean)을 함수형으로 등록하기

Stark97 2023. 8. 9. 16:43
반응형
 
 
 

이전 포스팅에 이어서 함수형 프로그래밍의 사용방식을 알아보자.

함수형 프로그래밍에 대한 것은 아래의 포스팅을 읽어보자.

 

[Spring] 함수형 프로그래밍이란?

함수형 프로그래밍에 대해 알아보자. 1. 함수형 프로그래밍이란?함수형 프로그래밍은 수학의 함수 개념을 프로그래밍에 적용한 패러다임이다. 이 패러다임에서는 순수 함수, 불변성, 고차 함수

curiousjinan.tistory.com

 

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");
    };
}

주요 구성 요소

  1. @Bean 어노테이션: 해당 메서드가 반환하는 객체를 Spring 컨테이너의 빈으로 등록한다.
  2. Consumer<PaperViewEvent>: 자바의 함수형 인터페이스 중 하나로, 입력으로 PaperViewEvent 객체를 받아 처리하고 반환값은 없다. (이것도 3번 목차를 보고 오면 더 이해가 쉽다.)
  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");
    };
}

유연성 및 재사용성

  • 함수형 프로그래밍은 함수를 일급 객체로 취급하여, 변수에 저장하거나 다른 함수의 인자로 전달할 수 있다. 이를 통해 로직을 유연하게 구성하고, 재사용할 수 있다.

테스트 용이성

  • 작은 단위의 함수로 로직을 분리함으로써, 개별 함수를 독립적으로 테스트할 수 있다. 이는 코드의 품질을 높이고, 버그를 줄이는 데 기여한다.

 

 

반응형