[Spring] @Async๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐ

2022. 6. 20. 14:50ใ†Spring

728x90

https://spring.io/guides/gs/async-method/

 

Creating Asynchronous Methods

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

Spring์—์„œ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•ด์ค€ ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ @Async๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ–ˆ๋‹ค.

๊ฐ€์ด๋“œ์—์„œ๋Š” GitHub ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  GitHub์˜ API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์กฐํšŒ ์„œ๋น„์Šค๋ฅผ ๋นŒ๋“œํ•œ๋‹ค. 

 

CompletableFuture๋Š” ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ณ  ๋‹จ์ผ ๋น„๋™๊ธฐ ๊ณ„์‚ฐ์œผ๋กœ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ 

https://start.spring.io/

์—ฌ๊ธฐ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์„ค์ •์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค. 

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์— ๋Œ€ํ•œ ์œ ์ € ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›์€ ๋’ค, ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค. 

์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์›น ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋จผ์ € ์ „์†กํ•œ ์ดํ›„, ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์‹ ํ•˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ๋กœ์ง์„ ์‹คํ–‰ํ• ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž‘์—…์˜ ํšจ์œจ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

728x90