
Cart cart = cartRepository.findByMemberIdAndMenuIdAndStoreId(member.getId(), request.menuId(), request.storeId())
.map(existingCart -> {
existingCart.updateQuantity(request.quantity());
return existingCart;
})
.orElseGet(() -> Cart.builder()
.member(member)
.menu(menu)
.store(store)
.quantity(request.quantity())
.price(request.price())
.build());
이 코드는 Optional, 빌더 패턴, 람다 표현식을 활용하여 객체 조회와 생성 로직을 간결하게 처리하는 매우 유용한 예제입니다. 이 코드에서 배운 점과 주요 개념들을 정리했습니다.
Optional:
map()과 orElseGet()을 사용해 조회 결과에 따라 다른 동작을 수행.빌더 패턴:
람다 표현식:
메서드 체이닝:
이 코드의 목적은 특정 조건에 맞는 카트를 조회하거나, 없다면 새로 생성하는 것입니다.
cartRepository.findByMemberIdAndMenuIdAndStoreId(member.getId(), request.menuId(), request.storeId())
cartRepository에서 특정 멤버, 메뉴, 가게 ID를 조건으로 카트를 검색.Optional 내부에 Cart 객체 포함.Optional 반환.map).map(existingCart -> {
existingCart.updateQuantity(request.quantity());
return existingCart;
})
Optional.map()은 값이 존재할 때 실행.existingCart는 Optional 내부의 실제 Cart 객체.updateQuantity()로 카트 수량을 업데이트.existingCart를 반환.orElseGet).orElseGet(() -> Cart.builder()
.member(member)
.menu(menu)
.store(store)
.quantity(request.quantity())
.price(request.price())
.build());
orElseGet()은 값이 없을 때 실행.Cart.builder()로 새 카트를 생성.member, menu, store, quantity, price)를 설정..build() 호출로 새 Cart 객체 생성.빌더 패턴은 복잡한 객체 생성 로직을 간결하게 처리합니다.
예를 들어:
Cart.builder()
.member(member)
.menu(menu)
.store(store)
.quantity(request.quantity())
.price(request.price())
.build();
Optional 활용:
map()으로 값 수정.orElseGet()으로 기본값 생성.빌더 패턴 사용:
람다 표현식과 메서드 체이닝:
상태 기반 객체 처리:
Optional과 빌더로 쉽게 구현.Immutable 객체 생성:
코드 간소화: