분류 전체보기 258

토비의 봄 TV - CompletableFuture (7)

https://hyokeun0419.tistory.com/89 CompletableFuture (4) 자바에서 비동기(Asynchronous) 프로그래밍을 가능케하는 인터페이스이다. Future 인터페이스는 java5부터 java.util.concurrency 패키지에서 비동기의 결과값을 받는 용도로 사용했지만 비동기의 결과값 hyokeun0419.tistory.com https://hyokeun0419.tistory.com/90 CompletableFuture (5) 지난 시간에 이어 진행해보자. 이번엔 CompletableFuture 를 가지고 여러 작업을 조합하는 방법과 예외를 처리하는 방법에 대해 살펴보자. Future 만 가지고는 특정 작업들을 이어서 처리하는게 힘들었 hyokeun0419.ti..

Spring/Webflux 2022.06.28

토비의 봄 TV - AsyncRestTemplate의 콜백 헬과 중복 작업 문제 (6)

저번시간엔 비동기 논블록킹 작업의 자원을 최소화하는 방법을 다뤘다. 하지만 문제는 중첩된 외부 서비스들을 호출하게되면 콜백의 구조가 복잡해지는 문제 즉, 콜백 헬에 빠지게 되었고 이를 어떻게 개선할 수 있는지 살펴보자. 다시한번 정리해보자면, 명령형 스타일의 콜백을 이용했고, 이를 함수형 스타일의 코드로 가독성을 높여보자. 콜백 안에 인자는 완료가 된 후 한번 실행되고 끝나 작업이 완료 후 어떤 액션을 하겠다 라는 것들을 구조적으로 제공해줄수 없다. 비동기 처리를 할 때 마다 에러를 처리하는 코드가 중복된다. 콜백 헬이 일어난다. Completion 클래스 추가 비동기 작업을 수행해서 ListenableFuture 와 같은 결과를 가져오고, 콜백에 지정한 작업이 완료나 에러가 발생했을때 이후의 처리를 다..

Spring/Webflux 2022.06.24

추상 팩토리 (Abstract factory) 패턴

팩토리 패턴이란? 펙토리 메서드 패턴과 추상 팩토리 패턴 두가지로 구분할 수 있으며, 모두 객체 생성을 위한 디자인 패턴이다. 간단하게 이 둘의 차이를 보자. 팩토리 메소드 패턴 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다. 즉 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것. https://hyokeun0419.tistory.com/101 (해당 포스팅을 참고하자.) 추상 팩토리 패턴 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성. 추상 팩토리 패턴이란? 서로 관련있는 여러 객체를 만들어주는 인터페이스 구체적으로 어떤 클래스의 인스턴스를 사용하는지 감출..

디자인 패턴 2022.06.19

토비의 봄 TV - 스프링의 비동기 기술 (4) 2/2

@Async Spring MVC 3.2 부터 Servlet 3.0 기반의 비동기 요청 처리가 가능해졌다. @Async 어노테이션을 추가해 해당 메서드를 비동기적으로 호출할 수 있다. 해당 메서드를 호출한 호출자(caller)는 즉시 리턴하고 메소드의 실제 실행은 Spring TaskExecutor에 의해서 실행된다. 비동기로 실행되는 메서드는 Future 형식의 값을 리턴하고, 호출자는 해당 Future의 get() 메서드를 호출하기 전에 다른 작업을 수행할 수 있다. @SpringBootApplication @EnableAsync @Slf4j public class AsyncApp { @Service public static class MyService { /* 내부적으로 AOP를 이용해 복잡한 로직이..

Spring/Webflux 2022.06.17

토비의 봄 TV - 자바의 비동기 기술 (4) 1/2

ExcutorService 쉽게 비동기로 작업을 실행할 수 있도록 도와주는 JDK(1.5부터)에서 제공하는 interface 이다. 일반적으로 ExecutorService는 작업 할당을 위한 스레드 풀과 API를 제공한다. @Slf4j public class ExcutorServiceApp { public static void main(String[] args) { ExecutorService es = Executors.newCachedThreadPool(); es.execute(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("Async"); System.out.print..

Spring/Webflux 2022.06.17

토비의 봄 TV - Reactive Streams Scheduler (3)

해당 강좌에서는 publisher, subscriber 의 동작 코드를 reactive streams 에서 제공하는 scheduler 를 이용하여 서로 다른 스레드에서 동작하도록 해보자. 스케줄러 (Scheduler) 메인 쓰레드가 언제 일어날줄 모르는 이벤트를 blocking 방식으로 무한정 기다리는건 비효율적 이다. 비동기로 효율적으로 처리 될 수 있도록 다른 쓰레드를 이용하거나 생성하는데, 이를 스케줄러라 부른다. 스케줄러 (Scheduler) 종류 publishOn publisher(데이터 생성)는 빠르나 subscriber(데이터 사용)쪽의 작업이 느린 경우 subscriber를 별도의 쓰레드로 분리 e.g) 데이터 가공/저장 작업이 느린경우 사용 subscribeOn publisher가 느리고..

Spring/Webflux 2022.06.14

CompletableFuture (3) - Callable 과 Future

Thread는 Runnable과 Callable의 구현된 함수를 수행한다는 공통점이 있지만, 다음과 같은 차이점이 있다. Runnable: 어떤 객체도 리턴하지 않습니다. Exception을 발생시키지 않습니다. Callable: 특정 타입의 객체를 리턴합니다. Exception을 발생킬 수 있습니다. Callable 이전까지 사용했던 Runnable과 유사하지만 작업의 결과(return) 를 받을 수 있다. Future Future 는 자바 1.5 에 등장한 비동기 계산 결과를 나타내는 인터페이스 비동기적인 작업의 현재 상태를 조회하거나 결과를 가져올 수 있다. Future를 이용하면 멀티쓰레드 환경에서 처리된 어떤 데이터를 다른 쓰레드에 전달할 수 있다. Future 내부적으로 Thread-Safe ..

팩토리 메소드 패턴 (Factory Method Pattern)

팩토리 메소드 패턴? 조건에 따른 객체 생성을 팩토리 클래스로 위임하여, 팩토르 클래스에서 객체를 생성하는 패턴 구체적으로 어떤 인스턴스를 만들지는 서브 클래스가 정한다. 다양한 구현체가 있고, 그 중에서 특정한 구현체를 만들 수 있는 다양한 팩토리 제공할 수 있다. 객체의 생성 코드를 별도의 클래스/메서드로 분리함으로써 객체 생성의 변화에 대비하는 데 유용하다. 먼저, 팩토리 메소드 패턴이 적용되지 않은 코드를 살펴보자. public class Client { public static void main(String[] args) { // white_ship 생성 Ship white_ship = ShipFactory.orderShip("white_ship", "hyoklee@naver.com"); Sys..

디자인 패턴 2022.06.14

인터페이스 default 메소드와 static 메소드

기본 메소드 (Default Methods) 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다. 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다. 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다. 반드시 문서화 할 것. (@implSpec 자바독 태그 사용) public interface Foo { void printName(); /* * @implSpec * 이 구현체는 getName()으로 가져온 문자열을 대문자로 바꿔 출력한다. */ // getName() 에 null 값이 들어올 수 있음. 문제가 된다면 구현 클래스에서 재정의하자. default void printNameUpp..

메소드 레퍼런스

람다가 하는 일이 기존 메소드 또는 생성자를 호출하는 거라면, 메소드 레퍼런스를 사용해서 간결하게 표현할 수 있다. 즉, 람다식을 더 간결하게 표현하는 방법이 메소드 레퍼런스 이다. 메소드를 참조하는 방법 메소드 또는 생성자의 매개변수로 람다의 입력값을 받는다. 리턴값 또는 생성한 객체는 람다의 리턴값이다. 아래 예제코드를 살펴보자. import java.util.Arrays; import java.util.List; import java.util.function.Function; import java.util.function.Supplier; import java.util.function.UnaryOperator; public class App { public static void main(String..