woowa Kotlin

코프링 맀우 μ•Œμ€ μ²΄ν•˜κΈ°

μ•„λž˜ ν…Œν¬ μ„Έλ―Έλ‚˜ λ‚΄μš©μ„ μš”μ•½ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

Kopring Sample Repository

Kotlin?

코틀린은 λ©€ν‹° ν”Œλž«νΌ μ–Έμ–΄

μ½”λ”© μ»¨λ²€μ…˜

컀밋 λ©”μ„Έμ§€

ktlint

μ½”λ“œμ˜ μ»¨λ²€μ…˜ κ·œμ•½

  • ktlintλŠ” Kotlin Coding Conventionκ³Ό Android Kotlin Style Guideλ₯Ό 기본으둜 λ”°λ₯΄κ³  μžˆλ‹€.

ktlint: μ½”ν‹€λ¦° style, convention κ°€μ΄λ“œ 적용

  • ⭐️ IntelliJ IDEA formatterλ₯Ό ktlint에 맞게 μ„€μ •(ν•΄λ‹Ή ν”„λ‘œμ νŠΈλ§Œ):

    • $ ./gradlew ktlintApplyToIdea

  • IntelliJ μ‚¬μš© λͺ¨λ“  ν”„λ‘œμ νŠΈμ— formatter 적용(λͺ¨λ“  IDEA ν”„λ‘œμ νŠΈμ—):

    • $ ./gradlew ktlintApplyToIdeaGlobally

  • μˆ˜λ™μœΌλ‘œ ktlintλ₯Ό μ΄μš©ν•˜μ—¬ μŠ€νƒ€μΌ 체크: $ ./gradlew clean ktlintCheck

    • ktlInt Check: Tasks β†’ verification β†’ ktlintCheck

  • ⭐️ Git hook을 톡해 ktlint μ„€μ •: 컀밋 전에 ktlintCheck ν…ŒμŠ€νŠΈ μ‹€ν–‰

Kotlin/JVM

Basic

코틀린은 μ•ˆμ „ν•˜κ²Œ μ½”λ”©ν•˜λ„λ‘ μ˜μ‹ν•˜μ§€ μ•Šμ•„λ„ μ•ˆμ „ν•˜κ²Œ μ½”λ”©λ˜λ„λ‘ 지원

  • @NotNull, @Nullable, final μžλ™ 적용

  • μ•ˆμ „ν•˜κ²Œ μ½”λ”©ν•˜κ³  μ‹Άμ§€ μ•Šμ„ 경우 μ˜μ‹μ μœΌλ‘œ μ½”λ”©


μ½”ν‹€λ¦° 컴파일

μ½”ν‹€λ¦° μ½”λ“œλ§Œ μ‚¬μš©ν•  경우

μ½”ν‹€λ¦°, μžλ°” μ½”λ“œλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•  경우

  • λ‘¬λ³΅μ—μ„œ μƒμ„±λœ μžλ°” μ½”λ“œλŠ” μ½”ν‹€λ¦° μ½”λ“œμ—μ„œ μ ‘κ·Ό λΆˆκ°€


Item 1. μ½”ν‹€λ¦° ν‘œμ€€ 라이브러리

μ½”ν‹€λ¦° ν‘œμ€€ 라이브러리λ₯Ό 읡히고 μ‚¬μš©ν•˜κΈ°

μ½”ν‹€λ¦°μ—μ„œ μžλ°”μ™€ κ΄€λ ¨λœ importλ₯Ό μ΅œλŒ€ν•œ μ œκ±°ν•˜λ €κ³  λ…Έλ ₯ν•˜μž

ν‘œμ€€ 라이브러리λ₯Ό μ‚¬μš©ν•˜λ©΄ κ·Έ μ½”λ“œλ₯Ό μž‘μ„±ν•œ μ „λ¬Έκ°€μ˜ 지식과 μ—¬λŸ¬λΆ„λ³΄λ‹€ μ•žμ„œ μ‚¬μš©ν•œ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ˜ κ²½ν—˜μ„ ν™œμš©ν•  수 μžˆλ‹€.

  • AS-IS

  • TO-BE

코틀린은 읽기 μ „μš© μ»¬λ ‰μ…˜κ³Ό λ³€κ²½ κ°€λŠ₯ν•œ μ»¬λ ‰μ…˜μ„ ꡬ별해 제곡

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œμ‘±ν•˜λŠ” μ‹€μ œ μ»¬λ ‰μ…˜μ΄ λ°˜ν™˜

  • λ”°λΌμ„œ ν”Œλž«νΌλ³„ μ»¬λ ‰μ…˜μ„ μ‚¬μš© κ°€λŠ₯


Item 2. μžλ°”λ‘œ μ—­μ»΄νŒŒμΌ

μžλ°”λ‘œ μ—­μ»΄νŒŒμΌν•˜λŠ” μŠ΅κ΄€ 듀이기

μ½”ν‹€λ¦° μˆ™λ ¨λ„λ₯Ό λ†’μ΄λŠ” κ°€μž₯ 쒋은 방법은 μ½”ν‹€λ¦°μœΌλ‘œ μž‘μ„±ν•œ μ½”λ“œκ°€ μžλ°”λ‘œ μ–΄λ–»κ²Œ ν‘œν˜„λ˜λŠ”μ§€ ν™•μΈν•˜κΈ°

  • μ—­μ»΄νŒŒμΌλ‘œ 예기치 μ•Šμ€ μ½”λ“œ 생성을 λ°©μ§€

  • κΈ°μ‘΄ μžλ°” λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ©° λ¬Έμ œκ°€ λ°œμƒν•  λ•Œ λΉ λ₯΄κ²Œ 확인 κ°€λŠ₯

Kotlin to Java

  • Tool > Kotlin > Show Kotlin Bytecode > Decompile

Java to Kotlin

  • Convert Java File to Kotlin File


Item 3. λ‘¬λ³΅λŒ€μ‹  데이터 클래슀

둬볡 λŒ€μ‹  데이터 클래슀 μ‚¬μš©ν•˜κΈ°

  • 데이터 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ equals(), hashCode(), toString(), copy() 등을 μžλ™ 생성

    • μ£Ό μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κΈ°μ€€μœΌλ‘œ μƒμ„±ν•˜κ³ , μ£Ό μƒμ„±μžμ—λŠ” ν•˜λ‚˜ μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜κ°€ μžˆμ–΄μ•Ό 함

    • λ§€κ°œλ³€μˆ˜λŠ” val λ˜λŠ” var둜 ν‘œμ‹œ

  • 데이터 ν΄λž˜μŠ€μ— property λ₯Ό μ„ μ–Έν•˜λŠ” μˆœκ°„ ν•΄λ‹Ή property λŠ” field, Getter, Setter, μƒμ„±μž νŒŒλΌλ―Έν„° μ—­ν• 


plugins


Spring Boot

final 클래슀

  • @SpringBootApplication은 @Configuration을 ν¬ν•¨ν•˜κ³ , μŠ€ν”„λ§μ€ 기본적으둜 CGLIB을 μ‚¬μš©ν•΄μ„œ @Configuration ν΄λž˜μŠ€μ— λŒ€ν•œ ν”„λ‘μ‹œλ₯Ό 생성

  • ν•˜μ§€λ§Œ, final ν΄λž˜μŠ€λŠ” μƒμ†μ΄λ‚˜ μ˜€λ²„λΌμ΄λ“œκ°€ λΆˆκ°€ν•˜λ―€λ‘œ ν”„λ‘μ‹œ 생성이 λΆˆκ°€

  • 상속을 ν—ˆμš©ν•˜κ³  μ˜€λ²„λΌμ΄λ“œλ₯Ό ν—ˆμš©ν•˜λ €λ©΄ open λ³€κ²½μž μΆ”κ°€ ν•„μš”

  • Spring Framework 5.2 λΆ€ν„°λŠ” @Configuration 의 proxyBeanMethod μ˜΅μ…˜μ„ 톡해 ν”„λ‘μ‹œ 생성 λΉ„ν™œμ„±ν™” κ°€λŠ₯

All-open 컴파일러 ν”ŒλŸ¬κ·ΈμΈ

  • 코틀린은 λ‹€μ–‘ν•œ 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ„ 제곡

  • all-open 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ€ μ§€μ •ν•œ μ• λ„ˆν…Œμ΄μ…˜μ΄ μžˆλŠ” ν΄λž˜μŠ€μ™€ λͺ¨λ“  멀버에 open λ³€κ²½μžλ₯Ό μΆ”κ°€

  • μŠ€ν”„λ§μ„ μ‚¬μš©ν•  경우 all-open 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ„ λž˜ν•‘ν•œ kotlin-spring 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš© κ°€λŠ₯

    • @Component, @Transactional, @Async 등이 기본적으둜 μ§€μ •

  • File > Project Structure > Project Settings > Modules > Kotlin > Compiler Plugins μ—μ„œ μ§€μ •λœ μ• λ„ˆν…Œμ΄μ…˜ 확인 κ°€λŠ₯


Item 4. μ§€μ—° μ΄ˆκΈ°ν™”

ν•„λ“œ μ£Όμž…μ΄ ν•„μš”ν•˜λ©΄ μ§€μ—° μ΄ˆκΈ°ν™”λ₯Ό μ‚¬μš©ν•˜μž

μ½”ν‹€λ¦°μ—μ„œ lateinit λ³€κ²½μžλ₯Ό 뢙이면 ν”„λ‘œνΌν‹°λ₯Ό λ‚˜μ€‘μ— μ΄ˆκΈ°ν™”ν•  수 μžˆλ‹€. λ‚˜μ€‘μ— μ΄ˆκΈ°ν™”ν•˜λŠ” ν”„λ‘œνΌν‹°λŠ” 항상 var


jackson-module-kotlin

  • jackson은 기본적으둜 역직렬화 과정을 μœ„ν•΄ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžκ°€ ν•„μš”ν•˜μ§€λ§Œ

    • μ½”ν‹€λ¦°μ—μ„œ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ λͺ¨λ“  λ§€κ°œλ³€μˆ˜μ— κΈ°λ³Έ μΈμžκ°€ ν•„μš”

  • jackson-module-kotlin은 λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžκ°€ 없더라도 직렬화와 역직렬화λ₯Ό 지원

    • 코틀린은 λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μƒμ„±μžμ˜ λͺ¨λ“  λ§€κ°œλ³€μˆ˜μ— κΈ°λ³Έ μΈμžκ°€ ν•„μš”


Kotlin Annotation

데이터 ν΄λž˜μŠ€μ— propertyλ₯Ό μ„ μ–Έν•˜λŠ” μˆœκ°„ field, Getter, Setter, μƒμ„±μž νŒŒλΌλ―Έν„° μ—­ν•  μˆ˜ν–‰

  • @param.JsonProperty : parameter에 μ‚¬μš©λ  이름

  • @get.JsonProperty : getter에 μ‚¬μš©λ  이름


Item 5. λ³€κ²½ κ°€λŠ₯μ„± μ œν•œ

λ³€κ²½ κ°€λŠ₯성을 μ œν•œν•˜μž

μ½”ν‹€λ¦° ν΄λž˜μŠ€μ™€ 멀버가 final인 κ²ƒμ²˜λŸΌ 일단 val둜 μ„ μ–Έν•˜κ³  ν•„μš” μ‹œ var둜 λ³€κ²½ν•˜μž.

  • μƒμ„±μž 바인딩을 μ‚¬μš©ν•˜λ €λ©΄ @EnableConfigurationProperties

    • λ˜λŠ” @ConfigurationPropertiesScan μ‚¬μš©

  • private property and backing property

    • 곡개 API 와 κ΅¬ν˜„ μ„ΈλΆ€ 사항 ν”„λ‘œνΌν‹°λ‘œ λ‚˜λˆŒ 경우

    • private ν”„λ‘œνΌν‹° μ΄λ¦„μ˜ μ ‘λ‘μ‚¬λ‘œ 밑쀄을 μ‚¬μš©(backing property)

  • JVMμ—μ„œλŠ” κΈ°λ³Έ getter, setterκ°€ μžˆλŠ” private ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ ν•¨μˆ˜ 호좜 μ˜€λ²„ν—€λ“œλ₯Ό λ°©μ§€ν•˜λ„λ‘ μ΅œμ ν™”


Persistence

No-arg 컴파일러 ν”ŒλŸ¬κ·ΈμΈ

  • JPAμ—μ„œ μ—”ν‹°ν‹° 클래슀λ₯Ό μƒμ„±ν•˜λ €λ©΄ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžκ°€ ν•„μš”

  • no-arg 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ€ μ§€μ •ν•œ μ• λ„ˆν…Œμ΄μ…˜μ΄ μžˆλŠ” ν΄λž˜μŠ€μ— λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžλ₯Ό μΆ”κ°€

    • JPA, Kotlinμ—μ„œ 직접 ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ λ¦¬ν”Œλž™μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 호좜 κ°€λŠ₯

  • kotlin-spring Compiler Pluginκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ JPAλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 no-arg 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ„ λž˜ν•‘ν•œ kotlin-jpa Compiler Plugin μ‚¬μš© κ°€λŠ₯

    • JPA, Kotlin μ‚¬μš© μ‹œ μžλ™μœΌλ‘œ kotlin-jpa Compiler Plugin μΆ”κ°€

    • @Entity, @Embeddable, @MappedSuperclass κ°€ 기본적으둜 μ§€μ •


Item 6. μ—”ν‹°ν‹°

엔티티에 데이터 클래슀 μ‚¬μš©μ„ ν”Όν•˜μž.

μ–‘λ°©ν–₯ μ—°κ΄€ κ΄€κ³„μ˜ 경우 toString(), hashcode() 둜 λ¬΄ν•œ μˆœν™˜ μ°Έμ‘°κ°€ λ°œμƒ


Item 7. μ‚¬μš©μž μ§€μ • getter

μ‚¬μš©μž μ§€μ • getterλ₯Ό μ‚¬μš©ν•˜μž.

JPA 에 μ˜ν•΄ μΈμŠ€ν„΄μŠ€ν™” 될 λ•Œ, μ΄ˆκΈ°ν™” 블둝이 ν˜ΈμΆœλ˜μ§€ μ•ŠμœΌλ―€λ‘œ, μ˜μ†ν™”ν•˜μ§€ μ•ŠλŠ” ν•„λ“œλŠ” μ‚¬μš©μž μ§€μ • getterλ₯Ό μ‚¬μš©ν•˜μž.


Item 8. Null νƒ€μž… 제거

Null이 될 수 μžˆλŠ” νƒ€μž…μ€ λΉ λ₯΄κ²Œ μ œκ±°ν•˜μž.

Null이 될 수 μžˆλŠ” νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ Null κ²€μ‚¬λ‚˜ !! μ—°μ‚°μžκ°€ ν•„μš”ν•˜λ‹€.

  • μ—”ν‹°ν‹° 클래슀의 idλ₯Ό 0 λ˜λŠ” 빈 λ¬Έμžμ—΄λ‘œ μ΄ˆκΈ°ν™”ν•΄μ„œ Null이 될 수 μžˆλŠ” νƒ€μž…μ„ μ œκ±°ν•˜μž.

  • Optional 보닀 Nullable ν•œ νƒ€μž…μ„ μ‚¬μš©ν•΄μ„œ λΆˆν•„μš”ν•œ java import λ₯Ό μ€„μ΄μž.

  • ν™•μž₯ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ λ°˜λ³΅λ˜λŠ” Null 검사λ₯Ό μ œκ±°ν•  수 μžˆλ‹€.

Test

λ‹¨μœ„ ν…ŒμŠ€νŠΈ

Junit, Mockito 같은 Java 라이브러리둜 ν…ŒμŠ€νŠΈν•˜λ―€λ‘œ Kotlin λ‹€μš΄ μ½”λ“œ μž‘μ„±μ΄ 어렀움

  • μ˜ˆμ™Έ ν…ŒμŠ€νŠΈλŠ” JUnit5의 assertThrows 및 assertDoesNotThrow 같은 Kotlin ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ κ°„κ²°


ν…ŒμŠ€νŠΈ νŒ©ν† λ¦¬

  • ν…ŒμŠ€νŠΈ ν”½μŠ€μ²˜λ₯Ό λ°˜ν™˜ν•˜λŠ” νŒ©ν† λ¦¬ ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

    • ν…ŒμŠ€νŠΈ ν”½μŠ€μ²˜: ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ μ „μ œ 쑰건

  • Kotlin κΈ°λ³Έ 인자λ₯Ό μ‚¬μš©ν•˜λ©΄ λΉŒλ” νŒ¨ν„΄μ²˜λŸΌ λ‹€μ–‘ν•œ 경우λ₯Ό 처리 κ°€λŠ₯

  • κΈ°λ³Έ μΈμžμ™€ 이름 뢙인 인자λ₯Ό 적절히 μ‚¬μš©ν•˜λ©΄ ν…ŒμŠ€νŠΈν•˜λ €λŠ” 관심사λ₯Ό λ“œλŸ¬λ‚΄λŠ” 데 μ‚¬μš© κ°€λŠ₯


ν…ŒμŠ€νŠΈ ν™•μž₯ ν•¨μˆ˜

ν™•μž₯ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 더 μ‰½κ²Œ ν‘œν˜„

ν™•μž₯ν•¨μˆ˜λ‘œ κ²€μ¦ν•˜κ³ μž ν•˜λŠ” 뢀뢄에 가독성 ν–₯상


Kotest μ–΄μ„€μ…˜

πŸ‘ŽπŸ» ν…ŒμŠ€νŠΈ μ–΄μ„€μ…˜

일뢀 μ–΄μ„€μ…˜μ΄ μ‹€νŒ¨ν•˜λ”λΌλ„ ν…ŒμŠ€νŠΈκ°€ μ¦‰μ‹œ μ€‘μ§€λ˜μ§€ μ•Šκ³ , λκΉŒμ§€ 검증

  • μ–΄λ–€ ν”„λ‘œνΌν‹° λ•Œλ¬Έμ— μ‹€νŒ¨ν–ˆλŠ”μ§€ λ°”λ‘œ μ•Œμ•„μ±„κΈ° 어렀움

μΈμŠ€ν„΄μŠ€λ₯Ό 데이터 클래슀둜 λ§Œλ“€κ³  λΉ„κ΅ν•˜λŠ” 것을 ꢌμž₯

주둜 JUnit의 Assertions λŒ€μ‹  읽기 μ‰¬μš΄ AssertJ의 Assertionsλ₯Ό μ‚¬μš©

πŸ‘πŸΌ Kotest μ–΄μ„€μ…˜

  • Kotest μ–΄μ„€μ…˜μ€ κ°„κ²°ν•˜κ³  κΈ°μ‘΄ JUnit5와 혼용 κ°€λŠ₯

  • 슀마트 캐슀트 같은 Kotlin κΈ°λŠ₯을 지원

    • ν•œ 번 슀마트 μΊμŠ€νŒ… λ˜μ—ˆλ‹€λ©΄ null을 닀루지 μ•Šμ•„λ„ λœλ‹€.

Kotlinμ—μ„œ Kotestκ°€ κ°€μž₯ 많이 μ‚¬μš©

  • λ‹€μ–‘ν•œ μŠ€νƒ€μΌμ˜ ν…ŒμŠ€νŠΈ λ ˆμ΄μ•„μ›ƒμ„ 제곡

    • κ·Έ μ€‘μ—μ„œλ„ StringSpec을 μ‚¬μš©ν•˜λ©΄ μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

λͺ¨μ˜ ν…ŒμŠ€νŠΈ

MockK

πŸ‘ŽπŸ» Mockito

  • Mockito final ν΄λž˜μŠ€μ™€ final λ©”μ„œλ“œλŠ” λͺ¨μ˜ λΆˆκ°€

  • Kotlin ν™•μž₯ ν•¨μˆ˜λŠ” Java의 정적 λ©”μ„œλ“œμ΄λ©° MockitoλŠ” 이λ₯Ό μŠ€ν… λΆˆκ°€

  • μ΅œμƒμœ„ ν•¨μˆ˜λŠ” νŠΉμ • ν΄λž˜μŠ€μ— μ†ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μŠ€ν… λΆˆκ°€

πŸ‘πŸΌ MockK

  • DSL 기반 Kotlin λͺ¨μ˜ 라이브러리

  • μ½”λ“œ 기반, μ• λ„ˆν…Œμ΄μ…˜ 기반 λ“± λŒ€λΆ€λΆ„ Mockito와 동일

βœ… MockKλ₯Ό μ΄μš©ν•œ 연쇄 μŠ€ν„°λΉ™

MockK둜 정적 ν•¨μˆ˜λ₯Ό λͺ¨μ˜ν•˜μ§€ μ•Šκ³  ν™•μž₯ ν•¨μˆ˜λ₯Ό μŠ€ν…ν•˜μ—¬ λ‚΄λΆ€μ˜ 멀버 ν•¨μˆ˜λ₯Ό μŠ€ν…ν•˜λŠ” 방법

  • 도ꡬ가 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€κ³  ν•΄μ„œ 항상 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€

  • κ°€μ§œ 객체λ₯Ό μ‚¬μš©ν•˜λŠ” 것도 쒋은 방법

πŸ‘ŽπŸ» Junit 5 + Mockito

πŸ‘πŸΌ Kotest + MockK


Kotestλ₯Ό μ΄μš©ν•œ λͺ¨μ˜ ν…ŒμŠ€νŠΈ

BDDλ₯Ό μ§€μ›ν•˜λŠ” BehaviorSpec, DescribeSpec이 쑴재

  • ν…ŒμŠ€νŠΈκ°€ ν•˜λ‚˜μ˜ λ¬Έμ„œλ‘œμ„œ λ”μš± 풍뢀

  • 쀑첩 ν…ŒμŠ€νŠΈλŠ” ν…ŒμŠ€νŠΈ 수λͺ… μ£ΌκΈ°λ₯Ό μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”

Kotest 수λͺ…μ£ΌκΈ°

  • Given, When, Then 을 μ΄λ£¨λŠ” λͺ¨λ“  것을 beforeSpec, afterSpec으둜 listen

  • Given, When, Then λ§Œμ„ λ³Έλ‹€λ©΄ Container 라고 λΆ€λ₯΄κ³ 

    • beforeContainer, afterContainer λ©”μ„œλ“œλ‘œ 수λͺ…μ£ΌκΈ° 관리 κ°€λŠ₯

  • Then 은 beforeEach, afterEach λ©”μ„œλ“œλ‘œ 수λͺ…μ£ΌκΈ° 관리 κ°€λŠ₯


Kotest의 격리 λͺ¨λ“œ

KotestλŠ” SingleInstance, InstancePerLeaf, InstancePerTest μ„Έ κ°€μ§€ 값이 쑴재

  • 기본은 SingleInstance 이며 ν…ŒμŠ€νŠΈ 상황에 맞게 격리 λͺ¨λ“œλ₯Ό 선택

  • ex. ν…ŒμŠ€νŠΈ 클래슀 전체에 λͺ¨μ˜ 객체λ₯Ό λ§Œλ“œλŠ” 데 λΉ„μš©μ΄ 많이 λ“ λ‹€λ©΄ SingleInstanceλ₯Ό μ„ νƒν•˜κ³ , clearMocks()을 ν˜ΈμΆœν•˜λŠ” 것이 더 λ‚˜μ„ 수 μžˆλ‹€.

톡합 ν…ŒμŠ€νŠΈ

Spring 5.2λΆ€ν„° @TestConstructor μ‚¬μš© μ‹œ μƒμ„±μžλ₯Ό ν†΅ν•œ μ£Όμž…μ΄ κ°€λŠ₯

  • KotestλŠ” Spring 톡합 ν…ŒμŠ€νŠΈλ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•΄ SpringExtenstion을 제곡

  • λ³„λ„μ˜ μ• λ„ˆν…Œμ΄μ…˜ 없이 μƒμ„±μž μ£Όμž…μ΄ κ°€λŠ₯ν•˜λ©°, SpringExtenstion을 ν†΅ν•΄μ„œ νŠΈλžœμž­μ…˜ 둀백도 κ°€λŠ₯

인수 ν…ŒμŠ€νŠΈ

μ‚¬μš©μž κ΄€μ μ—μ„œ κΈ°λŠ₯이 μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•œ ν…ŒμŠ€νŠΈ

  • 일반적으둜 μ‚¬μš©μž μŠ€ν† λ¦¬μ— 따라 Given-When-Then μŠ€νƒ€μΌλ‘œ μž‘μ„±

  • μ—°κ΄€ 관계가 λ³΅μž‘ν• μˆ˜λ‘ ν…ŒμŠ€νŠΈ ν”½μŠ€μ²˜ 생성이 μ–΄λ €μ›Œμ§

인수 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ DSL

  • μ—°κ΄€ 관계λ₯Ό 도메인에 νŠΉν™”λœ μ–Έμ–΄λ‘œ ν‘œν˜„ν•˜κ³ , ν•„μš”ν•œ 데이터가 μƒμ„±λ˜λ„λ‘ ν•  수 μžˆλ‹€.

  • μ½”λ“œλ₯Ό 처음 μ ‘ν•˜λŠ” μ‚¬λžŒλ“€μ˜ 도메인 ν•™μŠ΅μ— λ§Žμ€ 도움이 λœλ‹€.

뢀둝

Kover

  • IntelliJ, JaCoCo μ—μ΄μ „νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” Kotlin μ½”λ“œ 컀버리지 도ꡬ

  • Kotlin이 μƒμ„±ν•œ λ°”μ΄νŠΈμ½”λ“œλ‘œ μΈ‘μ •ν•˜λ©° 인라인 ν•¨μˆ˜μ™€ 같이 JaCoCo둜 μΈ‘μ •ν•  수 μ—†λŠ” μ˜μ—­λ„ μΈ‘μ •

Last updated