2022. 6. 20. 14:50ใSpring
https://spring.io/guides/gs/async-method/
Spring์์ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํด์ค ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก @Async๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง์ ๋ํด์ ํ์ตํ๋ค.
๊ฐ์ด๋์์๋ GitHub ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ฟผ๋ฆฌํ๊ณ GitHub์ API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ์กฐํ ์๋น์ค๋ฅผ ๋น๋ํ๋ค.
CompletableFuture๋ ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ ํ์ดํ๋ผ์ธ์ผ๋ก ์ฝ๊ฒ ์ฐ๊ฒฐํ๊ณ ๋จ์ผ ๋น๋๊ธฐ ๊ณ์ฐ์ผ๋ก ๋ณํฉํ ์ ์๋ค.
1๏ธโฃ ํ๋ก์ ํธ ์์ฑํ๊ธฐ
์ฌ๊ธฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ์ข ์์ฑ์ ๊ฐ์ ธ์ค๊ณ ๋๋ถ๋ถ์ ์ค์ ์ ์๋์ผ๋ก ์ํํด์ค๋ค.
Gradle ์ ์ ํํด์ฃผ๊ณ , java๋ ๋ฒ์ ์ ๋ง๊ฒ ์ ํํด์ค ๋ค์,
์ข ์์ฑ์ ํด๋ฆญํ๊ณ Spring web์ ์ ํํ๋ฉด ๋๋ค!
(๊ฐ์ด๋์์๋ Spring web๋ง ์ถ๊ฐํ์ง๋ง @Slf4j ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ธฐ ์ํด์ lombok๋ ์ข ์์ฑ ์ถ๊ฐํด์คฌ๋ค)
๊ทธ๋ฆฌ๊ณ ์์ฑ ํด๋ฆญํด์ฃผ๋ฉด ์์ถ ํ์ผ์ด ์๊ธฐ๊ณ ๊ทธ ์์ถ ํ์ผ ํ์ด์ ํ๋ก์ ํธ ์ด๋ฉด ๋๋ค.
2๏ธโฃ User class ์์ฑํ๊ธฐ
โ @JsonIgnore, @JsonIgnoreProperties, @JsonIgnoreType ์ฐจ์ด์
์ฐ์ ์ด๋ฐ ์ด๋ ธํ ์ด์ ์ Json ์ง๋ ฌํ, ์ญ์ง๋ ฌํ์์ ์์ฑ์ ๋ฌด์ํ๋๋ฐ ์ฌ์ฉํ๋ค.
(์ง๋ ฌํ : ๊ฐ์ฒด์ ์ง๋ ฌํ๋ ๊ฐ์ฒด์ ๋ด์ฉ์ ๋ฐ์ดํธ ๋จ์๋ก ๋ณํํ์ฌ ํ์ผ ๋๋ ๋คํธ์ํฌ๋ฅผ ํตํด์ ์คํธ๋ฆผ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.)
@JsonIgnore : ํด๋์ค์ ์์ฑ(ํ๋, ๋ฉค๋ฒ๋ณ์) ์์ค์์ ์ฌ์ฉ
@JsonIgnoreProperties : ํด๋์ค ์์ค์์ ์ฌ์ฉ
@JsonIgnoreType : ํด๋์ค ์์ค์์ ์ฌ์ฉํ๊ณ , ์ ์ฒด ํด๋์ค ๋ฌด์ (ํด๋์ค ์์ฒด๋ฅผ json ๋ฐ์ดํฐ ๋งตํ์์ ์ฌ์ฉ ๋ถ๊ฐ)
@JsonIgnoreProperties(ignoreUnknown = true)
: ์ญ์ง๋ ฌํ, json ๋ฐ์ดํฐ๊ฐ ๊ฐ์ง ํ๋กํผํฐ ์ค์ ์๋ฐ class์ vo ํ๋กํผํฐ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ์๋ฌ๋ฅผ ๋์ง์ง ์๊ณ ๋ฌด์ํ๋ค.
2๏ธโฃ GitHub ์กฐํ ์๋น์ค
GitHub๋ฅผ ์ฟผ๋ฆฌํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ฐพ๋ ์๋น์ค์ด๋ค.
์๋น์ค ํด๋์ค์์ findUser()๋ RestTemplate๋ฅผ ์ฌ์ฉํ์ฌ api๋ฅผ ํธ์ถํ ๋ค์ ์๋ต์ User๊ฐ์ฒด๋ก ์์ ๋ฐ๋๋ค.
@Async ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๋ ๋ณ๋์ ์ค๋ ๋๊ฐ ์์ฑ๋์ด ์คํ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐํ ํ์ ์ CompletableFuture<> ์ธ๋ฐ, ์ด๋ Async๋ฉ์๋์์ ๋ฐํํ ๋ ์ฌ์ฉํด์ผ ํ๋ ํ์ ์ด๋ค.
3๏ธโฃ main ํจ์ ์์ฑ
@EnableAsync
: ๋น๋๊ธฐ ํจ์๋ฅผ ์คํํ ์ ์๋๋ก ํด์ค๋ค.
์ด ์ด๋ ธํ ์ด์ ์ ์คํ๋ง์ด ๋ค์์ ์ค๋ช ํ @Async ์ด๋ ธํ ์ด์ ์ด ์ ์๋ ๋ฉ์๋ฅผ ์คํ๋ง์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋ ํ์ ์ฌ์ฉํ์ฌ ์คํํ ์ ์๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ Executor๋ฅผ ๋ฐํํ๋ taskExecutor()๋ฅผ ์ ์ํ์ฌ ์ค๋ ๋ ํ์ ๋ํด ์ค์ ํด์ฃผ์๋ค.
์ด๋ฅผ ์ ์ํ์ง ์์ผ๋ฉด SimpleAsyncTaskExecutor๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ๋ค.
4๏ธโฃ AppRunner.class
CommandLineRunner
: ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ์์ ์ ํน์ ์ฝ๋ ์คํ์ํค๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
์ด๋ฅผ ๊ตฌํํ ํด๋์ค์์ @Component ์ด๋ ธํ ์ด์ ์ ์ ์ธํด๋๋ฉด ์ปดํฌ๋ํธ ์ค์บ์ด ๋๊ณ , ๊ตฌ๋ ์์ ์ run ๋ฉ์๋์ ์ฝ๋๊ฐ ์คํ๋๋ค.
github api ๋ฅผ ์์ฒญํ๋ ์ฝ๋๋ฅผ CommandLineRunner๋ฅผ ์์๋ฐ์ run ๋ฉ์๋์ ๊ตฌํํ์๋ค.
api ์์ฒญ ์ ์๊ฐ์ ์ธก์ ํ๊ณ 3๊ฐ์ ์์ฒญ์ด ์๋ฃ๋ ํ์ ์๋ต์ 3๊ฐ์ ์๋ต์ ๋ฐ๋๋ฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํด์ค๋ค.
(join() :์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ์ญํ )
โ
get() : get() ๋ฉ์๋๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋๋ฐ, get์ ํ๊ฒ ๋๋ฉด ์์ ์ด ๋๋ ๋๊น์ง ์ ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.
-> ์ด๊ฑด ๋ด๊ฐ ์ค์ ํ๋ ๊ฒ์ผ๋ก get() ๋ฉ์๋๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค๋ ๊ฒ๋ง ์๊ฐํ๊ณ ์ด๋ ๊ฒ ๊บผ๋ด์๋๋ฐ ์ด๋ฌ๋ฉด ์์ ์ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋น๋๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ผ๋ฉด์ ๋๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ค ใ ใ ใ ใ ใ
์ด๋ฐ ๋ฐ๋ณด๊ฐ์ ์ง์ ํ๊ณ ์ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ด๋ฅผ ์ ์ฉํ๋ ค๋๋ฐ ๋์์ ํ๋๊ฑฐ ๊ฐ์๋ฐ ๋ญ๊ฐ ์ฐ์ฐํ๋ค~ ์ด๋ฌ๊ณ ๋ง ์์๋ค..ใ
allOf() : ๋ณ๋ ฌ ์คํํด์ ๊ฒฐ๊ณผ๋ฅผ ์กฐํฉํ ๋ ์ฌ์ฉํ๋ค.
5๏ธโฃ ๊ฒฐ๊ณผ
findUser()๋ @Async ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ์ง์ ํ์๊ณ , PivotalSoftware, CloudFoundry, Spring-Projects ์ ์ ์ ๋ณด ์กฐํ api๋ ์๋ต์ด ์ค์ง ์๋๋ผ๋ ๋จผ์ ์์ฒญ์ด ์ด๋ฃจ์ด์ง๋ค.
๋ง์ฝ ๋๊ธฐ์์ด๋ผ๋ฉด PivotalSoftware์ ๋ํ ์ ์ ์ ๋ณด๋ฅผ ์์ฒญํ๊ณ ์๋ต์ ๋ฐ์ ๋ค, ๋ค์ ์ฝ๋๊ฐ ์งํ๋๋ค.
์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ํตํด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ์น ์๋ฒ๋ก ์์ฒญ์ ๋จผ์ ์ ์กํ ์ดํ, ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์์ ํ๊ธฐ ์ ์ ๋ค๋ฅธ ๋ก์ง์ ์คํํ ์ ์์ผ๋ฏ๋ก ์์ ์ ํจ์จ์ ๋์ผ ์ ์๋ค.