티스토리 뷰
728x90
1. Reactive프로그래밍에서 Optional처럼 orElseThrow() 같은 함수를 사용하기 원하는 경우는
1-1 아래의 findById와 같이 map을 사용하여 데이터가 있는 경우, 적절하게 처리하고
1-2 switchIfEmpty 함수를 활용하여 에러를 발생시킬 수 있다.
1-3 findById와 거의 같은 findCommandById함수와 비교하면 차이를 쉽게 알 수 있다.
package pe.pilseong.recipe.service;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import pe.pilseong.recipe.command.RecipeCommand;
import pe.pilseong.recipe.converter.RecipeCommandToRecipe;
import pe.pilseong.recipe.converter.RecipeToRecipeCommand;
import pe.pilseong.recipe.domain.Recipe;
import pe.pilseong.recipe.exception.NotFoundException;
import pe.pilseong.recipe.repository.reactive.RecipeReactiveRepository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Service
@RequiredArgsConstructor
@Slf4j
public class RecipeServiceImpl implements RecipeService {
private final RecipeReactiveRepository recipeReactiveRepository;
private final RecipeCommandToRecipe recipeConverter;
private final RecipeToRecipeCommand commandConverter;
@Override
public Flux<Recipe> getRecipes() {
log.debug("getRecipes in RecipeServiceImpl");
return recipeReactiveRepository.findAll();
}
@Override
public Mono<Recipe> findById(String id) {
return recipeReactiveRepository.findById(id).map(fetchedRecipe -> {
fetchedRecipe.getIngredients().forEach(ingredient-> ingredient.setRecipeId(fetchedRecipe.getId()));
return fetchedRecipe;
})
.switchIfEmpty(Mono.error(new NotFoundException("recipe not found with id :: " + id)));
}
@Override
public Mono<Recipe> save(RecipeCommand command) {
return recipeReactiveRepository.save(recipeConverter.convert(command));
}
@Override
public Mono<RecipeCommand> findCommandById(String id) {
Recipe reactiveRecipe = recipeReactiveRepository.findById(id).block();
if (reactiveRecipe != null) {
return Mono.just(commandConverter.convert(reactiveRecipe));
} else {
throw new NotFoundException("recipe not found with id :: " + id);
}
}
@Override
public Mono<RecipeCommand> saveRecipeCommand(RecipeCommand command) {
return recipeReactiveRepository.save(recipeConverter.convert(command))
.map(commandConverter::convert);
}
@Override
public Mono<Void> deleteById(String id) {
recipeReactiveRepository.deleteById(id).block();
return Mono.empty();
}
}
2. 자세한 내용은 StackOverflow에서 다양한 방법으로 잘 설명되어 있다.
728x90
'Spring > Spring Advanced' 카테고리의 다른 글
WebFlux : Embedded mongo 일반 환경에서 사용하기 (0) | 2020.09.06 |
---|---|
WebFlux : Spring MVC에서 WebFlux 변환 (0) | 2020.08.30 |
Spring Advanced : Spring Boot + Security login custom 메소드로 구현하기 (0) | 2020.06.09 |
Spring Advanced : Rest + Security + Thymeleaf 로그인, 회원가입 기능이 포함된 Rest Template CRUD 클라이언트 작성하기 (0) | 2020.05.27 |
Spring Advanced : Rest + Security + Data JPA 로그인, 회원가입 기능이 포함된 CRUD서비스 작성하기 (1) | 2020.05.25 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
TAG
- Rest
- 설정하기
- 매핑
- one-to-one
- 로그인
- 스프링
- mapping
- Spring Security
- Spring
- Angular
- login
- Validation
- WebMvc
- 스프링부트
- jsp
- Security
- form
- crud
- 설정
- XML
- 외부파일
- one-to-many
- 자바
- MYSQL
- RestTemplate
- 하이버네이트
- 상속
- hibernate
- spring boot
- Many-To-Many
250x250