Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 41 additions & 25 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,50 @@ plugins {
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
sourceCompatibility = '11'
repositories {
mavenCentral()
}

configurations {
compileOnly {
extendsFrom annotationProcessor
subprojects {
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
sourceCompatibility = '11'
}
}

repositories {
mavenCentral()
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

tasks.named('test') {
useJUnitPlatform()
}
repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
useJUnitPlatform()
}
}
18 changes: 18 additions & 0 deletions helloreactor/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
plugins {
id 'java'
}

version 'unspecified'

repositories {
mavenCentral()
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

test {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import reactor.core.publisher.Flux;

@SpringBootApplication
public class HelloreactorApplication {

public static void main(String[] args) {
SpringApplication.run(HelloreactorApplication.class, args);

Flux<String> sequence = Flux.just("Hello", "Reactor"); // 데이터 생성 및 제공
sequence.map(String::toLowerCase) // 데이터 가공
.subscribe(System.out::println); // 전달받은 데이터 처리
}
}
19 changes: 19 additions & 0 deletions marblediagram/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
plugins {
id 'java'
}

version 'unspecified'

repositories {
mavenCentral()
}

dependencies {
implementation 'com.jayway.jsonpath:json-path:2.7.0'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

test {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MarblediagramApplication {

public static void main(String[] args) {
SpringApplication.run(MarblediagramApplication.class, args);
}
}
14 changes: 14 additions & 0 deletions marblediagram/src/main/java/com/example/mono/Example1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.mono;

import reactor.core.publisher.Mono;

public class Example1 {

/**
* Reactor 의 Publisher 타입 중 하나인 Mono 를 사용하여 문자열 출력
*/
public static void main(String[] args) {
Mono.just("Hello Reactor") // 하나의 문자열!
.subscribe(System.out::println);
}
}
17 changes: 17 additions & 0 deletions marblediagram/src/main/java/com/example/mono/Example2.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.mono;

import reactor.core.publisher.Mono;

public class Example2 {

public static void main(String[] args) {
Mono
.empty() // 데이터 한 건도 emit 하지 않음
.subscribe(
none -> System.out.println("# emitted onNext Signal"),
error -> {},
() -> System.out.println("# emitted onComplete Signal")
// 아무 데이터를 전송하지 emit 하지 않고 onComplete Signal 만을 전송
);
}
}
47 changes: 47 additions & 0 deletions marblediagram/src/main/java/com/example/mono/Example3.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.example.mono;

import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import java.net.URI;
import java.util.Collections;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import reactor.core.publisher.Mono;

public class Example3 {

public static void main(String[] args) {
URI worldTimeUri = UriComponentsBuilder.newInstance().scheme("http")
.host("worldtimeapi.org")
.port(80)
.path("/api/timezone/Asia/Seoul")
.build()
.encode()
.toUri();

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

Mono.just(
restTemplate
.exchange(worldTimeUri, HttpMethod.GET, new HttpEntity<String>(headers), String.class)
)
.map(response -> {
DocumentContext jsonContext = JsonPath.parse(response.getBody());
String dateTime = jsonContext.read("$.datetime");
return dateTime;
})
.subscribe(
data -> System.out.println("# emitted data: " + data),
error -> {
System.out.println(error);
},
() -> System.out.println("# emitted onComplete signal")
);
}
}
12 changes: 12 additions & 0 deletions marblediagram/src/main/java/com/example/mono/Example4.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.mono;

import reactor.core.publisher.Flux;

public class Example4 {

public static void main(String[] args) {
Flux.just(6, 9, 13)
.map(num -> num % 2)
.subscribe(System.out::println);
}
}
13 changes: 13 additions & 0 deletions marblediagram/src/main/java/com/example/mono/Example5.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.mono;

import reactor.core.publisher.Flux;

public class Example5 {

public static void main(String[] args) {
Flux.fromArray(new Integer[]{3, 6, 7, 9})
.filter(num -> num > 6)
.map(num -> num * 2)
.subscribe(System.out::println);
}
}
14 changes: 14 additions & 0 deletions marblediagram/src/main/java/com/example/mono/Example6.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.mono;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class Example6 {

public static void main(String[] args) {
Flux<String> flux = Mono.justOrEmpty("Steve")
.concatWith(Mono.justOrEmpty("Jobs"));

flux.subscribe(System.out::println);
}
}
16 changes: 16 additions & 0 deletions marblediagram/src/main/java/com/example/mono/Example7.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.mono;

import reactor.core.publisher.Flux;

public class Example7 {

public static void main(String[] args) {
Flux.concat(
Flux.just("Mercury", "Venus", "Earth"),
Flux.just("Mars", "Jupiter", "Saturn"),
Flux.just("Uranus", "Neptune", "Pluto")
)
.collectList()
.subscribe(planets -> System.out.println(planets));
}
}
8 changes: 8 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
rootProject.name = 'springwebflux'
include 'springMvcHeadOffice'
include 'springMvcHeadOffice'
include 'springMvcBranchOffice'
include 'springReactiveHeadOffice'
include 'springReactiveBranchOffice'
include 'helloreactor'
include 'marblediagram'

18 changes: 18 additions & 0 deletions springMvcBranchOffice/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
plugins {
id 'java'
}

version 'unspecified'

repositories {
mavenCentral()
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

test {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.example.springMvcBranchOffice;

import com.example.springMvcBranchOffice.domain.Book;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@Slf4j
@SpringBootApplication
public class SpringMvcBranchOfficeApplication {

public static void main(String[] args) {
SpringApplication.run(SpringMvcBranchOfficeApplication.class, args);
}

@Bean
public Map<Long, Book> bookMap() {
Map<Long, Book> bookMap = new HashMap<>();

for (long i = 1; i <= 5; ++i) {
bookMap.put(i, new Book(i, "book" + i));
}

return bookMap;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.example.springMvcBranchOffice.controller;

import com.example.springMvcBranchOffice.domain.Book;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/v1/books")
public class SpringMvcBranchOfficeController {

private Map<Long, Book> bookMap;

@Autowired
public SpringMvcBranchOfficeController(Map<Long, Book> bookMap) {
this.bookMap = bookMap;
}

/**
* HeadOffice 에서 bookId 를 통해 책을 조회하는 요청이 왔음
*/
@ResponseStatus(HttpStatus.OK)
@GetMapping("/{book-id}")
public ResponseEntity<Book> getBook(@PathVariable("book-id") long bookId) throws InterruptedException {
// HeadOffice 요청을 처리하는 스레드가 차단되는지 BranchOffice 의 요청을 처리하는 스레드 5초를 sleep 하여 시간 확인
Thread.sleep(5000);

Book book = bookMap.get(bookId);

return ResponseEntity.ok(book);
}
}
Loading