Skip to content

Commit

Permalink
feat : 20240816_Optional_송해덕 (#80)
Browse files Browse the repository at this point in the history
  • Loading branch information
ss0ngcode authored Sep 6, 2024
1 parent 8d08a12 commit 8076e54
Showing 1 changed file with 16 additions and 10 deletions.
26 changes: 16 additions & 10 deletions 기술세미나/_posts/2024-08-16-Optional.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ banner:
tags: ["Optional", "안티패턴", "NullPointerException"]
---

# Optional<T>란?
## Optional<T>란?

안녕하세요. Kernel 360 백엔드 2기 크루 송해덕입니다.

Expand Down Expand Up @@ -46,7 +46,7 @@ Documentation에는 이와 같이 명시되어 있지만 해당 정의만 본다
그렇다면 이를 확인했으니 아래와 같이 반환 값을 Optional로 감싸면 에러가 발생하지 않게 됩니다.<br>
그 아랫줄 처럼 `get()` 메서드를 사용하여 entity를 꺼낼 수 있겠네요.

# Optional을 사용하는 이유?
## Optional을 사용하는 이유?

자, 그럼 우리는 이런 Optional을 왜 사용하는지 생각해봐야 합니다.<br>
어차피 get() 같은 메서드로 Optional 내부에 있는 객체를 꺼내 쓸꺼면 그냥 Optional로 감싸지 않고 바로 쓰면 되는걸 이런 귀찮은 작업을 대체 왜 하는걸까요?
Expand All @@ -55,7 +55,7 @@ Documentation에는 이와 같이 명시되어 있지만 해당 정의만 본다

바로 이 보기도 싫은 NullPointerException을 방지하기 위함입니다.

## NullPointerException은 무엇인가?
### NullPointerException은 무엇인가?

자 그럼 또 다시 NullPointerException은 무엇일까요?<br>
우리가 개발을 처음 시작하면서부터 지금까지 질리도록 본 이 NullPointerException이 대체 왜 발생하게 되는걸까요?
Expand Down Expand Up @@ -87,7 +87,7 @@ null은 참조 변수가 어떤 객체도 가리키지 않음을 의미합니다

이와 같이 NullpointerException은 **아무것도 참조하지 않는 Null 객체 및 변수를 호출할 때** 발생되는 예외입니다.

# Optional을 올바르게 사용하는 방법
## Optional을 올바르게 사용하는 방법

그럼 다시 Optional로 돌아와서 여러분들이 이미 Optional을 사용하고 계신다면 어떻게 사용하고 계시나요?

Expand Down Expand Up @@ -117,7 +117,8 @@ Brian Goetz는 Stack Overflow에서 Optional에 대한 질문에 이러한 답

<br>

1. Optional을 필드로 사용하지 말아라

(1) Optional을 필드로 사용하지 말아라

```java
// 안 좋음
Expand All @@ -144,7 +145,8 @@ class Person {

<br>

2. Optional에 null을 할당하지 마라

(2) Optional에 null을 할당하지 마라

```java
// 안 좋음
Expand Down Expand Up @@ -175,7 +177,8 @@ Optional은 null을 안전하고 일관성있게 사용하기 위함인데 Optio

<br>

3. Optional 대신 빈 객체를 사용해라

(3) Optional 대신 빈 객체를 사용해라

```java
// 안 좋음
Expand All @@ -195,7 +198,8 @@ public interface PersonRepository extends JpaRepository<Person, Long> {

<br>

4. `Optional.get()` 전에는 값을 가지고 있는지 확인해야한다

(4) `Optional.get()` 전에는 값을 가지고 있는지 확인해야한다

```java
// 안 좋음
Expand Down Expand Up @@ -223,7 +227,8 @@ return ""
하지만, 이 방법이 좋다…? 라고는 이야기 할 수 없습니다.<br>
그 이유는 뒤에 이어지는 내용에서 설명해드리겠습니다.

5. `isPresent() - get()``orElse()``orElseXXX`으로 처리해라

(5) `isPresent() - get()``orElse()``orElseXXX`으로 처리해라

```java
Optional<Person> optionalPerson = personRepository.findById(regNo);
Expand Down Expand Up @@ -368,7 +373,8 @@ void orElseTestMethod() {

반대로 `orElseGet()`의 경우 Optional이 null이 아니기 때문에 **emptyReturn이 호출되지 않는 것**이죠.

# 결론
## 결론

지금은 Optional을 올바르게 사용하는 방법들 중 일부만을 설명해드렸지만 이외에도 여러가지 다양한 내용들이 있습니다.

Optional에 대한 올바른 사용방법이 궁금하신 분들은 [26가지 안티패턴](https://dzone.com/articles/using-optional-correctly-is-not-optional)을 보시면 도움이 될 것 같습니다.
Expand Down

0 comments on commit 8076e54

Please sign in to comment.