주로 null
값을 처리할 때 발생할 수 있는 문제를 예방하기 위해 사용
optional
을 사용하면 개발자가 명시적으로 값이 존재할 수 있음과 존재하지 않을 수 있음을 처리하도록 강제
Spring에서도 'optional'은 널(null)값 처리와 관련된 많은 상황에서 유용하게 활용됨
Optional
은 값이 있을 수도 있고 없을 수도 있는 상황을 명확하게 나타냅니다.
null 체크를 반복적으로 수행할 필요 없이, 안전하게 값이 비어있는지를 확인할 수 있는 방법을 제공합니다.
Optional.of(value)
: 값이 null
이 아닌 경우에만 Optional
을 생성합니다. 만약 null
값을 넣으면 NullPointerException
이 발생합니다.
Optional<User> user = userRepository.findById(id);
user.ifPresent(u -> {
// 유저가 존재하는 경우 처리
});
이렇게 하면 조회된 User 객체가 있을 때만 해당 객체를 사용하고, 없을 경우 null에 대한 처리를 명시적으로 할 수 있음
노트
있을수 도 있고 없을 수 도 있다
만약 null이라면 원래 서버가 에러가 난다
근데 optional은 null일때 무엇을 만들어 줄지 정할 수 있다
안전장치
findById는 자체적으로 Optional 타입이 붙어 있다.
Optional
은 null 값 처리를 안전하게 하고 코드를 명시적으로 작성하는 데 유용한 도구. Spring과 같은 프레임워크에서도 널 처리와 관련된 많은 문제를 해결하는 데 사용됩니다.
controller - 표현
클라이언트로 향하는 출구
인터페이스는 -> 보고 사용할 수 있는 것 (사용자는 내부구조를 알 필요가 없다)
프론트엔드는 백엔드의 구조를 알 필요가 없다
그래서 API가 인터페이스인 이유 -> 클라이언트가 인터페이스만 보면 알 수 있으면 되기 때문에
유저는 내부 구현은 알 필요가 없다
UI : 유저 인터페이스
컨트롤러는 내부의 구조를 인터페이스로 표현해준다
서비스,레포지토리는 모델
데이터를 옮겨주는 객체
Controller와 Serviece를 분리해주기 위해서 사용한다
Controller는 내부구조에 관심이 없기 때문에
컨트롤러 입장에서는 서비스가 어떻게 생겼는지 어떻게 내부 구현이 돌아가는지 알고 싶지 않고,
내가 무엇을 리턴받는지만 중요하다. -> 서비스도 하나의 인터페이스다
Dto로 소통하기 때문에 Controller와 Serviece 사이의 결합도를 낮출 수 있다 -> Serviece코드를 아무리 바꿔도 Controller코드는 바꾸지 않아도 된다
3 Latered Architecture 사용 이유는?
결합도를 낮추서 (각자의 역할에 충실) + 유지보수성 + 확장성
오늘 공부하면서 서버에서 null
이 발생하면 프로그램이 멈춘다는 것을 알게되었다. 그래서 optional
를 활용하여 null일때 무엇을 만들어 줄지 정해주면서 안전장치 역할을 수행하는 것을 알게되었다. 그리고 Controller
입장에서는 내부구현이 돌아가는 것에 관심이 없고 어떤 값을 리턴받는지만 중요하다 라는 관점에서 보는 법도 알게 되어서 유익한 시간이였다.