Skip to content

Commit

Permalink
Merge pull request #1228 from eastperson/master
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions[bot] authored Jul 15, 2023
2 parents d74f786 + dfe1450 commit 0a3538c
Showing 1 changed file with 97 additions and 0 deletions.
97 changes: 97 additions & 0 deletions EP/Kotlin의 check()와 require().md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Overview

μ½”ν‹€λ¦°μ—μ„œλŠ” check와 requireλΌλŠ” ν•¨μˆ˜λ₯Ό μ œκ³΅ν•œλ‹€. **[μ΄νŽ™ν‹°λΈŒ μ½”ν‹€λ¦° - μ•„μ΄ν…œ5. μ˜ˆμ™Έλ₯Ό ν™œμš©ν•΄ μ½”λ“œμ— μ œν•œμ„ 걸어라]** μ—μ„œ μžμ„Έν•œ λ‚΄μš©μ΄ κΈ°μž¬λ˜μ–΄μžˆλ‹€.

> By usingΒ `require`Β andΒ `check`Β we get three things
>
> 1. We are able to validate function arguments and state.
> 2. We are able to throw particular exceptions depending on the case.
> 3. We are able to write idiomatic Kotlin code that is clean and readable.
- `check()`λŠ” μ•ˆμ— μžˆλŠ” ꡬ문이 `false`일 λ•Œ `IllegalStateException`을  λ°œμƒμ‹œν‚¨λ‹€.
- `require()`λŠ” μ•ˆμ— μžˆλŠ” ꡬ문이 `false`일 λ•Œ `IllegalArgumentException`을 λ°œμƒμ‹œν‚¨λ‹€.
- `checkNotNull`, `requireNotNull` 둜 `null` 체크λ₯Ό ν•  수 있으며 이후 `null`이 μ•„λ‹ˆλΌκ³  κ°€μ •ν•œλ‹€. λ”°λΌμ„œ 슀마트 캐슀트λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

check μ˜ˆμ‹œ

```kotlin
fun viewReview(reviewId: Long) {
val review = reviewRepository.findById(reviewId)
check(review.isPublic()) { "곡개된 리뷰가 μ•„λ‹™λ‹ˆλ‹€." }
review.addViewCount()
return review
}
```

require μ˜ˆμ‹œ

```kotlin
fun validateReviewModifyForm(reviewModifyRequest: ReviewModifyForm) {
val review = reviewRepository.findById(reviewModifyRequest.reviewId)

require(reviewModifyRequest.content.isNotBlank() && reviewModifyRequest.content.length < MAX_CONTENT_LENGTH) {
"리뷰 λ‚΄μš©μ€ κ³΅λ°±μ΄κ±°λ‚˜ 1000자λ₯Ό μ΄ˆκ³Όν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€."
}
review.modify(content = reviewModifyRequest.content)

// μƒλž΅
}
```

# μ΄νŽ™ν‹°λΈŒ μ½”ν‹€λ¦° μ•„μ΄ν…œ5 - μ˜ˆμ™Έλ₯Ό ν™œμš©ν•΄ μ½”λ“œμ— μ œν•œμ„ 걸어라

μ½”λ“œμ˜ λ™μž‘μ— μ œν•œμ„ κ±°λŠ” 방법

- require: argumentλ₯Ό μ œν•œν•  수 μžˆλ‹€.
- check: μƒνƒœμ™€ κ΄€λ ¨λœ λ™μž‘μ„ μ œν•œν•  수 μžˆλ‹€.
- assert: μ–΄λ–€ 것이 true인지 확인할 수 μžˆλ‹€. assert ν…ŒμŠ€νŠΈ λͺ¨λ“œμ—μ„œλ§Œ μž‘λ™ν•œλ‹€.
- return λ˜λŠ” throw와 ν•¨κ»˜ ν™œμš©ν•˜λŠ” Elvis μ—°μ‚°μž

## μž₯점

- μ œν•œμ„ κ±Έλ©΄ λ¬Έμ„œλ₯Ό 읽지 μ•Šμ€ κ°œλ°œμžλ„ 문제λ₯Ό 확인할 수 μžˆλ‹€.
- λ¬Έμ œκ°€ μžˆμ„ 경우 ν•¨μˆ˜κ°€ μ˜ˆμƒν•˜μ§€ λͺ»ν•œ λ™μž‘μ„ ν•˜μ§€ μ•Šκ³  μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€. μ˜ˆμƒν•˜μ§€ λͺ»ν•œ λ™μž‘μ„ ν•˜λŠ” 것은 μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” 것보닀 ꡉμž₯히 μœ„ν—˜ν•˜λ©° μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” 것이 νž˜λ“€λ‹€. μ΄λŸ¬ν•œ μ œν•œμœΌλ‘œ 인해 문제λ₯Ό λ†“μΉ˜μ§€ μ•Šκ³  μ½”λ“œκ°€ 더 μ•ˆμ •μ μœΌλ‘œ μž‘λ™ν•œλ‹€.
- μ½”λ“œκ°€ μ–΄λŠ 정도 자체적으둜 κ²€μ‚¬ν•΄μ„œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό 쀄일 수 μžˆλ‹€.
- 슀마트 캐슀트 κΈ°λŠ₯을 ν™œμš©ν•  수 있게 λ˜λ―€λ‘œ νƒ€μž… λ³€ν™˜μ„ 적게 ν•  수 μžˆλ‹€.

## Argument

- 인자둜 받은 κ°’μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λŠ” λ‘œμ§μœΌλ‘œλŠ” `require()` ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. μ œν•œμ„ ν™•μΈν•˜κ³  λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•  경우 `IllegalArgumentException`을 λ°œμƒμ‹œν‚¨λ‹€.
- 쑰건을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•  λ•Œ λ°œμƒμ‹œν‚€λ―€λ‘œ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬λžŒμ΄ μ•Œ 수 μžˆλ‹€. λ˜ν•œ 이 λ‚΄μš©μ€ λ¬Έμ„œμ—λ„ 포함이 λ˜μ–΄μ•Ό ν•œλ‹€.
- μ˜ˆμ‹œ
- 숫자λ₯Ό 인자둜 λ°›μ•„μ„œ 계산할 λ•Œ μˆ«μžλŠ” μ–‘μ˜ μ •μˆ˜μ—¬μ•Ό ν•  λ•Œ
- μ’Œν‘œλ₯Ό 인자둜 λ°›μ•„μ„œ ν΄λŸ¬μŠ€ν„°λ₯Ό 찾을 λ•Œ λΉ„μ–΄μžˆμ§€ μ•Šμ€ μ’Œν‘œ λͺ©λ‘μ΄ ν•„μš”ν•  λ•Œ
- 이메일 μ£Όμ†Œλ₯Ό μž…λ ₯받을 λ•Œ 값이 μž…λ ₯λ˜μ–΄μžˆλŠ”μ§€ 이메일 ν˜•μ‹μ΄ μ˜¬λ°”λ₯Έμ§€ 확인할 λ•Œ

## μƒνƒœ

- μ–΄λ–€ ꡬ체적인 쑰건을 λ§Œμ‘±ν•  λ•Œλ§Œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 있게 ν•΄μ•Όν•  λ•Œ `check()` ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
- μ§€μ •λœ μ˜ˆμΈ‘μ„ λ§Œμ‘±ν•˜μ§€ λͺ»ν•  λ•Œ `IllegalStateException`을 `throw` ν•œλ‹€. μƒνƒœκ°€ μ˜¬λ°”λ₯Έμ§€ 확인할 λ•Œ μ‚¬μš©ν•œλ‹€.
- μ‚¬μš©μžκ°€ κ·œμ•½μ„ μ–΄κΈ°κ³  μ‚¬μš©ν•˜λ©΄ μ•ˆ λ˜λŠ” κ³³μ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  μžˆλ‹€κ³  μ˜μ‹¬λ  λ•Œ ν•œλ‹€.
- μ˜ˆμ‹œ
- μ–΄λ–€ 객체가 미리 μ΄ˆκΈ°ν™” λ˜μ–΄μžˆμ–΄μ•Όλ§Œ 처리λ₯Ό ν•˜κ²Œ ν•˜κ³  싢은 ν•¨μˆ˜
- μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν–ˆμ„ λ•Œλ§Œ μ²˜λ¦¬ν•˜κ²Œ ν•˜κ³  싢은 ν•¨μˆ˜
- 객체λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μ‹œμ μ— μ‚¬μš©ν•˜κ³  싢은 ν•¨μˆ˜

## Assert 계열 ν•¨μˆ˜ μ‚¬μš©

- assert 계열 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  상황에 λŒ€ν•΄ ν…ŒμŠ€νŠΈν•  수 μžˆλ‹€.
- 이 쑰건은 ν˜„μž¬ μ½”ν‹€λ¦°/JVMμ—μ„œλ§Œ ν™œμ„±ν™”λ˜λ©° -ea JVM μ˜΅μ…˜μ„ ν™œμ„±ν™”ν•΄μ•Ό 확인할 수 μžˆλ‹€.
- ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈν•  λ•Œλ§Œ ν™œμ„±ν™”ν•  수 μžˆλ‹€.
- λ§Œμ•½ μ‹¬κ°ν•œ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆλŠ” κ²½μš°μ—λŠ” checkλ₯Ό μ‚¬μš©μ΄ μ’‹λ‹€.

## Nullability와 슀마트 μΊμŠ€νŒ…

- require와 check λΈ”λ‘μœΌλ‘œ μ–΄λ–€ 쑰건을 ν™•μΈν•΄μ„œ trueκ°€ λ‚˜μ™”λ‹€λ©΄ ν•΄λ‹Ή 쑰건은 μ΄ν›„λ‘œλ„ true일 거라고 κ°€μ •ν•œλ‹€.
- `requireNotNull`, `checkNotNull`을 ν™œμš©ν•΄λ„ μ’‹λ‹€. λ‘˜ λ‹€ 슀마트 캐슀트λ₯Ό μ§€μ›ν•˜λ―€λ‘œ λ³€μˆ˜λ₯Ό β€˜μ–ΈνŒ©(unpack)β€™ν•˜λŠ” μš©λ„λ‘œ ν™œμš©ν•  수 μžˆλ‹€.
- nullabilityλ₯Ό λͺ©μ μœΌλ‘œ Elvis μ—°μ‚°μžλ₯Ό ν™œμš©ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€.

# Reference

[check - Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/check.html)

[require - Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/require.html)

[Using require and check Functions in Kotlin](https://hugomartins.io/essays/2021/02/using-require-and-check-in-kotlin/)

[μ΄νŽ™ν‹°λΈŒ μ½”ν‹€λ¦°](https://book.naver.com/bookdb/book_detail.nhn?bid=21424027)

0 comments on commit 0a3538c

Please sign in to comment.