๐๐ป ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ
- ์ ํต์ ์ธ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์(ex. Spring MVC) ๊ณผ ๋ฌ๋ฆฌ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ฌ์ฉ
๐ก ๋ฆฌ์กํฐ๋ธ : Reactive
- ๋ฐ์์ ํ๋, ๋ฐ์์ ๋ณด์ด๋
๐ ๋ฆฌ์กํฐ๋ธ ์์คํ : Reactive System
- ๋ฐ์์ ์ํ๋ ์์คํ
- ์ฆ, ๋ฆฌ์กํฐ๋ธ ์์คํ ์ ์ด์ฉํ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์์ ์ํ๋ ์์คํ
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์๋ต ๋๊ธฐ ์๊ฐ์ ์ต์ํ ํ ์ ์๋๋ก ์์ฒญ ์ฐ๋ ๋๊ฐ ์ฐจ๋จ ๋์ง ์๊ฒํจ์ผ๋ก์จ
ํด๋ผ์ด์ธํธ์๊ฒ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋๋ก ๊ตฌ์ฑ๋ ์์คํ
โช๏ธ ๋ฆฌ์กํฐ๋ธ ์์คํ ํน์ง
โฝ๏ธ MEANS
- ๋ฆฌ์กํฐ๋ธ ์์คํ ์์ ์ฌ์ฉํ๋ ์ปค๋ฎค๋์ผ์ด์ ์๋จ
๐น Message Driven : ๋ฉ์์ง ๊ธฐ๋ฐ ํต์
- ๋ฆฌ์กํฐ๋ธ ์์คํ ์์๋ ๋ฉ์์ง ๊ธฐ๋ฐ ํต์ ์ ํตํด ์ฌ๋ฌ ์์คํ ๊ฐ์ ๋์จํ ๊ฒฐํฉ์ ์ ์งํจ
- Non-Blocking ํต์ ๊ณผ ์ ๊ธฐ์ ์ธ ๊ด๊ณ๋ฅผ๋งบ๊ณ ์์ผ๋ฉฐ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋จ์ Non-Blocking ํต์ ์ ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ
โฝ๏ธ FORM
- ๋ฉ์์ง ๊ธฐ๋ฐ ํต์ ์ ํตํด ๋ฆฌ์กํฐ๋ธ ์์คํ ์ด ์ด๋ค ํน์ฑ์ ๊ฐ์ง๋ ๊ตฌ์กฐ๋ก ํ์ฑ ๋๋์ง๋ฅผ ์๋ฏธํจ
๐น Elastic : ํ๋ ฅ์๋
- ์์คํ ์ผ๋ก ๋ค์ด์ค๋ ์์ฒญ๋์ด ์ ๊ฑฐ๋ ๋ง๊ฑฐ๋์ ์๊ด์์ด ์ผ์ ํ ์๋ต์ ์ ์ง
๐น Resilient : ํ๋ ฅ
- ์์คํ ์ ์ผ๋ถ๋ถ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์๋ต์ฑ์ ์ ์งํ๋ ๊ฒ
โฝ๏ธ VALUE
- ๋ฆฌ์กํฐ๋ธ ์์คํ ์ ํต์ฌ ๊ฐ์น๊ฐ ๋ฌด์์ธ์ง๋ฅผ ํํํ๋ ์์ญ
๐น Responsive
- ๋ฆฌ์กํฐ๋ธ ์์คํ ์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฆ๊ฐ์ ์ผ๋ก ์๋ตํ ์ ์์ด์ผ ํจ์ ์๋ฏธ
๐น Maintainable
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์ฆ๊ฐ์ ์ธ ์๋ต์ด ์ง์๊ฐ๋ฅํด์ผ ํจ
๐น Extensible
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋์ ์๋์ผ๋ก ํ์ฅํ๊ณ ์ถ์ํ ์ ์์ด์ผ ํจ์ ์๋ฏธ
๐ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ : Reactive Programming
- ๋ฆฌ์กํฐ๋ธ ์์คํ ์์ ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์๋ฏธํจ
โช๏ธ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ํน์ง
โฝ๏ธ Declarative Programming Paradigm : ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ
- ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ๋ชจ๋ธ
โฝ๏ธ Data Streams and The Propagation of Change : ๋ฐ์ดํฐ ์คํธ๋ฆผ๊ณผ ๋ณํ์ ์ ํ
- ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ฌ ์ ์์์ ์๋ฏธ
- ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒ ์์ฒด๋ฅผ ๋ฐ์ดํฐ์ ์ด๋ ํ ๋ณ๊ฒฝ์ด ๋ฐ์ํจ์ ์๋ฏธ
โฝ๏ธ Automatic Propagation of The Changed Data Flow : ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์๋ ์ ํ
- ์ง์์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ฐ์ดํฐ ํ๋ก์ฐ๋ก ๋ณด๊ณ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ ๋ฌํจ
๐ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ : Reactive Streams
- ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ์ค์ฌํญ
โฝ๏ธ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ์์ ์ฌ์์ผ๋ก ์ ์๋ ๊ตฌ์ฑ์์
๐น Publisher
public interface Publisher<T> {
public void subscribe(Subscriber <? super T> s);
}
- ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ์ญํ = emit ํ๋ค !
- subscribe( )๋ผ๋ ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ๊ณ ์์ → ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ Subscribe๊ฐ Publisher๋ก๋ถํฐ
๋ด๋ณด๋ด์ง ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ์ญํ ์ ํจ
* subscribe( )
- Publisher๊ฐ ๋ด๋ณด๋ด๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๊ตฌ๋ ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์
- ์ผ๋ฐ์ ์ผ๋ก subscribe( )๊ฐ ํธ์ถ๋์ง ์์ผ๋ฉด Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ํ๋ก์ธ์ค๋ ์์๋์ง ์์
๐นSubscriber
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
- Publisher๋ก ๋ถํฐ ๋ด๋ณด๋ด์ง ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ์ญํ
- ๋ค ๊ฐ์ ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ๊ณ ์์
โ onSubscribe(Subscription s)
- ๊ตฌ๋ ์ด ์์๋๋ ์์ ์ ํธ์ถ
- onSubscribe( )๋ด์์ Publisher์๊ฒ ์์ฒญํ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์ง์ ํ๊ฑฐ๋ ๊ตฌ๋ ํด์ง ์ฒ๋ฆฌ ๊ฐ๋ฅ
โก onNext(T t)
- Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ emitํ ๋ ํธ์ถ๋๋ฉฐ emit๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์์ ์๋นํ ์ ์์
โข onError(Throwable t)
- Publisher๋ก๋ถํฐ emit๋ ๋ฐ์ดํฐ๊ฐ Subscriber์๊ฒ ์ ๋ฌ๋๋ ๊ณผ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ํธ์ถ๋จ
โฃ onComplete( )
- Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ emit ํ๋ ๊ณผ์ ์ด ์ข ๋ฃ๋ ๊ฒฝ์ฐ ํธ์ถ
- ๋ฐ์ดํฐ์ emit์ด ์ ์์ ์ผ๋ก ์๋ฃ๋ ํ ์ฒ๋ฆฌํด์ผ ๋ ์์ ์ด ์๋ค๋ฉด onComplete๋ด์์ ์ํ
๐น Subscription
public interface Subscription{
public void request(long n);
public void cancel();
}
- Subscriber์ ๊ตฌ๋ ์์ฒด๋ฅผ ํํํ ์ธํฐํ์ด์ค
โ request(long n)
- Publisher๊ฐ emitํ๋ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์์ฒญ
โก cancel( )
- ๊ตฌ๋ ์ ํด์งํ๋ ์ญํ
- ๊ตฌ๋ ํด์ง๊ฐ ๋ฐ์ํ๋ฉด Publisher๋ ๋์ด์ ๋ฐ์ดํฐ๋ฅผ emit ํ์ง ์์
๐น Processor
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
- Subscriber ์ธํฐํ์ด์ค์ Publisher ์ธํฐํ์ด์ค๋ฅผ ์์
→ Publisher์ Subscriber์ ์ญํ ์ ๋์์ ํ ์ ์๋ ํน์ง์ ๊ฐ์ง
โฝ๏ธ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ๊ตฌํ์ฒด
๐ธ Project Reactor
- ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ๊ตฌํ์ฒด
- ์คํ๋ง๊ณผ ๊ถํฉ์ด ๊ฐ์ฅ ์ ๋ง๋ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ๊ตฌํ์ฒด
- Spring 5์ ๋ฆฌ์กํฐ๋ธ ์คํ์ ํฌํจ๋์ด ์์ผ๋ฉฐ Spring Reactive Application ๊ตฌํ์ ์์ด ํต์ฌ์ ์ธ ์ญํ ๋ด๋น
๐ธ Rx Java
- .NET ๊ธฐ๋ฐ์ ๋ฆฌ์กํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ทํ๋ฆญ์ค์์ Java ์ธ์ด๋ก ํฌํ ํ JVM ๊ธฐ๋ฐ์ ๋ฆฌ์กํฐ๋ธ ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- 2.0 ๋ถํฐ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ํ์ค ์ฌ์์ ์ค์
- RX๋ Reactive Extension์ ์ค์๋ง → ํน์ ์ธ์ด์์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ๋ฅผ ๊ตฌํํ ๋ณ๋์ ๊ตฌํ์ฒด๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ
๐ธ Java Flow API
- ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ํ์ค ์ฌ์์ Java ์์ ํฌํจ ์ํจ ๊ตฌ์กฐ
- ๋ค์ํ ๋ฒค๋๋ค์ด JDBC API๋ฅผ ๊ตฌํํ ๋๋ผ์ด๋ฒ๋ฅผ ์ ๊ณตํ ์ ์๋๋ก SPI์ญํ ์ ํ๋ ๊ฒ ์ฒ๋ผ
Flow API ์ญ์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ ์ฌ์์ ๊ตฌํํ ์ฌ๋ฌ ๊ตฌํ์ฒปใน์ ๋ํ SPI ์ญํ ์ ํจ
๐ธ ๊ธฐํ ๋ฆฌ์กํฐ๋ธ ํ์ฅ : Reactive Extension
- ๋ฆฌ์กํฐ๋ธ ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก RxJava, RxJS, RxAndroid, RxKotlin, RxPython, RxScala ๋ฑ
๐ก ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ vs ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
๐ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ
public class test {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 5, 6, 7, 8, 9, 13);
int sum = 0;
for(int number : numbers) {
if(number > 4 && (number % 2 == 0)) {
sum += number;
}
}
System.out.println(sum);
}
}
//numbers๋ผ๋ ๋ฆฌ์คํธ ์ ์ซ์๋ค์์ 4๋ณด๋ค ํฐ ์ง์์ ํฉ ๊ตฌํ๊ธฐ
- List์ ํฌํจ๋ ์ซ์๋ค์ for๋ฌธ์ ์ด์ฉํ์ฌ ์์ฐจ์ ์ผ๋ก ์ ๊ทผ → if๋ฌธ์ผ๋ก ํน์ ์กฐ๊ฑด์ ๋ง๋ ์ซ์๋ง sum ๋ณ์์ ๋ํ๊ธฐ
- ์ฝ๋๊ฐ ์ด๋ค ์์ผ๋ก ์คํ๋์ด์ผ ํ๋์ง์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋ก์ง๋ค์ด ์ฝ๋ ์์ ๊ทธ๋๋ก ๋๋ฌ๋จ
๐ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
public class test {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 3, 5, 6, 7, 8, 9, 13);
int sum =
number.stream()
.filter(number -> number > 4 && (number % 2 == 0))
.mapToInt(number -> number)
.sum();
System.out.println("# ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ: " + sum);
}
}
- ์คํํ ์ฝ๋๋ฅผ ์ ์ธ๋ง ํ๋ฉฐ ์์ฐจ์ ์ผ๋ก ์คํ๋์ง ์์
- Java์์ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ดํดํ๊ธฐ ์ํ ๊ฐ์ฅ ์ ์ ํ ์๋ Stream !
- ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ค๋ฆ
- Java Stream API๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ ์์ ๋ณด์ด์ง ์๋ ๋ด๋ถ ๋ฐ๋ณต์๊ฐ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์์ ์ฌ์ฉํ๋ for๋ฌธ ๋์ฒด
- filter( ) ๋ฉ์๋๊ฐ if๋ฌธ์ ๋์ ํด์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ซ์ ํํฐ๋ง
- Stream ์ฝ๋๋ stream() → filter( ) → mapToInt( ) → sum( ) ์์๋ก ์คํ๋๋ ๊ฒ์ด ์๋
→ ์ต์ข ์ฐ์ฐ์ ์ํํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด ์์์ ์์ฑํ ๋ฉ์๋ ์ฒด์ธ๋ค์ด ์คํ๋์ง ์์
= ์ค๊ฐ ์ฐ์ฐ์๋ ์ด๋ฌํ ์์ ์ ํด๋ฌ๋ผ๊ณ ์ ์ธ(์์ฒญ)ํ๋ ๋๋ค ํํ์๋ง ๋๊ฒจ์ฃผ๊ณ
์ต์ข ์ฐ์ฐ์ด ํธ์ถ๋ ๋ ๋น๋ก์ ์ ๋ฌ ๋ฐ์ ๋๋ค ํํ์์ ๊ธฐ๋ฐ์ผ๋ก ๋์
๐๐ป ์ฆ, ํ์ํ ๋์๋ค์ ๋๋ค ํํ์์ผ๋ก ์ ์(์ ์ธ)ํ๊ณ ๊ตฌ์ฒด์ ์ธ ๋์์ํ์ ์ฐ์ฐ ๋ฉ์๋ ์ฒด์ธ์ ์์
๐ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ์กฐ
public class Example {
public static void main(String[] args) {
(1) Publisher์ ์ญํ
Mono<String> mono = Mono.just("Hello, Reactive");
(2) Subscribe์ ์ญํ
mono.subscribe(message -> System.out.pintln(message));
}
}
public class Example2 {
public static void main(String[] args) {
Mono
.just("Hello, Reactive")
.subscribe(message -> System.out.println(message));
}
}
//ํ๋์ ๋ฉ์๋ฃ ์ฒด์ธ ํํ๋ก ํํ
* Publisher๋ ๋ฐ์ดํฐ๋ฅผ emit(๋ด๋ณด๋ด๋) ์ญํ
- Publisher์ ์ญํ ์ ํ๋ ๊ฒ์ Mono
* Subscriber์ Publisher๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ์๋นํ๋ ์ญํ
- Subscriver์ ์ญํ ์ ํ๋ ๊ฒ์ subscribe( ) ๋ด๋ถ์ ์ ์๋ ๋๋ค ํํ์์ธ message -> System.out.println(message)
๐ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์์ ์ฌ์ฉ๋๋ ์ฉ์ด
public class Example3 {
public static void main(String[] args) {
Flux
.fromIterable(List.of(1, 3, 6, 7, 8, 11))
.filter(number -> number > 4 && (number % 2 == 0))
.reduce( (n1, n2) -> n1 + n2 )
.subscribe(System.out::println);
}
}
๐ธ Publisher
- ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ์ฃผ์ฒด : Flux
๐ธ Emit
- Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ
๐ธ Subscriber
- Publisher๊ฐ emitํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์์ ์๋นํ๋ ์ฃผ์ฒด
- System.out::println์ด subscriber์ ํด๋น
๐ธ Subscribe
- ๊ตฌ๋
- subscribe( )๋ฅผ ํธ์ถํ๋ฉด ๊ตฌ๋ ์ ํ๋ ๊ฒ์ด ๋จ
๐ธ Signal
- Publisher๊ฐ ๋ฐ์์ํค๋ ์ด๋ฒคํธ
- ์ฝ๋์์ subscibe( )๊ฐ ํธ์ถ๋๋ฉด Publisher์ธ Flux๋ ์ซ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ emit ํจ
→ ์ด๋, ์ซ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ emit ํ๋ ์์ฒด๋ฅผ ์ด๋ฒคํธ ๋ฐ์์ผ๋ก ๊ฐ์ฃผํ์ฌ
์ด๋ฒคํธ ๋ฐ์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํ๋ ๊ฒ์ Signal์ ์ ์กํ๋ค๊ณ ํํ
๐ธ Operator
- ์ด๋ค ๋์์ ์ํํ๋ ๋ฉ์๋
- fromIterable( ), filter( ), reduce( ) ๋ฑ์ Operator๋ผ๊ณ ํจ
๐ธ Sequence
- Operator ์ฒด์ธ์ผ๋ก ํํ๋๋ ๋ฐ์ดํฐ์ ํ๋ฆ
- Oprerator๋ค๋ก ์ด๋ฃจ์ด์ง ์ฝ๋ ์์ฒด๋ฅผ ํ๋์ Sequence๋ผ๊ณ ์ดํดํ๋ฉด ๋จ
๐ธ Upstream / Downstream
- Sequence ์์ ํน์ Operator๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ Sequence ์ผ๋ถ๋ฅผ Upstream์ด๋ผ๊ณ ํ๋ฉฐ
์๋์ชฝ Sequence ์ผ๋ถ๋ฅผ Downstream์ด๋ผ๊ณ ํํ
- filter()๋ผ๋ Operator๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ fromIterable์ Upstream, ์๋์ชฝ์ reduce๋ Downstream์ด ๋จ
'Study > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] Project Reactor (0) | 2022.08.11 |
---|---|
[TIL] ์ด์ ์ ๋ต (2) (0) | 2022.08.09 |
[TIL] ์ด์ ์ ๋ต (1) (0) | 2022.08.09 |
[TIL] Github Actions (0) | 2022.08.08 |
[TIL] ๋ฐฐํฌ ์๋ํ (0) | 2022.08.08 |