daybreak6 / spring-boot-reactive

0 stars 0 forks source link

스터디 1회차 인증하기 #1

Open LangVE opened 2 years ago

LangVE commented 2 years ago

스터디 1회차

LangVE commented 2 years ago

38페이지 읽고 있습니다. 토요일까지 읽도록 하겠습니다. 1장 다 읽었습니다.

kaiwind7 commented 2 years ago

1장. 스프링 부트 웹 애플리케이션 만들기

스프링 부트란 무엇인가

리액티브 프로그래밍 소개

리액티브 스트릠

발행자와 구독자 사이의 간단한 재약을 정의하는 명세

프로젝트 리액터는 VM웨어 에서 만든 리액티브 스트림 구현체다.

리액터를 상ㅇ하면 다음 특성을 따르는 리액티브 프로그래밍을 활용할 수 있게 된다.

리액터 타입

Flux

실제 물건을 전달해주는 역할을 하는 프레이스홀더(placeholder)

class KitchenService {
    Flux<Dish> getDishes() {
        //요리를 담당하는  ChefService를 모델링해서 요리를 위임할 수도 있지만
        // 단순하게 설명하기 위해 그냥 하드 코딩으로 대체한다.
        return Flux.just(
            new Dish("Sesame chicken"),
            new Dish("Lo mein noodles, plain"),
            new Dish("Sweat & sour beef")
        );
    }
}

애플리케이션 메타데이터

스프링 부트 스타터

스타터는 핵심 라이브러리를 가져온다.

첫코드

자동설정

스프링 부트 애플리케이션의 설정 내용을 분석해서 발견되는 정보에 맞게 다양한 빈을 자동으로 활성화

WebFluxAutoconfiguration 빈은 다음 조건이 충족될 때만 활성화

  1. 리액티브 컨테이너 존재
  2. 클래스패스에 스프링 웹플럭스 존재
  3. WebFluxConfigurationSupport 타입 빈의 부존재

컴퍼넌트 탐색

스프링 웹플럭스 컨트롤러 생성

@RestController
public class ServerController {
    private final KitchenService kitchen;

    public ServerController(KitchenService kitchen) {
        this.kitchen = kitchen;
    }

    @GetMapping(value = "/server", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    Flux<Dish> serveDishes() {
        return this.kitchen.getDishes();
    }
}
  1. @RestController는 화면 구성을 위한 템플릿을 사용하는 대신에 결과 데이터를 직렬화하고 HTTP 응답 본문에 직접 써서 반환하는 REST 컨트롤러임을 나타낸다.
  2. 애플리케이션이 실행되면 스프링은 KitchenService의 인스턴스를 찾아서 자동으로 생성자에 주입해 준다.
  3. @GetMapping은 /server로 향하는 HTTP GET 요청을 serverDishes 메소드로 라우팅해주는 스프링 웹 MVC 애너테이션이다. 반환하는 미디어 타입은 text/event-stream이고, 클라이언트는 서버가 반환하는 스트림을 쉽게 소비 할 수 있다.
@Service
public class KitchenService {
    /**
    * 요리 스트림 생성
    */
    FLux<Dish> getDishes() {
        return Flux.<Dish> generate(sink -> sink.next(randomDish()))
            .delayElements(Duration.ofMillis(250));
    }

    private Dish randomDish() {
        return menu.get(picker.nextInt(menu.size()));
    }

    private List<Dish> menu = Arrays.asList(
            new Dish("Sesame chicken"),
            new Dish("Lo mein noodles, plain"),
            new Dish("Sweet * sour beef"));

    private Random picker = new Random();

}
  1. @Service는 스프링 빈임을 나타내는 애너테이션이며 컴포넌트 탐색 과정에서 스프링 부트에 의해 자동으로 생성되고 빈으로 등록되고, 필요하다면 SErverController에 주입된다.
  2. getDishes()는 하드 코딩을 사용했던 기존 코드와 동일한 메소드 시그니처를 가지고 있지만 3개 요리만 제공했던 기존 코드와 다르게 세 가지 요리 중에서 무작위로 선택된 1개의 요리를 250 밀리초(ms) 간격으로 계속 제공한다.
class Dish {
    private String description;
    private boolean delivered = false;

    public static Dish deliver(Dish dish) {
        Dish deliveredDish = new Dish(dish.description);
        deliveredDish.delivered = true;
        return deliveredDish;
    }

    Dish(String description) {
        this.description = description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public boolean is Delivered() {
        return delivered;
    }

    @Override
    public Stirng toString() {
        return "Dish {" + 
            "description='"+description+"'" + 
            ", delivered=" + delivered + 
            "}";
    }
}
@GetMapping(value = "/served-dishes" produces = MediaType.TEXT_EVENT_STREAM_VALUE)
Flux<Dish> deliverDished() {
    retirm this.kitchen.getDishes()
        .map(dish -> Dish.deliver(dish));
}

템플릿 적용

@Controller
public class HomeController {
    @GetMapping
    Mono<Stirng> home() {
        return Mono.just("home");
    }
}
  1. @Controller JSON 이나 XML 같은 데이터가 아니라 템플릿을 사용한 웹 페이지를 반환하는 스프링 웹 컨트롤러임을 나타내는 애너태이션
  2. @GetMapping: GET 요청을 처리함을 나타내는 애너테이션. 사이트 초기 홈 화면은 아무런 하위 경로가 없으므로 아무런 경로도 명시하지 않았고, 이때 기본값은 / 이다.
  3. 반환 타입 Mono : 템플릿의 이름을 나타내는 문자열을 리액티브 컨테이너인 Mono에 담아서 반환한다.
  4. 메소드는 홈 화면 템플릿을 나타내는 home이라는 문자열을 Mono.just()로 감싸서 반환한다.
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hacking with Spring Boot - Getting Started</title>
</head>
<body>
    <h1>Welcome to Hacking with Spring Boot</h1>

    <p>
        Over the span of this book, you'll build different parts of an e-commerce system 
        which will include fleshing out this web template with dynamic content, using the 
        power of "Spring Boot"
    </p>

</body>
</html>