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 객체 생성:
코드 간소화: