Gradle
Gradle์ด๋?
์ฐธ์กฐ : http://www.devkuma.com/books/pages/1064
https://kwonnam.pe.kr/wiki/gradle/buildlifecycle
์ํค๋ฐฑ๊ณผ์๋ Gradle์ด๋ ๊ทธ๋ฃจ๋น(Groovy)์ ์ด์ฉํ ๋น๋ ์๋ํ ์์คํ ์ด๋ผ๊ณ ์ ํ์๋ค.
์ฌ๊ธฐ์ ๊ทธ๋ฃจ๋น(groovy)๋, ์๋ฐ์ ํ์ด์ฌ, ๋ฃจ๋น ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์ธ์ด๋ค์ ํน์ง์ ๋ํ ๋์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๊ทธ๋์ Groovy๋ JVM์์ ์คํ๋๋ ์คํฌ๋ฆฝํธ ์ธ์ด๋ผ๊ณ ์ ์ํ ์ ์๋ค.
์๋ ์ฌ์ฉํ๋ ๋น๋ ํด์ธ Ant๋ Maven์ ์ ์น๊ณ Gradle์ ์ฌ์ฉํ๋ ์ด์ ๋ ์ญ์ ๊ธฐ์กด์ ๋น๋ ํด๋ค์ ๋จ์ ์ ๋ณด์ํ๊ณ ์ฅ์ ๋ง ๋นผ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
Maven๋ณด๋ค Gradle์ ์ฌ์ฉํ๋ ์ด์
๊ฐ๋ ์ฑ : ํ๊ทธ ๋ฐฉ์์ผ๋ก ๊ตฌ๊ตฌ์ ์ ์์ฑํ๋ค ๋ณด๋, ์์ด ๋ง์์ง ์๋ก ์์๋ณด๊ธฐ ํ๋ค๋ค, ์์กด ๊ด๊ณ๊ฐ ๋ณต์กํด์ง๋ฉด ์ฝ๊ฒ ํ์ ํ๊ธฐ ํ๋ค๋ค.
ํน์ ์ค์ ์ ์์์ ๋ชจ๋์์ ๊ณต์ ํ๊ธฐ ์ํด์๋ ๋ถ๋ชจ ๋ชจ๋์ ์์ฑํด์ ์์ ๋ฐ์์ผ ํ๋ maven์ ๋จ์ ์ ๋ณด์
Groovy ์ธ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋์ ์ธ ๋น๋๋ ์ํ๋ฉด ๋ฐ๋ก ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅ
Gradle์ ์์ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ฐ๋ฉด Maven์ ์ ํ์ ์ธ ๋จ๊ณ์ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ์๋ ์ฐจ์ด๋ ๋ง์ด ๋๋ค! (์ฝ 100๋ฐฐ)
Build๋ผ๋ ๋จ์ด๊ฐ ๊ณ์ํด์ ๋์ค๋๋ฐ ํ๋ก์ ํธ๋ฅผ build ํ๋ค๋ ์๋ฏธ๋ ์์ค ์ฝ๋ ํ์ผ์ ์ปดํจํฐ๋ ํด๋ํฐ์์ ์คํํ ์ ์๋ ๋ ๋ฆฝ ์ํํธ์จ์ด๋ก ๋ง๋ค์ด์ฃผ๋(Jar, War ํ์ผ ๋ฑ์ผ๋ก) ๊ณผ์ ์ ์๋ฏธํ๋ค.
Build phase
Initialization : gradle์์๋ ๋จ์ผ, ๋ฉํฐ ํ๋ก์ ํธ๋ฅผ ๋ชจ๋ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ด ๋จ๊ณ์์ ์ด๋ค ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๊ณ ํ๋ก์ ํธ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋จ๊ณ์ด๋ค.
Configuration : ๋น๋๋ ํ๋ก์ ํธ๋ค์ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ณ ํ๋ก์ ํธ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ค.
Execution : gradle์ configuration ๋จ๊ณ์์ ์์ฑ ๋ฐ ๊ตฌ์ฑ๋ ๋ถ๋ถ tasks๋ค์ ๊ฒฐ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ์ ๋ tasks๋ค์ ์คํํ๋ค.
Java Plugin tasks๊ฐ ์์กด๊ด๊ณ
Gradle์ Maven์ด ๊ฐ์ง๋ ์์๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ configuration์ ํตํด์ ํ์ฅ์ ์ ํํ๋ค. ์ด ํ์ฅ์ plugins์ ์ํด์ ๊ฐ๋ฅํ๊ฒ ๋์๋ค.
Gradle์ plugins์ ๊ฐ๋ค์ ์ถ๊ฐํ๋ฉด์ ๋น๋์ ํ์ํ task๊ฐ ์ถ๊ฐ๋ ๋ฟ๋ง ์๋๋ผ task๊ฐ์ ์์กด๊ด๊ณ๊น์ง ์ค์ ํจ์ผ๋ก์จ ๋น๋ ์์ ์ ์ํ
ํ๋ก์ ํธ์์์ Gradle ๊ตฌ์กฐ
Gradle์ ์ ํํด์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๊ตฌ์กฐ๋ ํฌ๊ฒ ์ด๋ ๋ค.
build.gradle
gradle
wrapper
gradle-wrapper.jar
gradle-wrapper.properties
gradlew
gradlew.bat
settings.gradle
src
main
test
๊ฐ ํ์ผ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ํ์ธํด๋ณด์
build.gradle์ด๋?
Gradle์ ๊ธฐ๋ณธ ๋น๋ ์ค์ ํ์ผ์ด๊ณ . project ๋น๋ ์ฒ๋ฆฌ์ ๋ํด์ ๋ด์ฉ์ ์์ฑํ๋ ๊ณณ์ด๋ค.
build.gradle์ ๋น๋ ์คํฌ๋ฆฝํธ๋ผ๊ณ ๋ ํ๋ฉฐ ๋น๋๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ ์์กด์ฑ์ด๋ ํ๋ฌ๊ทธ์ธ ๋ฑ๊ณผ ๊ฐ์ ์ค์ ๋ค์ ํด์ฃผ๋ ๊ณณ์ด๋ค.
= ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋ ํ์ผ์ด๋ค.
์ด๊ธฐ์ build.gradle ๋ชจ์ต
build.gradle์ ๋ด๋ถ ํ๊ทธ
plugins?
Gradle ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ ํ๋ก์ ํธ์ ๊ธฐ๋ฅ์ ๋๋ฆฌ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. java๋ spring ๊ด๋ จ ํค์๋๋ค์ ๋ฃ์ด์ค๋ค.
๊ธฐ์กด์๋ apply plugin : 'java' ์ด๋ฐ ์์ผ๋ก ํ์๋๋ฐ
plugins ๋ธ๋ก์์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐ๊ฐ ๋์ฑ ์ฝ๊ฒ ๋ฐ๋์๋ค.
'java' : Java ํ๋ก๊ทธ๋จ์ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ฌ๊ทธ์ธ โ gradle compile์ ์ด๊ฑธ ์ถ๊ฐํด์ ๊ฐ๋ฅ
'application' : ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ฌ๊ทธ์ธ โ gradle run์ ์ด๊ฑธ ์ถ๊ฐํด์ ๊ฐ๋ฅ
repositories?
Gradle์ library๋ฅผ ์๋์ผ๋ก ๋ค์ด๋ก๋ํ๊ณ ํตํฉํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ build.gradle ์์์ '์ด๋ค ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋์ง' ๋ช ์๋ฅผ ํด์ค์ผ ํ๋ค.
๋ก์ปฌ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์๊ฒฉ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์๊ฒฉ ์ ์ฅ์์ ๋ํ์ ์ผ๋ก mavenCentral()์ ์ฌ์ฉํ๊ณ ์ด๋ Apache Maven ์ค์ ์ ์ฅ์๋ฅผ ์๋ฏธํ๋ค.
****
dependencies?
์ฌ๊ธฐ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ณ ์ ํ๋ library๋ค์ ๋ช ์ํด์ค๋ค. ์ฌ๊ธฐ์ ๋ช ์๋ฅผ ํด์ฃผ๋ฉด repositories์ ๋ช ์ํด๋ ์ ์ฅ์์์ ํ์ํ library๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
configuration์ผ๋ก 4๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
compile : ํ๋ก์ ํธ๊ฐ ์ปดํ์ผ ๋ ๋,
runtime : ํ๋ก์ ํธ๋ฅผ ์คํํ ๋ โ compile์ ๋ชจ๋ ํฌํจ
testCompile : ํ๋ก์ ํธ์ ํ ์คํธ๊ฐ ์ปดํ์ผ ๋ ๋ โ ํ๋ก์ ํธ์ ์ปดํ์ผ๋ ํด๋์ค๋ค๊ณผ compile lib์ ์์กด์ฑ ํฌํจ
testRuntime : ํ๋ก์ ํธ์ ํ ์คํธ๋ฅผ ์คํํ ๋ โ compile, runtime, testCompile์ ์์กด์ฑ ํฌํจ
implementation?
์ฐธ์กฐ : https://bluayer.com/13
compile์ ์ ์ด์ Gradle 3.0 ์ดํ๋ถํฐ๋ ๊ถ์ฅํ์ง ์๋๋ค๊ณ ํ๋ค.
compile ๊ณผ ์ฐจ์ด๋ฅผ ํ์ธํด๋ณด๋ฉด
compile ํ๋ฉด ์ฐ๊ฒฐ๋ API ๋ชจ๋๊ฐ ํ๋ก์ ํธ์ ์ํด์ ๋ ธ์ถ๋์ง๋ง implementation์ ์ฐ๊ฒฐ๋ API๊ฐ ๋ ธ์ถ๋์ง ์๋๋ค๋ ์ ์ด๋ค.
๋ํ ์์กดํ๋ ๋ชจ๋์ด ์ด๋ ๊ฒ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์
A๊ฐ B๋ฅผ ์์กดํ๊ณ ์๊ณ , B๊ฐ C๋ฅผ ์์กดํ๊ณ ์๋ ์ํฉ์ด๋ค. = A โ B โ C
๋ง์ฝ ๊ฐ์ฅ ํ์์ ์๋ A ๋ชจ๋์ด ์์ ๋๊ฒ ๋๋ฉด,
compile ์ฌ์ฉ ์, A๋ฅผ ์ง์ , ๊ฐ์ ์์กดํ๊ณ ์๋ B์ C ๋ชจ๋ rebuild ๋์ง๋ง
implementation ์ฌ์ฉ ์, A๋ฅผ ์ง์ ์์กดํ๊ณ ์๋ B๋ง rebuild๋๋ค.
=> ๊ฒฐ๋ก : ๋ชจ๋์ด ๋ง์ผ๋ฉด ๋ง์์๋ก compile์ ์ฌ์ฉํ๋ implementation์ ์ฌ์ฉํ๋ ๋ก build ์๋์ ์ฐจ์ด๊ฐ ๋๋ค.
gradlew? gradlew.bat?
gradle์ ๊ตณ์ด java๋ gradle์ด ์๋๋ผ๋ ๋น๋ํ ์ ์๋๋ก ๋์ด์๋ค. ๊ทธ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด wrapper์ด๊ณ ์์ gradlew๋ gradle + wrapper ์ด๋ ๊ฒ ๋์ด์๋ ๊ฒ์ด๋ค.
wrapper๋? : ์ด์์ฒด์ ์ ๋ง์ถฐ์ gradle ๋น๋๋ฅผ ์ํํ๋๋ก ํ๋ ๋ฐฐ์น ์คํฌ๋ฆฝํธ
๋ฐฐ์น ์คํฌ๋ฆฝํธ? : ๋ช ๋ น ํ๋กฌํํธ์ ๋ช ๋ น๋ค์ ํ๋์ ์ผ๊ด(Batch)๋ก ์ฒ๋ฆฌํด์ ์๋ํ ํด์ฃผ๋ ํ์ผ
๊ทธ๋ฅ ์คํ์ํค๋ ๊ฒ์ผ๋ก ๋น๋ํ ์ ์๊ณ , ์ข ๋ฅ๋ก๋ 2๊ฐ์ง๊ฐ ์๋ค.
gradlew์ linux๋ mac์ด ์ฌ์ฉํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ gradlew.bat์ ์๋์ฐ๊ฐ ์ฌ์ฉํ๋ฉด ๋๋ค.
settings.gradle
ํ๋ก์ ํธ ๊ตฌ์ฑ์ ์์ด์ ์ค์ ํด์ผ ํ๋ ๊ฒ๋ค์ด ์์ผ๋ฉด ์์ ํด์ผ ํ๋ ํ์ผ
์ด๊ณณ์์ ๋ฉํฐ ํ๋ก์ ํธ ๋น๋๊ฐ ๊ฐ๋ฅํ๋ค. ๋ฉํฐ ํ๋ก์ ํธ ๋น๋๋ Gradle์ ํ ๋ฒ ์คํํ๋ ๋์ ํ๋ ์ด์์ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ค.
์ต์์ ํ๋ก์ ํธ์ setting.gradle์์ ํ์ ํ๋ก์ ํธ๋ค์ ๋ฃ์ด์ค๋ค. โ ํธ๋ฆฌ ๋ฐฉ์์ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์ฌ์ฉ
๋ง์ฝ ํ๋์ task๋ฅผ ์คํ ์, ํ์ ํ๋ก์ ํธ์ ํด๋น task๊ฐ ์๋ค๋ฉด ์ต์์ ํ๋ก์ ํธ๋ฅผ ์์์ผ๋ก ํ์ ํ๋ก์ ํธ์ ์๋ task๋ ์คํ๋๋ค.
src
ํฌ๊ฒ mainํด๋์ testํด๋๋ก ๋๋๊ฒ ๋๋๋ฐ,
main์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๋๋ค์ ์์ฑํด์ ๋ฃ์ด์ฃผ๊ณ
test์๋ main์ ์ฝ๋๋ค์ ๋จ์ ํ ์คํธ๋ฅผ ์งํํ ์ฝ๋๋ค์ ์์ฑํด์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
Gradle Task?
Task๋ Gradle์ ์์ ๋จ์์ด๊ณ gradle์์ ์ฌ์ฉํ๋ groovy ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค. ์ ์ธ์ build.gradle ์์์ ์ ์ธ์ ํด์ฃผ๊ณ , intellij ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ gradle์นธ โ Tasks โ other์์ ์ฌ์ฉ์๊ฐ ์ ์ํ task์ ์ฐพ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์คํํ ๋๋ gradle 'task' ์ด ์์๋๋ก ์งํํ๋ฉด task๊ฐ ์ํ๋๋ค.
ex) ํ๋ก์ ํธ๋ฅผ ์คํ "gradle bootrun" ์ด๋ ๊ฒ ์ฌ์ฉํ์๋๋ฐ ์ด๋ฌํ ๊ฒฝ์ฐ๋ ์ด๋ฏธ ๋ด๋ถ์์ task๋ก ์ ์ธ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ ์คํ์ด ๋๋ ๊ฒ์ด๋ค.
๋ฏธ๋ฆฌ ์ ์ธ๋์ด ์๊ณ , ์ฌ์ฉ ๋น๋๊ฐ ์์ ๋งํ ๊ทธ๋ฐ Task
init : ํด๋์ ํ๋ก์ ํธ ํ์ผ์ด๋ ํด๋๋ค์ ์์ฑํ๊ณ ํด๋๋ฅผ ์ด๊ธฐํํ๋ค.
compileJava : Java ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ธฐ ์ํ Task
run : ์๋ฐ ํด๋์ค๋ ํ๋ก์ ํธ(์๋ฒ)๋ฑ์ ์คํ, ์ฆ main ํด๋์ค๋ฅผ ์คํ์ํค๋ Task
jar : ํด๋์ค์ ํจํค์ง๋ฅผ ์ฎ์ด์ jar ํ์ผ๋ก ๋ง๋๋ Task โ ๋ง๋ค์ด์ง ํ์ผ์ build/libs์ ์ ์ฅ๋๋ค!
clean : ํ๋ก์ ํธ๋ฅผ ๋น๋ ์, build ํน๋ ์์ ์ฌ๋ฌ๊ฐ์ง ํ์ผ๋ค์ด ์ ์ฅ๋๊ฒ ๋๋๋ฐ, ์ด ํ์ผ๋ค์ ์ ๊ฑฐํ๋ค! ํ๋ก์ ํธ๊ฐ ๊ผฌ์์ ๋, ์ด๊ฑธ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ๋ฅผ refreshํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค!
gradle Task์ ์ฌ์ฉํด์ ํ๋ก์ ํธ ๋น๋, ์คํ ํ๊ธฐ ์ํ ๋จ๊ณ
gradle compileJava โ gradle run โ gradle jar : ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ์ ์งํ โ ํ๋ก์ ํธ main ์คํ โ ํ๋ก์ ํธ์ jar ํ์ผ์ ์์ฑ
SpringBoot์์ ์ฌ์ฉํ ๋งํ Task
bootRun : springboot ํ๋ก์ ํธ๋ฅผ ์คํ์ํค๋ Task
bootJar / bootWar : jar / war๋ก ํจํค์ง์ ํด์ฃผ๋ Task
๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ์ปค์คํ
ํด์ task์ ๋ง๋ค ์ ์์๊น?
task์ ์ ์ธ
์ฌ์ฉํ ์์
์คํํ๊ธฐ ์ํด์ cmd์์ gradle hello์ ์ ๋ ฅํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธํ ์ ์๋ค
์ฑ๊ณต์ ์ผ๋ก println 'THIS IS A TEST!!!!!' ์ด ์ถ๋ ฅ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
doFirst, doLast์ ํตํ task ์ํ ์์ ์กฐ์
์ด๋ ๊ฒ ์๋ก์ด task ์ ๋ง๋ค์ด๋ณด์๋ค.
doFirst ๋ธ๋ญ ์์ ๋ค์ด๊ฐ๋ ๋ฌธ์ฅ์ด ๊ฐ์ฅ ๋จผ์ ์ถ๋ ฅ๋์ผํ๊ณ , doLast ๋ธ๋ญ ์์ ๋ค์ด๊ฐ๋ ๋ฌธ์ฅ์ด ๊ฐ์ฅ ๋ง์ง๋ง์ ์ถ๋ ฅ๋์ด์ผํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก๋ First / sequence / Last ์์๋๋ก ์ถ๋ ฅํด์ผํจ!
์ค์ ๋ก ์คํํ ๊ฒฐ๊ณผ๋ ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. => -q ์ต์ ์ ๊ฒฐ๊ณผ๋ฌผ๋ง ์ถ๋ ฅํ ์ ์๋๋ก(๋ณด๊ธฐ ํธํ๊ฒ) ๋ค๋ฅธ ์ถ๋ ฅ๋ค์ ์ ๊ฑฐํด์ฃผ๋ ์ญํ
task์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์คํ ๋ฐฉ๋ฒ์ ๊ทธ๋ฅ task๋ฅผ ์คํํ๋ ๊ฒ๊ณผ ๋์ผํ์ง๋ง, ๋ณ์๋ ๋ค์ -P๋ณ์๋ช =๋ณ์๊ฐ ์ด๋ฌํ ํํ๋ฅผ ๋ถ์ฌ์ค์ผ ํ๋ค.
ํ ์คํธ๋ฅผ ์ํด ์๋ก์ด ์ฝ๋๋ฅผ ๋ง๋ค์๋ค.
์คํํ ๋๋ gradle ํ์คํฌ๋ช -P๋ณ์๋ช =๋ณ์๊ฐ
์ด๋ฌํ ๋ฐฉ์์ ์ฌ์ฉํด์ ๋ณ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ์ฑ๊ณต์ ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค
Task์์์ ๋ค๋ฅธ Task์ ์คํํ๋ ๋ฐฉ๋ฒ
tasks.ํธ์ถํ task์ด๋ฆ.execute()
์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ task์ ๋ถ๋ฅด๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ ๊ฒ ํด์ฃผ๋ฉด after task์ doFirst์ ์ํด์ bbb๊ฐ ๋จผ์ ์คํ๋๊ณ ๋ค์์ผ๋ก after๊ฐ ์คํ๋๋ค.
Last updated
Was this helpful?