(자바 8) 실행 어라운드 패턴.

자원처리 (예를들면 데이터베이스의 파일처리)에 사용하는 순환패턴은 자원을 열고, 처리한 다음에, 자원을 닫는 순서로 이루어진다.

설정과 정리과정은 대부분 비슷하다.
즉, 실제자원을 처리하는 과정은 설정과 정리 두 과정이 둘러싼 형태를 갖는다.

예를들어) 작업 A, 작업 B를 한다치면

1. 초기화/준비코드 -> 작업 A -> 정리/마무리코드
2. 초기화/준비코드 -> 작업 B -> 정리/마무리코드

즉, 이러한 것을 실행어라운드 패턴이라 부른다.

그러나 작업 A, 작업 B를 실행하기 위해서는 위와같이 중복되는 준비 코드와 정리코드가 발생한다.
이를 줄이기 위한 것이다.

이 패턴은 총 4단계를 거친다.

1단계 : 동작파라미터화를 기억하라.
2단계 : 함수형 인터페이스를 이용해서 동작 전달
3단계 : 동작 실행!
4단계 : 람다 전달


public static String processFile() throws IOException{
   try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
     return br.readLine();
   }
}
1단계 : 동작파라미터화를 기억하라.
-> 위 코드는 파일에서 한 번에 한 줄만 읽을 수 있다. 만약 한 번에 두 줄을 읽거나 가장 자주 사용되는 단어를 반환하려면 어떻게 해야 할까?
processFile의 동작을 파라미터화하는 것이다. 람다를 이용해서 동작을 전달할 수 있다.

String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());



2단계 : 함수형 인터페이스를 이용해서 동작 전달

함수형 인터페이스 자리에 람다를 사용할 수 있다.
따라서 BufferedReader -> String 과 IOException을 던질 수 있는 시그너처와 일치하는 함수형 인터페이스를 만들어야 한다.

@FunctionalInterface
public interface BufferedReaderProcessor{
   String process(BufferedReader b) throws IOException;
}

정의한 인터페이스를 processFile 메서드의 인수로 전달할 수 있다.
public static String processFile(BufferdReaderProcessor p) throws IOException{
.....
}

3단계 : 동작 실행!

이제 BufferedReaderProcessor에 정의된 process 메소드의 시그너처(BufferedReader -> String)와 일치하는 람다를 전달할 수 있다.

public static String processFile(BufferedReaderProcessor p) throws IOException{
  try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
    return p.process(br);
  }
}


4단계 : 람다 전달

람다를 이용해서 다양한 동작을 processFile 메소드로 전달할 수 있다.

String oneLine = processFile((BufferedReader br) -> br.readLine());

String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());



댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기