https://github.com/Justin-ad-Park/fastcampus-mysql/tree/init/project GitHub - Justin-ad-Park/fastcampus-mysql Contribute to Justin-ad-Park/fastcampus-mysql development by creating an account on GitHub. github.com [샘플 구동용 Gradle 설정] plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' } group = 'com.example' version = '0.0..
메인 코드 public class L11_FlowableSample2Simple { @Test void flowableTest() throws InterruptedException { // 1. 람다 메소드 방식 */ Flowable flowable = Flowable.create(stringFlowable, BackpressureStrategy.BUFFER); // 2. 인스턴스 생성 방식 */ // Flowable flowable = Flowable.create(new StringFlowable(), BackpressureStrategy.BUFFER); flowable.observeOn(Schedulers.computation()) .subscribe(new StringSubscriber()); Th..
Single을 활용한 간단한 샘플 소스를 가지고, Single이 어떻게 동작하는지 구조를 파해쳐 보도록 하겠다. 단계가 복잡하게 얽혀 전체를 파악하기 쉽지 않지만, 찬찬히 따라가다 보면 적어도 이렇게 구현되어 있구나라는 점은 파악할 수 있으리라. import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.core.SingleObserver; import io.reactivex.rxjava3.core.SingleOnSubscribe; import io.reactivex.rxjava3.disposables.Disposable; import org.jetbr..
DSL이 파라미터의 위치에 따라 역할이 정해지는 중첩된 함수(Nested Function) 패턴으로 구현된 DSL의 단점은 Lambda(함수형인터페이스)를 활용해 개선할 수 있다. NestedFunction + Lambda를 활용한 파라미터 역할 지정 기본형 파라미터로 입력받던 quantity와 price를 대체하기 위한 Supplier를 정의 public class SimpleSupplier implements Supplier { final T value; protected SimpleSupplier(final T value) { this.value = value; } private SimpleSupplier() { value = null; } @Override public T get() { retur..
public class NestedFunctionOrderBuilderEx { public static Order order(String customer, Trade... trades) { Order order = new Order(); order.setCustomer(customer); Stream.of(trades).forEach(order::addTrade); //주문에 모든 거래 추가 return order; } public static Trade buy(int quantity, Stock stock, double price) { return buildTrade(quantity, stock, price, Trade.Type.BUY); } public static Trade sell(int quan..
주식(stock)을 거래(trade)를 하는 주문(order) 기능을 Java로 구현 public class Order { private String customer; private List trades = new ArrayList(); public void addTrade(Trade trade) { trades.add(trade); } public String getCustomer() { return customer; } public void setCustomer(final String customer) { this.customer = customer; } public double getValue() { return trades.stream().mapToDouble(Trade::getValue).sum..
public class OriginalFactoryPattern { public static Product createProduct(String name) { switch(name) { case "Car" : return new Car(); case "Boat" : return new Boat(); default: throw new RuntimeException("No such product " + name); } } @Test void 팩토리메서드_테스트() { Product p1 = OriginalFactoryPattern.createProduct("Car"); Product p2 = OriginalFactoryPattern.createProduct("Boat"); } } public class La..
public class originalResponsibilityChain { public abstract class ProcessingObject { protected ProcessingObject nextProcessor; //자신과 동일한 객체를 멤버로 받음 abstract protected T handleWork(T input); //하위 객체 등록 public void setSuccessor(ProcessingObject successor) { this.nextProcessor = successor; } public T handle(T input) { T result = handleWork(input); if(nextProcessor != null) { return nextProcessor.han..
[AS-IS] import java.util.ArrayList; import java.util.List; public class OriginalObserverPattern { interface Observer { void notify(T message); } interface Subject { void registerObserver(Observer o); void notifyObservers(T message); } class WeatherFeed implements Subject { private final List observers = new ArrayList(); @Override public void registerObserver(Observer o) { this.observers.add(o); ..
[AS-IS] 람다를 사용하지 않은 전통적(?)인 템플릿메서드 패턴 구조 추상클래스를 통해 공통 로직과 템플릿으로 분리할 추상 메서드를 나눈다. 상속받은 클래스에서 추상 메서드를 구현한다. public class OriginalTemplateMethodPattern { abstract class OnlineBanking { public void deposit(int amount) { // 입금 공통 로직은 여기에 있다. System.out.println("입금액: " + amount + "원"); bearInterest(amount); } // 인터넷 뱅킹 업체마다 선이자 계산 방식이 다른 경우 템플릿 메소드로 분리 abstract void bearInterest(int amount); } private..