ETC
ํ ์คํธ
์ ๋ ฅ/์ถ๋ ฅ
๊ทธ ๋ฐ์ ์ฝํ๋ฆฐ ๊ธฐ๋ฅ
์คํ๋ง ํ๋ ์์ํฌ
์ฝ๋ฃจํด๊ณผ ๊ตฌ์กฐ์ ๋์์ฑ
ํ
์คํธ
ํ
์คํธ ํด๋์ค ์๋ช
์ฃผ๊ธฐ ์ค์
Junit 5์ ํ ์คํธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ธ ํ ์คํธ ํจ์๋น ํ ๋ฒ ๋์
ํด๋์ค ์ธ์คํด์ค๋น ํ ๋ฒ์ฉ ์ธ์คํด์คํ ํ๊ณ ์ถ๋ค๋ฉด,
@TestInstance
์ ๋ ธํ ์ด์ ์ด๋ junit-platform.properties ํ์ผ์lifecycle.default
์์ฑ์ ์ค์ ํ์.
Junit 5๋ ํด๋์ค์์ @TestInstance
์ ๋
ธํ
์ด์
์ ์ฌ์ฉํด ์๋ช
์ฃผ๊ธฐ๋ฅผ ๋ช
์ํ ์ ์๋ค.
ํ ์คํธ ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ PER_CLASS๋ก ์ค์ ํ๋ฉด ํ ์คํธ ํจ์์ ์๊ณผ ์๊ด ์์ด ํ ์คํธ ์ธ์คํด์ค๊ฐ ๋ฑ ํ๋๋ง ์์ฑ
@TestInstance
๋ฅผ ๊ฐ ํ
์คํธ ํด๋์ค์ ๋ฐ๋ณตํ๋ ๋์ ๋ชจ๋ ํ
์คํธ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ properties ํ์ผ์ ์ค์ ๊ฐ๋ฅ
ํด๋์ค ํจ์ค(src/test/resource)์ junit-platform.properties ํ์ผ์ ์์ฑํ์ฌ ํ ์คํธ ์๋ช ์ฃผ๊ธฐ ์ค์ ๊ฐ๋ฅ
ํ
์คํธ์ ๋ฐ์ดํฐ ํด๋์ค ์ฌ์ฉํ๊ธฐ
์ํ๋ ๋ชจ๋ ์์ฑ์ ์บก์ํํ๋ ๋ฐ์ดํฐ ํด๋์ค ์์ฑํ๊ธฐ
assertAll
ํจ์์ ์ฅ์ ์ Executable ์ธ์คํด์ค์ ๋จ์ธ์ด 1๊ฐ ์ด์ ์คํจํ๋๋ผ๋ Executable ์ธ์คํด์ค๋ฅผ ๋ชจ๋ ์คํ
์ฝํ๋ฆฐ data ํด๋์ค์๋ ์ด๋ฏธ equals ๋ฉ์๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์ด ์์ผ๋ฏ๋ก ํ ์คํธ ํ๋ก์ธ์ค ๊ฐ์ํ
๋จ ํ๋์ assertion์ด ๋ชจ๋ ์์ฑ์ ํ ์คํธ
assertj์์ ์ ๊ณตํ๋ contains ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ปฌ๋ ์ ์ ๋ชจ๋ ์์๋ฅผ ํ์ธํ ์ ์๋ค.
๊ธฐ๋ณธ ์ธ์์ ํจ๊ป ๋์ ํจ์ ์ฌ์ฉํ๊ธฐ
๊ฐ ์ธ์์ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๋๋ก ํด๋์ค๋ฅผ ์์ ํ์ง ๋ง๊ณ
๊ธฐ๋ณธ๊ฐ์ ์์ฑํ๋ ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ถ๊ฐํ์.
์ต์์ ๋ ๋ฒจ์ ์ ํธ๋ฆฌํฐ ํด๋์ค์ ํฉํ ๋ฆฌ ํจ์๋ฅผ ์์น์ํค๋ฉด ํ ์คํธ์์ ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ฌํ์ฉํ ์ ์๋ค.
์ฌ๋ฌ ๋ฐ์ดํฐ์ JUnit 5 ํ
์คํธ ๋ฐ๋ณตํ๊ธฐ
Junit 5์๋ ์ผํ๋ก ๊ตฌ๋ถ๋ ๊ฐ(CSV)๊ณผ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ํฌํจ๋ ์ต์ ๊ณผ ํจ๊ป ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ช ์ํ ์ ์๋ ํ๋ผ๋ฏธํฐํ๋ ํ ์คํธ๊ฐ ์๋ค.
๐๐ป CSV ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ํ๋ฆฌ๋ฏธํฐํ๋ ํ ์คํธ ์ํ
Junit 5์์๋ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ ์๋ค.
๐๐ป ํ๋ผ๋ฏธํฐ ์์ค๋ก์ ์ธ์คํด์ค ํจ์์ ์ ๊ทผ
ํ ์คํธ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธฐ๋ณธ ์ต์ ์ธ Lifecycle.PER_METHOD ๋ผ๋ฉด ํ ์คํธ ๋ฐ์ดํฐ ์์ค ํจ์๋ฅผ ๋๋ฐ ๊ฐ์ฒด ์์ ์์น์์ผ์ผ ํ๋ค.
ํ๋ผ๋ฏธํฐํ๋ ํ
์คํธ์ data ํด๋์ค ์ฌ์ฉํ๊ธฐ
์ ๋ ฅ ๊ฐ๊ณผ ์์ ๊ฐ์ ๊ฐ์ธ๋ data ํด๋์ค๋ฅผ ๋ง๋ค๊ณ
๋ง๋ data ํด๋์ค ๊ธฐ๋ฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ํ ์คํธ ๋ฉ์๋ ์์ค๋ก์ ์ฌ์ฉํ์.
๐๐ป ์ ๋ ฅ๊ณผ ์์๋๋ ์ถ๋ ฅ์ ๋ด๋ ๋ฐ์ดํฐ ํด๋์ค ์ ์
๋ฐ์ดํฐ ํด๋์ค๋ ์ด๋ฏธ toString์ด ์ฌ์ ์๋์ด ์์ผ๋ฏ๋ก
์ ๋ ฅ๊ณผ ์ถ๋ ฅ ์์ ๋ํ๋ด๋ data ํด๋์ค๋ฅผ ์ธ์คํด์คํํ๋ ํ๋ผ๋ฏธํฐํ๋ ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ์์ฑํ ์ ์๋ค.
์
๋ ฅ/์ถ๋ ฅ
use๋ก ๋ฆฌ์์ค ๊ด๋ฆฌํ๊ธฐ
ํ์คํ๊ฒ ๋ฆฌ์์ค๋ฅผ ๋ซ๊ณ ์ถ์ง๋ง ์ฝํ๋ฆฐ์ ์๋ฐ์ try-with-resource ๊ตฌ๋ฌธ์ ์ง์ํ์ง ์๋๋ค.
kotlin.io ํจํค์ง์ use ๋๋ java.io.Reader์
useLines
ํ์ฅ ํจ์๋ฅผ ์ฌ์ฉํ์.
File.useLines
useLines์ ์ฒซ ๋ฒ์งธ ์ ํ์ ์ธ์๋ ๋ฌธ์ ์งํฉ์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ UTF-8
๋ ๋ฒ์งธ ์ธ์๋ ํ์ผ์ ์ค์ ๋ํ๋ด๋ Sequence๋ฅผ ์ ๋ค๋ฆญ ์ธ์ T๋ก ๋งคํํ๋ ๋๋ค
use ํจ์์ ์๊ทธ๋์ฒ
ํ์ผ์ ๊ธฐ๋กํ๊ธฐ
File ํด๋์ค์ ํ์ฅ ํจ์์๋ ์ผ๋ฐ์ ์ธ ์๋ฐ ์ ์ถ๋ ฅ ๋ฉ์๋๋ฟ๋ง ์๋๋ผ ์ถ๋ ฅ ์คํธ๋ฆผ๊ณผ Writer๋ฅผ ๋ฆฌํดํ๋ ํ์ฅ ํจ์๊ฐ ์๋ค.
forEachLine
ํจ์๋ฅผ ์ฌ์ฉํด์ ํ์ผ์ ์ํํ ์ ์๋ค.
ํ์ผ์ด ๋งค์ฐ ํฌ์ง ์๋ค๋ฉด File์
readLines
๋ฅผ ํธ์ถํด ๋ชจ๋ ์ค์ด ๋ด๊ธด ์ปฌ๋ ์ ์ ํ๋ํ ์๋ ์๋ค.useLines
ํจ์๋ฅผ ์ฌ์ฉํด ํ์ผ์ ์ค๋ง๋ค ํธ์ถ๋๋ ํจ์๋ฅผ ์ ๊ณตํ ์ ์๋ค.ํ์ผ์ ํฌ๊ธฐ๊ฐ ์๋ค๋ฉด
readText
๋๋readBytes
๋ฅผ ์ฌ์ฉํด ์ ์ฒด ๋ด์ฉ์ ๊ฐ๊ฐ ๋ฌธ์์ด์ด๋ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ์ฝ์ด์ฌ ์ ์๋ค.
ํ์ผ์ ์กด์ฌํ๋ ๋ด์ฉ์ ๋ชจ๋ ๊ต์ฒดํ๊ณ ์ถ๋ค๋ฉด writeText
ํจ์๋ฅผ ์ฌ์ฉ
File ํด๋์ค์๋ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ appendText
๋ผ๋ ํ์ฅ ํจ์๊ฐ ์๋ค.
writeText
์appendText
ํจ์๋writeBytes
์appendBytes
์ ๊ธฐ๋ก ์์ ์ ์์ํ๋ค.writeBytes
์appendBytes
๋ ๊ธฐ๋ก์ด ๋๋๋ฉดuse
ํจ์๋ฅผ ์ฌ์ฉํด ํ์ผ์ ํ์คํ ๋ซ๋๋ค.
๊ฐ๋ฐ์๋ OutputStreamWriter
์ BufferedWriter
๋ฅผ ๋ฆฌํดํ๋ writer
(printWriter)์ bufferedWriter
ํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
๊ทธ ๋ฐ์ ์ฝํ๋ฆฐ ๊ธฐ๋ฅ
์ฝํ๋ฆฐ ๋ฒ์ ์์๋ด๊ธฐ
์ฝํธ๋ฅผ ์์ฑํด ํ์ฌ ์ฌ์ฉ ์ค์ธ ์ฝํ๋ฆฐ ๋ฒ์ ์ ์๋ ค๋ฉด,
KotlinVersion ํด๋์ค ๋๋ฐ ๊ฐ์ฒด์ CURRENT ์์ฑ์ ์ฌ์ฉํ์.
๐๐ป ์ฝํ๋ฆฐ ๋ฒ์ ๋น๊ตํ๊ธฐ
๋ฐ๋ณต์ ์ผ๋ก ๋๋ค ์คํํ๊ธฐ
์ฃผ์ด์ง ๋๋ค ์์ ์ฌ๋ฌ ๋ฒ ์คํํ๊ณ ์ถ๋ค๋ฉด ์ฝํ๋ฆฐ ๋ด์ฅ repeat ํจ์๋ฅผ ์ฌ์ฉํ์.
์๋ฒฝํ when ๊ฐ์ ํ๊ธฐ
๐๐ป ์ปดํ์ผ๋ฌ์๊ฒ else ์ ์ ์๊ตฌํ๋๋ก ๊ฐ์
์คํ ๊ฐ๋ฅํ ํด๋์ค ๋ง๋ค๊ธฐ
ํด๋์ค์์ ๋จ์ผ ํจ์๋ฅผ ๊ฐ๋จํ๊ฒ ํธ์ถํ๊ณ ์ถ๋ค๋ฉด,
ํจ์๋ฅผ ํธ์ถํ ํด๋์ค์์
invoke
์ฐ์ฐ์ ํจ์๋ฅผ ์ฌ์ ์ํ์.
invoke
์ฐ์ฐ์ ํจ์๋ฅผ ์ ๊ณตํ๊ณ ํด๋์ค ๋ ํผ๋ฐ์ค์ ๊ดํธ๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋์ค ์ธ์คํด์ค๋ฅผ ๋ฐ๋ก ์คํํ ์ ์๋ค.
์ํ๋ค๋ฉด ํ์ํ ์ธ์๋ฅผ ์ถ๊ฐํ invoke ํจ์ ์ค๋ณต๋ ์ถ๊ฐํ ์ ์๋ค.
๊ฒฝ๊ณผ ์๊ฐ ์ธก์ ํ๊ธฐ
์ฝ๋ ๋ธ๋ก์ด ์คํ๋๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ ์๊ณ ์ถ๋ค๋ฉด, measureTimeMillis ๋๋ measureNanoTime ํจ์๋ฅผ ์ฌ์ฉํ์.
measureTimeMillis ํจ์์ ๊ตฌํ
๐๐ป ์ฝ๋ ๋ธ๋ก์ ๊ฒฝ๊ณผ ์๊ฐ ์ธก์ ํ๊ธฐ
๋ ์ ํํ ์ฑ๋ฅ ์ธก์ ์ ์ํ๋ค๋ฉด ์คํ JDK์ ์๋ฐ ๋ง์ดํฌ๋ก๋ฒค์น๋งํฌ ๋๊ตฌJMH, Java Microbenchmark Harnessํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์.
์ค๋ ๋ ์์ํ๊ธฐ
์ค๋ ๋ ํ์ฅ ํจ์์ ์๊ทธ๋์ฒ
๐๐ป ๋ค์์ ์ค๋ ๋๋ฅผ ์์์ ๊ฐ๊ฒฉ์ผ๋ก ์์ํ๊ธฐ
Thread ํ์ฅ ํจ์๋ ์์ ์ ๋ณธ๋ฌธ์์ ์์ฑํ ์ค๋ ๋๋ฅผ ๋ฆฌํดํ๋ฏ๋ก, ์ค๋ ๋์ join ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ชจ๋ ์ค๋ ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถํ๊ฒ ๋ง๋ค ์ ์๋ค.
TODO๋ก ์์ฑ ๊ฐ์ ํ๊ธฐ
๐๐ป TODO ํจ์์ ๊ตฌํ
ํจ์จ์ฑ์ ์ด์ ๋ก ์์ค๋ ์ธ๋ผ์ธ๋์ด ์๊ณ , ํจ์๊ฐ ํธ์ถ๋ ๋ NotImplementedError ๋ฐ์
Random์ ๋ฌด์์ ๋์ ์ดํดํ๊ธฐ
๐๐ป nextInt ํจ์
๐๐ป ์๋ ๊ฐ๊ณผ ํจ๊ป ๋์ ์์ฑ๊ธฐ ์ฌ์ฉํ๊ธฐ
์คํ๋ง ํ๋ ์์ํฌ
์ฝํ๋ฆฐ์ผ๋ก ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ๋ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๊ธฐ์ ๋ค
ํ์ฅ์ ์ํด ์คํ๋ง ๊ด๋ฆฌ ๋น ํด๋์ค ์คํํ๊ธฐ
ํ์ฅ์ ์ํด ์๋์ผ๋ก ํ์ํ ์คํ๋ง ๊ด๋ฆฌ ํด๋์ค๋ฅผ ์ด์ด์ฃผ๋ ์ฝํ๋ฆฐ ์คํ๋ง ํ๋ฌ๊ทธ์ธ์ ๋น๋ ํ์ผ์ ์ถ๊ฐํ์
์ฝํ๋ฆฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ์ผ๋ก ๊ฒฐํฉํ๋ค.
ํด๋์ค๊ฐ open ํค์๋๋ฅผ ์ฌ์ฉํด ํ์ฅ์ ์ํ ์ด๋ฆผ์ผ๋ก ํ์๋์ง ์์ผ๋ฉด ๋ฉ์๋ ์ฌ์ ์ ๋๋ ํด๋์ค ํ์ฅ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์ฝํ๋ฆฐ์ ์ด ๋ฌธ์ ๋ฅผ
all-open
ํ๋ฌ๊ทธ์ธ์ผ๋ก ํด๊ฒฐํ๋ค.all-open
ํ๋ฌ๊ทธ์ธ์ ํด๋์ค์ ํด๋์ค์ ํฌํจ๋ ํจ์์ ๋ช ์์ ์ผ๋ก open ํค์๋๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋ช ์์ ์ธ open ์ ๋ ธํ ์ด์ ์ผ๋ก ํด๋์ค๋ฅผ ์ค์ ํ๋ค.
kotlin-spring
ํ๋ฌ๊ทธ์ธ์ ์๋ ์ ๋
ธํ
์ด์
์ผ๋ก ํด๋์ค๋ฅผ ์ด๋๋ก ์ค์ ๋์ด ์๋ค.
@Component
@Async
@Transactional
@Cacheable
@SpringBootTest
kotlin-spring
์ด ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ด ํ์ํ๋ค๋ฉด all-open ํ๋ฌ๊ทธ์ธ๋ ์ถ๊ฐํ ์ ์์ง๋ง ๊ฑฐ์ ํ์ ์๋ค.
์ฝํ๋ฆฐ data ํด๋์ค๋ก ํผ์์คํด์ค ๊ตฌํํ๊ธฐ
data ํด๋์ค๋ก JPA๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด kotlin-jpa ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ์.
JPA ๊ด์ ์์ data ํด๋์ค๋ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
1๏ธโฃ JPA๋ ๋ชจ๋ ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ์ง ์๋ ์ด์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์์ง๋ง data ํด๋์ค๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋ค.
no-arg ํ๋ฌ๊ทธ์ธ์ ์ธ์๊ฐ ์๋ ์์ฑ์๋ฅผ ์ถ๊ฐํ ํด๋์ค๋ฅผ ์ ํํ ์ ์๊ณ
๊ธฐ๋ณธ ์์ฑ์ ์ถ๊ฐ๋ฅผ ํธ์ถํ๋ ์ ๋ํ ์ด์ ์ ์ ์ํ ์๋ ์๋ค.
kotlin-jpa ํ๋ฌ๊ทธ์ธ์ no-arg ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด ์ก๊ณ , ์๋ ์ ๋ ธํ ์ด์ ์ผ๋ก ์๋ ํ์๋ ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ถ๊ฐํ๋ค.
@Entity
@Embeddable
@MappedSuperclass
2๏ธโฃ val ์์ฑ๊ณผ ํจ๊ป data ํด๋์ค๋ฅผ ์์ฑํ๋ฉด ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋๋ฐ, JPA๋ ๋ถ๋ณ ๊ฐ์ฒด์ ๋๋ถ์ด ์ ๋์ํ๋๋ก ์ค๊ณ๋์ง ์์๋ค.
์ํฐํฐ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ์ฝํ๋ฆฐ ํด๋์ค์ (data ํด๋์ค ๋์ ) ํ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ์์ฑ์ var ํ์ ์ ์ฌ์ฉํ๋ ๋จ์ ํด๋์ค ์ฌ์ฉ์ ์ถ์ฒ
๐๐ป ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๋ก ๋งคํ๋๋ ์ฝํ๋ฆฐ ํด๋์ค
ref. Building web applications with Spring Boot and Kotlin
์์กด์ฑ ์ฃผ์
ํ๊ธฐ
์ฝํ๋ฆฐ ์คํ๋ง์ ์์ฑ์ ์ฃผ์ ์ ์ ๊ณตํ์ง๋ง ํ๋ ์ฃผ์ ์๋ lateinit var ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ ํ์ ์ธ ๋น์ ๋ ํ์ฉ ํ์ ์ผ๋ก ์ ์ธํ๋ค.
ํด๋์ค์์ ์์ฑ์๊ฐ ํ๋๋ฟ์ด๋ผ๋ฉด ์คํ๋ง์ด ์๋์ผ๋ก ํด๋์ค์ ์ ์ผํ ์์ฑ์์ ๋ชจ๋ ์ธ์๋ฅผ ์๋์ผ๋ก ์คํ ์์ด์ด๋งํ๊ธฐ ๋๋ฌธ์ @Autowired ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
๐๐ป ์คํ๋ง์ผ๋ก ์์กด์ฑ ์คํ ์์ด์ด๋งํ๊ธฐ
ํด๋์ค์ ์์ฑ์ด ํ์๊ฐ ์๋๋ผ๋ฉด ํด๋น ์์ฑ์ ๋ ํ์ฉ ํ์ ์ผ๋ก ์ ์ธํ ์ ์๋ค.
๐๐ป ์ ํ ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ๋ ์ปจํธ๋กค๋ฌ ํจ์
Last updated