전에 만들었던 Api-gateway server를 사용한다.
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
게이트웨이 서버에 routes 주소를 위와 같이 작성한다.
/user-service/** 요청이 들어오면 유레카 서버에서 USER-SERVICE를 찾은 후, 그 주소로 포워드 시켜준다.
그 후, 사용자 서비스 health_check로 들어가면 잘 작동하고 서버에서 보낸 메시지가 보인다. 하지만 게이트웨이를 통해서 들어가면 404 에러가 뜰 것이다.
localhost:8000/user-service/health_check
그 이유는 바로 User Service의 URI와 API Gateway의 URI가 다르기 때문이다.
바로 user-service까지 요청으로 들어오기 때문에 에러가 뜨는 것이다.
그래서 우린 사용자 서비스의 GetMapping(/user-service/health_check)로 바꿔주면 해결된다.
사용자 정보 조회를 위해 전에 만들었던 ResponseUser vo를 수정해준다.
package com.example.userservice.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.util.List;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseUser {
private String email;
private String name;
private String userId;
private List<ResponseOrder> orders;
}
package com.example.userservice.vo;
import lombok.Data;
import java.util.Date;
@Data
public class ResponseOrder {
private String productId;
private Integer qty;
private Integer unitPrice;
private Integer totalPrice;
private Date createAt;
private String orderId;
}
주문내역 클래스엔
@Override
public Iterable<Users> getUserByAll() {
return userRepository.findAll();
}
전체 사용자 조회를 위해 간단하게 서비스를 작성했다.
@GetMapping("/users")
public ResponseEntity<?> getUsers(){
Iterable<Users> userList = userService.getUserByAll();
List<ResponseUser> responseUserList = new ArrayList<>();
userList.forEach(v -> {
responseUserList.add(new ModelMapper().map(v, ResponseUser.class));
});
return ResponseEntity.status(HttpStatus.OK).body(responseUserList);
}
위 서비스에서 반환한 값을 받았다. 사용자에게 반환해줄 responseUserList로 받은 후,
서비스에 받은 값을 forEach를 사용하여 modelmapper를 통해 responseuser로 변환 후, 넣어준다.
그리고 상태 코드와 반환 값을 넣어 보내준다.
@Override
public UserDto getUserByUserId(String userId) {
Users user = userRepository.findByUserId(userId);
if(user == null) throw new UsernameNotFoundException("User not found");
UserDto userDto = new ModelMapper().map(user, UserDto.class);
List<ResponseOrder> orders = new ArrayList<>();
userDto.setOrders(orders);
return userDto;
}
사용자 정보 조회 요청이 사용자 id와 함께 들어오면 그 아이디를 사용하여 사용자를 찾는다.
사용자가 있다면 dto에 매핑을 시켜주며, 아직은 없지만 주문 내역도 dto에 넣어 반환한다.
@GetMapping("/users/{userId}")
public ResponseEntity<?> getUser(@PathVariable String userId){
UserDto userDto = userService.getUserByUserId(userId);
ResponseUser returnUser = new ModelMapper().map(userDto, ResponseUser.class);
return ResponseEntity.status(HttpStatus.OK).body(returnUser);
}
위 서비스에서 반환한 dto를 응답vo에 매핑하여 사용자에게 반환한다.
두 사용자를 등록하고 확인한다.
위 사용자중 한명의 아이디를 사용해 사용자 정보를 가지고 오면 아래와 같이 사용자 정보와 주문내역에 관한 리스트를 가지고 온다.