[Spring Cloud MSA] Spring Cloud를 통한 MSA 개발(6) - Api Gateway 연동과 사용자 조회
Spring Cloud Gateway 연동
앞서 만든 api gateway를 사용하자.
api gateway 의 application.yml 파일에 유저 서비스 라우터를 추가하자
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
유레카 서버에 api gateway service가 등록되었다.
그런데 localhost:8000/user-service/health_check 의 경로로 가면 에러 페이지가 나온다.
api gateway를 통해 uri 가 유저 마이크로서비스로 넘어왔을 때 path에 /user-service 가 앞에 붙기 때문에 해당 경로가 컨트롤러에 없어서 생기는 문제이다.
따라서 @GetMapping(“/health_check”) 를 @GetMapping(“user-service/health_check”) 로 바꾸면 해결된다.
이제 http://localhost:8000/user-service/health_check 로 이동하면 정상적인 화면이 나온다.
사용자 조회
유저 서비스에 사용자 조회 기능을 추가하자
먼저 컨트롤러에서 모든 요청에 user-service/를 달지말고 @RequestMapping(“/user-service”)로 바꿔주자.
userId로 개별 사용자 조회와 전체 사용자 조회를 만들어 보자.
UserService
public interface UserService {
UserDto createdUser(UserDto userDto);
UserDto getUserByUserId(String userId);
Iterable<UserEntity> getUserByAll();
}
UserServiceImpl
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService{
private final UserRepository userRepository;
private final BCryptPasswordEncoder passwordEncoder;
@Override
public UserDto getUserByUserId(String userId) {
UserEntity userEntity = userRepository.findByUserId(userId);
if (userEntity==null){
throw new UsernameNotFoundException("User not found");
}
UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);
List<ResponseOrder> orders = new ArrayList<>();
userDto.setOrders(orders);
return userDto;
}
@Override
public Iterable<UserEntity> getUserByAll() {
return userRepository.findAll();
}
}
ResponseUser
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseUser {
private String email;
private String name;
private String userId;
private List<ResponseOrder> orders;
}
아직 Order Service를 만들지 않아서 userDto의 orders list에 빈 ArrayList를 넣어줬다.
UserController
@RestController
@RequestMapping("/user-service")
public class UserController {
private Environment env;
private UserService userService;
@Autowired
public UserController(Environment env,UserService userService) {
this.env = env;
this.userService = userService;
}
@Autowired
private Greeting greeting;
@GetMapping("/health_check")
public String status() {
return String.format("It's Working in User Service on PORT %s",
env.getProperty("local.server.port"));
}
@GetMapping("/welcome")
public String welcome() {
//return env.getProperty("greeting.message");
return greeting.getMessage();
}
@PostMapping("/users")
public ResponseEntity<ResponseUser> createUser(@RequestBody RequestUser user) {
ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
UserDto userDto = mapper.map(user, UserDto.class);
userService.createdUser(userDto);
ResponseUser responseUser = mapper.map(userDto, ResponseUser.class);
//return new ResponseEntity(responseUser, HttpStatus.CREATED);
return ResponseEntity.status(HttpStatus.CREATED).body(responseUser);
}
@GetMapping("/users")
public ResponseEntity<List<ResponseUser>> getUsers() {
Iterable<UserEntity> userList = userService.getUserByAll();
ModelMapper mapper = new ModelMapper();
List<ResponseUser> result = new ArrayList<>();
userList.forEach(v->{
result.add(mapper.map(v, ResponseUser.class));
});
return ResponseEntity.status(HttpStatus.OK).body(result);
}
@GetMapping("/users/{userId}")
public ResponseEntity<ResponseUser> getUser(@PathVariable("userId") String userId) {
UserDto userDto = userService.getUserByUserId(userId);
ResponseUser result = new ModelMapper().map(userDto, ResponseUser.class);
return ResponseEntity.status(HttpStatus.OK).body(result);
}
}