์๋ ํ์ธ์ ๐
์ ๊ฐ ์๋ ๋ด์ฉ์ ์ดํดํ๊ธฐ ์ฝ๊ณ , ์ฌ๋ฏธ์๊ฒ ์ค๋ช ๋๋ ค ์ฌ๋ฌ๋ถ๋ค์ด ์ฑ์ฅํ์ค ๋ ํ๋ณตํจ์ ๋๋ผ๋ ๊ฐ๋ฐ์ ์ตํํ์ ๋๋ค.
(ํ) ์บ์นํ ์ด๋ธ[์๋] ์ํํธ์จ์ด ์์ง๋์ด
(์ ) ์คํํธ์ ์ํํธ์จ์ด ์์ง๋์ด ๋ฆฌ๋
(์ ) ๋ฐฐ๋ฌ์๋ฏผ์กฑ[์ฐ์ํํ์ ๋ค] ์ํํธ์จ์ด ์์ง๋์ด
(๊ต์กํ๋) Next Step ๋ฆฌ๋ทฐ์ด ๋ค์ ์ฐธ์ฌ, ๊ณต๊ธฐ๊ด & ์คํํธ์ ๊ฒฝ์ง๋ํ ๊ฐ์ฌ ๋ฐ ๋ฉํ , ์คํ๋ฅดํ ์ฝ๋ฉํด๋ฝ ๋ฉํ
ํ๊ตญ๊ณผํ๊ธฐ์ ์ (KAIST) ์กธ์
Courses
Reviews
- Java to Kotlin Starter Guide for Java Developers
- Java to Kotlin Starter Guide for Java Developers
- Java to Kotlin Starter Guide for Java Developers
hjun2306049803
ยท
Real-world! Developing a library management application with Kotlin and Spring Boot (Refactoring a Java project)Real-world! Developing a library management application with Kotlin and Spring Boot (Refactoring a Java project)- Java to Kotlin Starter Guide for Java Developers
Posts
Q&A
companion object
์๋ ํ์ธ์! KMC๋! ๐๊ผญ ๊ทธ๋ ์ง๋ ์์ต๋๋ค! ๋ณดํต data clas ๋ฅผ ํ์ฉํ DTO ๊ฐ๋ ์ด ์ธ์คํด์คํ๋ฅผ ์ง์ ํ ์ผ์ด ๋ง๋ค ๋ณด๋ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ๋ค์ด๊ฐ์ ๋ฟ, ์ค์ ๋ก๋ ํ์ฉํ๊ธฐ์ ์ ์ ํ ๊ณณ์ด๋ผ๋ฉด ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ด๋๋ ์ ์ฉํ๋ ํธ์ ๋๋ค!๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๐
- 0
- 2
- 24
Q&A
Custom ๋ ํ์งํ ๋ฆฌ ํ์
์๋ ํ์ธ์! KMC๋~ ๐ ์ข์ ์ง๋ฌธ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.ํ๋์ฉ ๋ต๋ณ ๋๋ ค ๋ณด๋ฉด! ์ ๋ ์ฌ์ค Impl ํ์์ ์์ ํ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ช ๋ ์ ์ Querydsl์ ์ฌ์ฉํ ๋ ์ฐ๋ ๋ฐฉ์์ด๋ผ๊ณ ๋ง ์๊ณ ์๊ณ , JPAQueryFactory๋ฅผ ์ง์ ์ฃผ์ ๋ฐ์ ์ฒ๋ฆฌ ํ๋ ๋ฐฉ์์ด ํจ์ฌ ํธํด์ ๊ทธ ๋ฐฉ์์ ์ ํธํ๊ณ ์์ด์! โบ ๊ตณ์ด ๋ฐ์ง๋ฉด Impl ํ์์ ์ธ ๊ฒฝ์ฐ ํ๋์ Repository ์์ SimpleJpaRepository ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ (ex. save) ์ ํ ๋ฒ์ ์ธ ์ ์๋ค๋ ์ ์ ์ด ์๊ฒ ๋ค์ ๋ํ ์ ๋ ์กฐํ ๊ธฐ๋ฅ์ join ๊ณผ ๋ฌด๊ดํ๊ฒ ๋ฌด์กฐ๊ฑด Querydsl๋ก ์์ฑํ๋ ํธ์ ๋๋ค. ๋จ์ํ Spring Data JPA ์ ๋ช ๊ฐ์ง ์์ฌ์ด ์ ์์๋ ์๊ฐ๋๋ ธ๋ ๊ฒ์ฒ๋ผ ์กฐํ ๊ธฐ๋ฅ์ Querydsl ๊ตฌํ์ด ํจ์ฌ ํธํ๋ค๊ณ ์๊ฐํด์์! ์์ฆ์ AI ๋๊ตฌ๊ฐ ๋ง์ด ๋ฐ์ ํด Spring Data JPA์ ์ ์ธ์ ํจ์ findByXX ์ '๊ฐ๋จํ๋ค๋' ์ฅ์ ๋ ๋ง์ด ์ค์ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๊ฐ ๋ง์๋๋ฆฐ ๋ด์ฉ์ด ์ ๋ต์ ์๋๊ณ , ๊ฐ์ธ์ ์ ์๊ฒฌ์ ๊ณต์ ๋๋ฆฐ ์ ๋์ ๋๋ค!๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๐
- 0
- 2
- 23
Q&A
๊ฐ์ฌ๋
์๋ ํ์ธ์! KMC๋~ โบ ์ข์ ์ง๋ฌธ ์ด์๋ค์~๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด ์์ธ ํด๋์ค๋ฅผ ์ ์ ํ๊ฒ ๋ค๋ฃจ๊ณ ์์ผ์ ๊ฒ ๊ฐ์์! ์ ์ญ์ custom exception class๊ฐ ๊ณ์ํด์ ์๊ธฐ๋ ๊ฒ ๋ณด๋ค๋ ํ๋์ ์์ธ ํด๋์ค์ ์์ธ case๋ฅผ ๋ค๋ฃจ๋ enum์ ์กฐํฉ์ ์ ํธํ๋ ํธ์ ๋๋ค๋ฌผ๋ก ๋์ ธ์ง ์์ธ๋ฅผ ๋ง์ํด์ฃผ์ ControllerAdvice์์ ์ก๊ฒ ๋๊ณ ์~ ๋ณด๋ค ๋ํ ์ผํ๊ฒ๋ ์์ธ ๊ฒฝ์ฐ๋ฅผ ์ด๋ป๊ฒ ๋๋์ง ํ์ค ์์ธ์ custom ์์ธ๋ฅผ ์ธ์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง ๋ฑ๋ ๊ณ ๋ฏผํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.ํ์ ์์๋ ๊ฐ๋ฐ์ ๋ถ๋ง๋ค ์ฑํฅ์ด ๋ค๋ฅด์ ์ ๋ฌด์กฐ๊ฑด ์ ํด์ง ๊ท์น์ ์๋ ๊ฒ ๊ฐ์์! ๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค~ ๐
- 0
- 1
- 28
Q&A
๊ฐ์ ๋ณต์ตํ๋ฉด์ ์๊ธด ์ง๋ฌธ
์๋ ํ์ธ์!! โบ ์ธ์ ๋ ๊ทธ๋ ๋ฏ ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.ํ๋์ฉ ๋ต๋ณ ๋๋ ค ๋ณด๊ฒ ์ต๋๋ค!์ด๋ฌ๋ฉด ์๋์ผ๋ก getter/setter๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ์ ๋ค๊ณ ํ์ จ๋๋ฐ์. ์ ๋ ์ด๊ฒ์ด ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋๊ฒ ์๋๋ผ ๋น์ฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ฉด ํ๋กํผํฐ ์ ๊ทผ ์ ์ด์๊ฐ public์ด๋๊น์!์๋ฐ๋ public์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ฝํ๋ฆฐ์ฒ๋ผ ํ๋์ ์ ๊ทผํด์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐ์ด ๋๋๋ฐ์. ์ด๋ฐ ์ผ์ด์ค์ ๋ํด์ ํํ๋์ ์๊ฒฌ์ ์ข ๋ ๋ฃ๊ณ ์ถ์ต๋๋ค๋ ์๋ง ์ด๋ฐ ์๊ฒฌ์ด์ ๊ฒ ๊ฐ์์!public class Person { public String name; public int age; }์ฒ๋ผ Java ์์๋ ํผ๋ธ๋ฆญ ํด๋์ค + ํผ๋ธ๋ฆญ ํ๋๋ฅผ ๊ฐ๊ณ ์๋ค๋ฉด ์๋ ์ฝ๋์ ๋ค๋ฅผ๊ฒ ์๋๋ฐ์ ๊ตณ์ด ๊ฐ์์์class Person( val name: String, val age: Int, )๋ผ๋ ์ฝ๋๋ฅผ "์๋์ผ๋ก getter/setter๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋ค" ๋ผ๊ณ ํํํ๋๊ฐ? ์ด์ฐจํผ ๊ทธ๊ฒ ๊ทธ๊ฑฐ ์๋๊ฐ? ์ด์ ๋ํ ์ ์๊ฐ์ ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ๊ทธ๋ด ์ ์์ด๋ ์ค์ ์ฝํ๋ฆฐ์ด .class ๋ก ๋ณํ๋๋ ์ํฉ์์ ๋์ํ๋ ๊ตฌ๋ฌธ์ ์ ํํ ์๋ ค๋๋๊ฒ ์ข๋ค๊ณ ์๊ฐํ์ด์. ์ด๋ฐ ๋ด์ฉ์ ์ ์๊ณ ์์ด์ผ custom getter ์ ๊ฐ์ ๊ฐ๋ ๋ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค๊ณ ์๊ฐํ๊ฑฐ๋ ์~ ์ถฉ๋ถํ ํ๋ฉด์ ์ผ๋ก ๋ค๋ฅผ๊ฒ ์๋ ๊ฒ์ฒ๋ผ ๋๋ผ์ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. โบ ๋ํ, ๋น์ฐํ ์ฝํ๋ฆฐ์์๋ getter๋ฅผ ํธ์ถํ๊ฒ ์ง๋ง ํ๋ ์์ฒด๋ฅผ private์ผ๋ก ๋์ง ์์ผ๋ฉด ๊ฐ์ฒด์งํฅ ์์น์ค์ ํ๋๋ก ์บก์ํ๊ฐ ์ข์ง ๋ชปํ๋ค๋ ํ๋จ์ด ๋ค๋๋ผ๊ตฌ์! ๋ํ ์ฝํ๋ฆฐ์์๋ ์ ๊ทผ์ ์ด์๋ฅผ private์ผ๋ก ๋๋ฉด ๋นํํ ์ด์ผ๊ธฐ์ง๋ง ๊ฐ์์์ ์ค๋ช ์ฃผ์ ๊ฒ์ฒ๋ผ ์ ๊ทผ์ด ์๋์ ๊ฐ์ getter/setter๋ฅผ ๋ง๋ค์ด์ผ ํ๋๋ฐ ์ด๊ฒ์ ๋ํด๋ ๋ฃ๊ณ ์ถ์ต๋๋ค.๋ค์์ผ๋ก ์ด ๋ด์ฉ์ ๋ํด์๋ ๋ง์์ ๋๋ ค๋ณด๋ฉด, "์บก์ํ" ์ ๋ํ ์ฌ๋๋ค์ ์๊ฐ์ด ๋ชจ๋ ๋ค๋ฅผ ์ ์๋ค๊ณ ์๊ฐํด์. ์ ๋ ํ๋ ์์ฒด๊ฐ private ์ด๋ผ๋ฉด ๋น์ฐํ ์ข์ง๋ง ๋ง์ฝ getter๊ฐ ๋ฐ๋์ ํ์ํ ์ํฉ์ด๋ผ๋ฉด, ์ด๊ฒ์ด ์บก์ํ๋ฅผ ํฌ๊ฒ ํด์น๋๊ฐ? ๋ผ๊ณ ์๊ฐํ์ ๋ ๊ทธ๋ ์ง ์๋ค๊ณ ๋ด ๋๋ค. ๋ฌผ๋ก ์์ ๋ฌด๊ฒฐํ private ํ๋๋ง์ ๊ฐ๊ณ ์๋ ํด๋์ค ๋ณด๋ค์ผ ์บก์ํ๊ฐ ๊นจ์ ธ ์๋ค๊ณ ๋ณผ ์ ์์ง๋ง, ๋งค์ฐ ๋น์ฐํ๊ฒ๋ ์ค๋ฌด์์ private ํ๋๋ง ์ฌ์ฉํด์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ฒฐ๊ตญ ์ด๋ ์ง์ ์์๋ publicํ ์ ๊ทผ์ด ์ด๋์ ๋ ํ์ํ๋ฐ์ ์ ๋ ๊ทธ ํํ์ ์ดgetter๋ public์ ์์ ๋กญ๊ฒ ์จ๋ ๋์ง๋ง, ๊ผญ ํ๋๋ฅผ ๊ฐ์ ธ๊ฐ์ผ๋ง ํ๋์ง (ํํ ์๊ธฐํ๋ ๋๋ฏธํฐ ๋ฒ์น์ ์๊ฐํ ์ ์์ฃ ) ํ ๋ฒ ์ฏค ๋ ๊ณ ๋ฏผํด์ผ ํ๋ค๊ณ ๋ณด๊ณ setter๋ ์ฝ๋ ํธ์์ฑ์ ์ํด public์ผ๋ก ์ด์ด๋๋๋ผ๋ ์ ๋ ๊ฐ์ฒด ๋ฐ๊นฅ์์ ์ฌ์ฉํด์๋ ์๋๋ค๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋๋ง๋ค ์๊ฒฌ์ด ๋ค๋ฅผ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ ํํ์์ ์ ์ฉํ์ ๋ ๊ฐ์ฅ ์ข์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค ์ ์์๋ค๊ณ ์๊ฐํด์! ๋ ผ๋ฆฌ์ ์ผ๋ก ๋๋ฉ์ธ ํ๋ฆ์ ํ๋์ ํ๋ผ๋ฏธํฐ๋ง ์๋ ์์ฑ์๋ ์ฌ์ฉ๋์ง๋ฅผ ์๊ฒ ์ง๋ง ์ด๋ฐ ์ผ์ด์ค์์ ์ฝํ๋ฆฐ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊น์? ์ฝํ๋ฆฐ์์๋ ์ค๋ช ํด์ฃผ์๊ธฐ๋ก ๋ถ์์ฑ์๋ก ๋ง๋ค์ง๋ง ๋ถ์์ฑ์๋ ์ฃผ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋ ๊ผด๋ก ๊ฐ์ผํ๋ค๊ณ ๋ต๋ณ์ ์ฃผ์ ์์!๋ง์ง๋ง์ผ๋ก ์ด ์ง๋ฌธ์ ๋ํด์๋ ๋ต๋ณ ๋๋ฆฌ๋ฉด~ ์ฝํ๋ฆฐ์์๋ default parameter๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.class Person( val name: String, val age: Int = 0, )๊ณผ ๊ฐ์ ํด๋์ค๋ฅผ ์์ฑํ์๋ฉด ๋ฐ์์๋ Person("A") ๋ก ์ด๋ฆ๋ง ์ด๊ธฐํ ํ ์๋ ์๊ณ , Person("A", 10) ์ฒ๋ผ name ๊ณผ age ๋ชจ๋๋ฅผ ์ด๊ธฐํ ํ ์๋ ์์ต๋๋ค.๋งค๊ฐ๋ณ์๊ฐ ์์ ํ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ secondary consturctor๋ฅผ ์ฌ์ฉํด์ผ ๊ฒ ์ง๋ง, ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ณดํต ์ด ์ ์์ ํด๊ฒฐ๋๋๋ผ๊ณ ์~ ๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. โบ ๊ฐ์ฌํฉ๋๋ค.
- 1
- 1
- 38
Q&A
Dispatchers ๋ณ ์ฐจ์ด์ ๊ด๋ จ ์ง๋ฌธ
์๋ ํ์ธ์ ๊ธฐ์ฐ๋! โบ ์์ฃผ ์ข์ ์ง๋ฌธ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.๋ต๋ณ์ ๋๋ฆฌ๊ธฐ์ ์์ https://myungpyo.medium.com/%EC%BD%94%EB%A3%A8%ED%8B%B4-%EB%94%94%EC%8A%A4%ED%8C%A8%EC%B3%90-%EC%A1%B0%EA%B8%88-%EB%8D%94-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0-92db58efca24 ์ ๊ฐ์ ์ข์ ๊ธ๋ ํ ๋ฒ ๋ณด๊ณ ์ค์๋ฉด ์ข์ ๊ฒ ๊ฐ์์! ์ด์ ํ๋์ฉ ๋ต๋ณ ๋๋ ค ๋ณด๊ฒ ์ต๋๋ค.๊ฐ Dispatcher๋ ๋ด๋ถ์ ์ผ๋ก ์ค๋ ๋ํ์ ๊ฐ์ง๊ณ ์๊ณ , ์์ ์ด ๋์ด์์ ๋ ๋ด๋ถ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ค๋ ๋ ํ์์ ์ค๋ ๋์ ์ฝ๋ฃจํด์ ํ ๋นํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋๊ฑธ๊น์?์ด ๋ด์ฉ ๋จผ์ ๋ง์๋๋ ค๋ณผ๊ฒ์!๋ค ๋ง์ต๋๋ค. Default์ IO๋ ๋ด๋ถ์ ์ผ๋ก ์ค๋ ๋ ํ์ ๊ฐ๊ณ ์๊ณ (์๋ฅผ ๋ค์ด IO์ ๊ฒฝ์ฐ ์ต๋ 64๊ฐ๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.) ์ฝ๋ฃจํด์ด ๋ค์ด์ค๋ฉด ๋ด๋ถ์ ์ผ๋ก ๊ด๋ฆฌํ๋ pool ๋ด์ thread์์ ์ฝ๋ฃจํด์ด ์คํ๋๊ณ ์ค๋จ๋์๋ค๊ฐ ๋ค์ pool ๋ด์ ์ด๋ค thread์ ๋ฐฐ์ ํด ์ฝ๋ฃจํด์ ์คํํ๋ ์์ผ๋ก ๋์ํฉ๋๋ค.๋ค๋ง, Default์ ์ค๋ ๋ ํ์ IO๊ฐ ํฌํจํ๊ณ ์๋ ๊ด๊ณ๋ผ (ex. https://sandn.tistory.com/112) IO ์์ ์คํํ๋๋ผ๋ Default ๋ผ๋ thread name์ ํ์ธํ ์๋ ์์ต๋๋ค. Uncofined๋ ์กฐ๊ธ ํน์ดํฉ๋๋ค. ์์ฒด ์ค๋ ๋ ํ์ด ์กด์ฌํ์ง ์๊ณ , suspend ํจ์๊ฐ ์ฌ๊ฐ๋ ๋์ ๊ทธ ์ค๋ ๋์์ ๋ค์ ์ฝ๋๋ฅผ ์ด์ด์ ์คํ์์ผ ๋ฒ๋ ค์! (Default๋ IO๋ suspend ํจ์๊ฐ ์ฌ๊ฐ ๋๋ฉด ๋ค์ ๋ด pool์ ์ค๋ ๋๋ก ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ์คํํ์ฃ ) ์ด๋ฐ ํน์์ฑ ๋๋ฌธ์ Unconfined์ ๊ฒฝ์ฐ ์ค๋ฌด์์ ์ฌ์ฉ ํ ์ผ์ด ์๋ Dispatcher ๋ผ๊ณ ๋ด์ฃผ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๋ถ ์ฝ๋๋ฅผ ๋ดค์๋ ์ค๋ ๋ ๊ด๋ฆฌ ๋ฐฉ์๊ณผ ์ค์ผ์ค๋ง ๋ฐฉ์ ๋ฑ์ ์ฐจ์ด๊ฐ ์๋ ๊ฒ ๊ฐ์๋ฐ, ๊ฐ๊ฐ์ Dispatcher๊ฐ ์ธ์ ์ฌ์ฉ๋๋์ง, ๊ฐ์ฅ ์ฃผ์ํ ์ฐจ์ด์ ์ ๋ญ์ง๊ฐ ๊ถ๊ธํด์!!๊ทธ๋ผ ๋จ์ Dispatcher๋ Default์ IO์ธ๋ฐ์! ๊ฐ๋จํ๊ฒ Default๋ CPU-intensiveํ ์์ , I/O๋ IO-intensiveํ ์์ ์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค. โบ ๋ง์ง๋ง์ผ๋กDefault ๋ IO Dispatcher์ ์ค๋ ๋ ๊ฐ์๋ graceful shutdown ์ค์ ๋ฑ์ ์ปค์คํ ํ ์ ์๋์ง๋ ๊ถ๊ธํฉ๋๋ค!์ ๋ํด์๋ ๋ต๋ณ ๋๋ฆฌ๋ฉด Dispatcher ์์ฒด์ ์ผ๋ก graceful shutdown hook์ ์ ๊ณตํ์ง๋ ์์ง๋ง, ๋ง์น Executors ์ ๋ํด ์ ํฌ๊ฐ ์ง์ graceful shutdown ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ ๊ฒ์ฒ๋ผ ์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.(ex. https://easywritten.com/post/best-way-to-shutdown-executor-service-in-java/ ์์ Java ํ์ค docs์ ์ ํ ์๋ Executor graceful shutdown ๊ตฌํ์ ์ค๋ช ๊ณผ ํจ๊ป ๋ณด์ค ์ ์์ต๋๋ค)// val scope = CoroutineScope(...) suspend fun shutdownGracefully(timeoutMs: Long = 5000) { // ๋ ์ด์ ์ ์์ ์ ๋ฐ์ง ์๊ฒ ํ๊ณ scope.coroutineContext[Job]?.cancel() // ์์๋ค์๊ฒ ์ทจ์ ์ ํธ // ์ผ์ ์๊ฐ ๋ด ์ ์ ์ข ๋ฃ๋ฅผ ๋๊ธฐ withTimeoutOrNull(timeoutMs) { rootJob.join() } // ํ์์ ๋ฏธ์๋ฃ ์์ ๊ฐ์ ์ค๋จ ๋ก์ง ์ถ๊ฐ }์ ๊ฐ์ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์๊ฒ ์ฃ . (๊ตฌํํ๊ธฐ ๋๋ฆ์ ๋๋ค) ์ญ์ ๋น์ทํ๊ฒ custom dispatcher๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ ๋ณดํต์ Executors.newFixedThreadPool(n).asCoroutineDispatcher ๋ฅผ ์ฌ์ฉํ๋ ์ด ๋ ๋ง๋ค์ด์ง๋ Executor ๋ฅผ ์ด์ฉํด graceful shutdown์ ์ง์ด ๋ฃ์ ์ ์์ต๋๋ค โบ ๋ํ Executor ๋ฅผ ์ด์ฉํด custom ์ค๋ ๋ ํ์ ์ง์ ๋ง๋ค์ด ์ค๋ ๋ ์๋ฅผ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ์ฐ์ค ์๋ ์๊ณ ์!์๋๋ฉด ์๋ ์กด์ฌํ๋ Default pool์์ ๊ฐ์๋ฅผ ๊ฒฉ๋ฆฌํ๊ฑฐ๋ ์์ ์ํ๋ thread ์๋ฅผ ๋ง๋ค์ด IO ์ฒ๋ผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋ฐ๋ก limitedParallelism ํจ์์ธ๋ฐ์ ๊ณต์ ๋ฌธ์๋ https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/limited-parallelism.html ์์ ๋ณด์ค ์ ์๊ณ , https://velog.io/@geronimo124/Kotlin-Coroutines-dispatchers ์ ๊ฐ์ ๋ธ๋ก๊ทธ์์๋ Default์ IO์ limitedParallelism ํจ์๋ฅผ ์ฌ์ฉํ์ ๋ ์ด๋ค ๋ฉ์ปค๋์ฆ์ด ์ ์ฉ๋๋์ง ๊ทธ๋ฆผ์ผ๋ก ์ฝ๊ฒ ๋ณด์ค ์ ์์ต๋๋ค! โบ ๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๐
- 0
- 1
- 44
Q&A
Kotlin๊ณผ Java์ ํ์ ์์์ ํ์ฉ
์๋ ํ์ธ์ ๊ฑด์๋! โบ ์ง๋ฌธ ๋จ๊ฒจ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.ํน์ Kotlin + SpringBoot์ ํ๋ก์ ํธ ์์ ์ ์งํํ์ค ๋ ์ ํ Java๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ์ฉํ์๋์ง ์๋๋ฉด Java์ Kotlin์ ๊ฐ์ด ์ฌ์ฉํ๋ ์ง ํ์ ์์ ์ค์ ์ด๋ป๊ฒ ํ์ฉํ์๋์ง ๊ถ๊ธํฉ๋๋ค.๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด ์ ํ๊ถ์ด ์ ์๊ฒ ์๋ค๋ฉด Kotlin + Spring ๋ง ์ฌ์ฉํ๋ ํธ์ด๊ณ ์! ๋ง์ฝ Java๋ก ๋ Legacy ์ฝ๋๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ์ํฉ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ๋์ํ๋ ํธ์ ๋๋ค. (์ ์ง์ ์ผ๋ก Kotlin์ผ๋ก ๋ ์ฝ๋๋ฅผ ๋๋ ค Java์ Kotlin์ ํผ์ฉํ๊ฑฐ๋ Java๋ก ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์ฃ โบ) ์ถ๊ฐ์ ์ผ๋ก apache ๊ฐ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ ๋๋ Kotlin์ผ๋ก ๋ฐ๋ก ์ ์๋ ์ฝ๋๋ฅผ ๊ตณ์ด ์ฌ์ฉํ์ง๋ ์๊ณ Java๋ก ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๋ ํธ์ ๋๋ค. ๋ฌผ๋ก , ๊ฐ๋จํ ํจ์๋ง ํ์ํ๋ค๋ฉด ๊ตณ์ด ์ธ๋ถ ์์กด์ฑ์ ๊ฐ์ ธ์ค์ง ์๊ณ ํด๋น ํจ์๋ง Kotlin์ผ๋ก ์ฎ๊ฒจ์ค๊ฑฐ๋ Kotlin ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ฏธ ์ ๊ณตํ๊ณ ์๋ ๊ธฐ๋ฅ์ ์๋์ง ๊ฒ์ํด๋ณด๊ธฐ๋ ํฉ๋๋ค. ๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๐
- 0
- 2
- 54
Q&A
aws ํ๋ฆฌํฐ์ด ์ ์ฑ
์๋ ํ์ธ์! best11gh๋~ ์ข์ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. โบ๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด, ๊ฐ์ ์ค์ต์ ์ผ๋ง๋ ๋น ๋ฅด๊ฒ ํ๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ด ๋ณด์ด๋๋ฐ์.. ์ ํฌ๊ฐ ์ฌ์ฉํ๋ EC2 ์ ์ฌ์ ์ธ์คํด์ค๋ (t2.micro) ์๊ฐ๋น ์๊ธ์ด 0.0144 USD ๋ก ์ค๋จ ์์ด ์ฌ์ฉํ์ ๋ 1๋ ๋ฐ ์ ๋๋ ์ธ ์ ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.(๋ฌผ๋ก , ํ๋ฆฌํฐ์ด ์ ํ์ด 6๊ฐ์์ด๋ผ ์ค์ ๋ก๋ 6๊ฐ์ ๋ฆฌ๋ฐ์ ๊ฑธ๋ฆด ๊ฒ ๊ฐ๋ค์~) ๋๋ฌธ์ ๊ฐ์๋ฅผ ๋ฃ๋ค๊ฐ ์ค๋์ ๋ฉ์ถฐ ์๊ฐ์ด ์์ฃผ ์ง์ฐ๋๋ ๊ฒฝ์ฐ๋ ํฌ๋ ๋ง ์์์ ์ปค๋ฒ๋๊ธฐ ์ด๋ ต๊ฒ ์ง๋ง ๊ทธ๋๋ ๋ช ๋ฌ ์์ ๊ฐ์๋ฅผ ๋ชจ๋ ๋ง๋ฌด๋ฆฌ ํ์๋ฉด ์ถฉ๋ถํ ํ๋ฆฌํฐ์ด ๋ฆฌ์์ค๋ก ์ค์ต์ด ๊ฐ๋ฅํ์ค ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.๊ตฌ์ฒด์ ์ธ ๋น์ฉ ๋ด์ฉ์https://aws.amazon.com/ko/ec2/pricing/on-demand/์์ ๋ฆฌ์ (region, ์ง์ญ) ์ ์์ธ๋ก ์ ํํ๊ณ micro ์๋ฆฌ์ฆ๋ฅผ ํ์ธํด๋ณด์๋ฉด ๋์ด์! ๋ํ 62๊ฐ ๋ด์ฉ์์ ๋ค๋ฃฌ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋น์ฉ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ๋ชจ๋ ์ฌ์ ํ ์ ์ฉ ๊ฐ๋ฅํ ๋ด์ฉ์ ๋๋ค! โบ ๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- 1
- 2
- 74
Q&A
Querydsl ๋์
์๋ ํ์ธ์! Mola-Mola๋! โบ ์ข์ ์ง๋ฌธ ๊ฐ์ฌํฉ๋๋ค.๋ง์ํด์ฃผ์ ๋ ๊ฑฐ์ ์ฟผ๋ฆฌ๊ฐ ๋ฌด์์ธ์ง์ ๋ฐ๋ผ ๋ต๋ณ์ด ์กฐ๊ธ ๋ฌ๋ผ์ง ๊ฒ ๊ฐ์์~ native raw level ์ฟผ๋ฆฌ์ธ์ง ์๋๋ฉด Spring Data JPA ๋ ๋ฒจ์ ์ฟผ๋ฆฌ์ธ์ง ๋ ๋ค๋ฅธ ๋ฌด์ธ๊ฐ์ธ์ง์ ๋ฐ๋ผ์์!๋ค๋ง ์ ๋ ๊ฐ์ธ์ ์ผ๋ก Querydsl์ ์ข์ํ๋ ์ด์ ๊ฐ ๋ง์ํด์ฃผ์ ์ปดํ์ผ ๋ ๋ฒจ์ ์ค๋ฅ ๊ฐ์ง ์ธ์๋๋์ ์ฟผ๋ฆฌ ์์ฑ์ ํธ์ํจquery์ ์ค๋ณต ์ ๊ฑฐ ์ํํจ ๋ ์๋๋ฐ์! ๋์ ์ฟผ๋ฆฌ๋, https://jojoldu.tistory.com/394 ์์๋ ํ์ธํ ์ ์๋ ๊ฒ์ฒ๋ผ ํ๋์ API ์์ N๊ฐ์ ๋ณ์๋ฅผ ์ฌ์ฉ์ ์ ํ์ ๋ฐ๋ผ ์กฐํฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ง์ฝ raw level SQL์ ์ง์ ์ฌ์ฉํ๋ค๋ฉด, ์ํฉ์ ๋ง๋ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ์์ฑํด์ฃผ๊ฑฐ๋ ๊ฝค ๋์ ํ๋ฅ ๋ก ์ค๋ฅ ์ํ์ฑ์ด ๋์ ๋ฌธ์์ด ์ฐ์ฐ์ ์ฌ์ฉํด์ผ ํ์ฃ . ๋ฐ๋ฉด Querydsl์ ๋งค์ฐ ์ฉ์ดํ ๋์ ์ฟผ๋ฆฌ ์์ฑ์ ๋์์ค๋๋ค. ๋ํ Query๋ฅผ code-level์์ building ํ๋ ๋ฐฉ์์ด๊ธฐ์ ์ค๋ณต ์ ๊ฑฐ๋ ๋งค์ฐ ์ํ ํฉ๋๋ค.์๋ฅผ ๋ค์ด A + B + C ํ ์ด๋ธ์ด ์กฐ์ธ๋ ์ํฉ์์ where c1 = ? ๋ง ์ฐ๋ ์ฟผ๋ฆฌ๊ฐ ์๊ณ , where ์กฐ๊ฑด ์์ด group by ๋ง ๋ง๋ถ์ด๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๊ณ ํ ๋ "A + B + C ํ ์ด๋ธ์ด ์กฐ์ธ๋ ์ํฉ" ์์ฒด๋ฅผ baseQuery๋ก ํ ๋ฒ๋ง ์ ์ธํ ํ ๊ฐ ์ฟผ๋ฆฌ์ ๋ณํ๋๋ ๋ถ๋ถ๋ง JPAQuery์ ์ด์ด ๋ถ์ผ ์ ์์ฃ ์ด๋ฅผ ํ์ฉํ๋ฉด ์ฝํ๋ฆฐ์ ํ์ฅ ํจ์๋ฅผ ์ ์ฉํด ๋ ๊ณ ๋ธ๋ก์ ์กฐ๋ฆฝํ๋ฏ ํ์ ์์ ํ๊ฒ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๊ฒ ๋ฉ๋๋ค. ์์ฃผ ๊ฐ๋จํ ์์๋ก ์๋์ ๊ฐ์ ํ์ฅ ํจ์๋ฅผ ์ ์ธํด๋๋ฉด Querydsl ๊ธฐ๋ฐ ์ฟผ๋ฆฌ ์ด๋๋ paging(pageable)๋ง ๋ง๋ถ์ฌ ํ์ด์ง ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์์ฃ . fun JPAQuery.paging(pageable: Pageable): JPAQuery { return this.limit(pageable.pageSize.toLong()) .offset(pageable.offset) } fun JPAQuery.paging(page: Int, size: Int): JPAQuery { val pageable = Pageable.ofSize(size).withPage(page) return this.limit(pageable.pageSize.toLong()) .offset(pageable.offset) }์์ฃผ ์์ ์์์ด๊ณ ํ์ฉ๋ฒ์ ๋งค์ฐ ๋ฌด๊ถ๋ฌด์ง ํฉ๋๋ค. โบ ์ถ๊ฐ์ ์ผ๋ก "๋ ๊ฑฐ์๋ ๋๊ณ ์ ๊ท ์ถ๊ฐ๋๋ ๋ถ๋ถ๋ง Querydsl๋ฅผ ๋์ ํ๋ ์์ผ๋ก ๊ฐ๋ฉด ๋ ๊น์?"๋ผ๊ณ ๋ง์ํด์ฃผ์ จ๋๋ฐ์~ ์ฐธ ์ด๋ ค์ด ๋ถ๋ถ์ ๋๋ค. ์ํฉ์ ๋ฐ๋ผ์ ๊ท ์ถ๊ฐ๋๋ ๋ถ๋ถ๋ง ์๋ก์ด ๊ธฐ์ ์ ๋์ ํ๊ธฐ์ ๊ท ํผ์ฒ ์ธ์๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ ๋๋ ์๋ก์ด ๊ธฐ์ ์ ์ ์ฉํ๊ธฐ์ต์ ์ ๋คํด ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์ ํ ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ๋ฑ ์ฌ๋ฌ ์ ๋ฝ์ด ์๊ฑฐ๋ ์. ์ด๋ ์ ๊ฐ ๋ต๋ณ ๋๋ฆฌ๊ธฐ ์ด๋ ต๊ณ ํ๋ก์ ํธ ์ํฉ์ ๋ฐ๋ผ, ํจ๊ป ์ผํ๋ ๋ถ๋ค์ ์ฑํฅ์ ๋ฐ๋ผ ๋ง์ด ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๐
- 0
- 2
- 36
Q&A
fetch join DISTINCT ์ค๋ณต์ ๊ฑฐ
์๋ ํ์ธ์! ์ง์๋ โบ ์ข์ ์ง๋ฌธ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.์์ชฝ์์ ๋ค๋ฅด๊ฒ ๋์ํ๋ค๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ์ผ ๊ฒ ๊ฐ์์~SQL distinct ์ ๊ฒฝ์ฐ ๋์ผํ column ์กฐํฉ์ผ๋ก๋ง Database๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฑธ๋ฌ๋ธ๋ค๋ ๋ป์ด๊ณ JPA์์ ์ฌ์ฉํ JPQL distinct๋ join์ ํตํด ๋์จ ์ํฐํฐ๋ฅผ ๋ถ๋ชจ ์ํฐํฐ ๊ธฐ์ค์ผ๋ก ์๋ฒ๊ฐ (์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ด) ๋ฌถ์ด ๋ธ๋ค๋ ๋ป์ด์ฃ !๋ํ ๋ ๋ฐฉ์ ๋ชจ๋ ์ ๊ฐ ์๋ ์ ์์๋ "์์ ํ ์ค๋ณต ์ ๊ฑฐ"๋ฅผ ๋ณด์ฅํฉ๋๋ค. ๊ทธ๋์ GPT๊ฐ ์ด๋ค ๋งฅ๋ฝ์์ ์์ ํ ์ค๋ณต ์ ๊ฑฐ๊ฐ ๋ณด์ฅ๋์ง ์๋๋ค๊ณ ํ์ง๋ ์ ํํ ๋ชจ๋ฅด๊ฒ ๋ค์~ ๐ค ๊ด๋ จํด์ ํ ๊ฐ์ง ์ฃผ์ํ๋ฉด ์ข์ ๋ถ๋ถ์ ๋ฐ์ดํฐ ์์ด ๊ฝค ๋ง์์ง๋ฉด (๊ฐ๋ น ์๋ฐฑ๋ง ๊ฑด์ ๋ถ๋ชจ์ 1:N ๊ตฌ์กฐ๋ฅผ ํ ๋ฒ์ fetch join + distinct ํ๊ฒ ๋๋ฉด...) ์๋ฐฑ๋ง๊ฐ์ ์ปฌ๋ ์ ์ ์ฐ์ฐํด์ผ ํ๊ธฐ์ ์๋๊ฐ ๋๋ ค์ง ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๋ ์ ๊ทผ์ ๋ค์ํ๊ฒ ์์ด ์ํฉ์ ๋ฐ๋ผ ์ ๋นํ ๋ฐฉ๋ฒ์ ์ ํํด์ผ ํฉ๋๋ค. ๊ฐ์ฅ ๋ํ์ ์ผ๋ก๋ ์กฐํ๋๋ ํจํด์ ํ์ธํด ๋ฏธ๋ฆฌ ์ง๊ณํด ๋๋ ๋ฐฉ์๋ ์์ด์~ ๋ต๋ณ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๐
- 1
- 2
- 37
Q&A
ํ์ค ์์ธ์ ์ปค์คํ ์์ธ ์ฌ์ฉ ์ ๋ต ์ง๋ฌธ
์๋ ํ์ธ์ ๋ฏผ์ฐ๋! ๐ ์ข์ ์ง๋ฌธ ๊ฐ์ฌํฉ๋๋ค. AI ์ธํด์ด ๋จ๊ฒจ์ค ๋งํฌ๋ ํ ๋ฒ ์ฝ์ด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ๊ณ ์!๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์ ๋ํด์๋ ์ง์ ์ ์ธ ๋ต๋ณ์ ๋๋ ค๋ณด๋ฉด...์คํ๋ง์ด ์ ๊ณตํ๋ ํ์ค ์์ธ(IllegalArgumentException, IllegalStateException)์ ๋น์ฆ๋์ค ๋ก์ง์ ํํํ๋ ์ปค์คํ ์์ธ(NotFoundUserException) ์ฌ์ด์์ ํ์ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ์ปค์คํ ์์ธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋ํ ๊ธฐ์ค์ ์ ์ ์์๊น์? ์ฐ์ IllegalArgumentException, IllegalStateException ์ ๊ฐ์ Exception class๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ฒ์ด ์๋๋ผ ์๋ฐ (JDK) ์์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๋์ ๊ตฌ๋ถํด์ฃผ์๋ฉด ์กฐ๊ธ ๋ ์ข์ ๊ฒ ๊ฐ์์!๋ํ, ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ ๊ฐ๊ณ ์ปค์คํ ์์ธ๋ฅผ ์ฌ์ฉํ๋ ํธ์ ๋๋ค. ๋งค๊ฐ๋ณ์์ ๋ํ ๊ฒ์ฆ์ด ์คํจํ ๊ฒฝ์ฐ์ด ๊ฒฝ์ฐ๋ ๋งค๊ฐ๋ณ์, ์ฆ Argument๊ฐ ์๋ชป๋์๋ค๋ ์๋ฏธ์ด๊ธฐ์ ํ์ค ์์ธ IllegalArgumentException ๋ฅผ ์ฌ์ฉํฉ๋๋ค.๋ํ ๋ค์ด์จ ๋งค๊ฐ๋ณ์๋ก ์ธํด ํน์ Entity๋ฅผ ์ฐพ์ง ๋ชปํ๋๋ฐ ์์ธ๋ฅผ ๋์ ธ์ผ ํ๋ ๊ฒฝ์ฐ๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ชป๋์ด Entity๋ฅผ ์ฐพ์ง ๋ชปํ์ ํ๋ฅ ์ด ๋๊ธฐ์ IllegalArgumentException ๋ฅผ ์ฌ์ฉํ๋ ํธ์ ๋๋ค.ํน์ ๋ก์ง์ ์ํํ๋ค ๊ฐ์ฒด์ pre state๊ฐ ์๋ชป๋์์ ๊ฒฝ์ฐ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๋ค๋ณด๋ฉด ํน์ ๋ก์ง์๋ precondition ์ด๋ผ ๋ถ๋ฆฌ๋ ๊ฐ์ ์ด ๋ค์ด๊ฐ๋๋ค. ์๋ฅผ ๋ค์ด ์ ํธ๋ฑ์ด ์ด๋ก์์ผ๋ก ๋ฐ๋๊ธฐ ์ํด์๋ ๋นจ๊ฐ์์ด๊ฑฐ๋ ๋ ธ๋์์ด์ด์ผ ํ๋ค๋ ๊ฐ์ ์ด์ฃ . ์ด๋ฐ ๊ฒฝ์ฐ ์์ ์ด๋ก์์ผ๋ก ํ๋ ค๊ณ ํ๋๋ฐ ์ง์ ์ด๋ก์์ด๋ผ๋ฉด, ๋ก์ง ์คํ์ ์ ๊ฐ์ฒด ํ๋ (= ์ํ) ๊ฐ ์๋ชป ๋์๋ค๋ ์๋ฏธ์ด๊ธฐ์ IllegalStateException ์ ์ฌ์ฉํฉ๋๋ค.ํด๋ผ์ด์ธํธ์์ ์์ธ๋ฅผ ๋ถ๊ธฐ ์ฒ๋ฆฌ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋จ์ํ HTTP status๋ก ๋ด์ฉ์ ์ ๋ฌํ๊ธฐ์ ์ถฉ๋ถํ์ง ์๊ณ , ์ํฉ๋ณ๋ก ์ ์ ํ ๋ฌธ๊ตฌ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ ธ์ถํด์ผ ํ๋ค๊ฑฐ๋ FE ๋ก์ง์ ๋ํ ๋ถ๊ธฐ๋ฅผ ํ์์ผํ๋ ๊ฒฝ์ฐ๋ custom JSON์ ๋ด๋ ค์ค์ผ๋ง ํ๊ณ , (๋ณดํต @ControllerAdvice ๊ฐ์ ์น๊ตฌ๋ฅผ ์ฌ์ฉํ์ฃ โบ) ์ด๋ฐ ๊ฒฝ์ฐ๋ ์ปค์คํ ์์ธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.๋ค๋ง, ๋งค๋ฒ ์ปค์คํ ์์ธ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ๋ฒ๊ฑฐ๋กญ๊ณ ํด๋์ค ์๊ฐ ๋์ด๋ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ธฐ์ Exception class๋ 1๊ฐ๋ฅผ ๋ง๋ค๊ณ , ์ํฉ์ ๋ฐ๋ฅธ enum์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋งค์ฐ ์ ํธํฉ๋๋ค.https://velog.io/@jds7979/Spring-%EC%A0%84%EC%97%AD%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-with-EnumGlobal-Exception-Handler ์ ๊ฐ์ ๊ธ์ ์ฐธ๊ณ ํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์! (์ด ๊ธ์ 100% ๋์ํ๋ค๊ธฐ ๋ณด๋ค ์์๋ก ๋ด์ฃผ์๋ฉด ๋์ด์!)๊ฐ์ฌํฉ๋๋ค. ๐
- 0
- 3
- 33






