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