Users Microservice (3)

김준영·2023년 3월 13일
1

Spring Cloud + MSA

목록 보기
8/9
post-thumbnail

전체 사용자 조회 & 사용자 정보, 주문 내역 조회 기능


전에 만들었던 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;
}
  • null값을 제외한 값을 보내기위해 JsonInclude에 NON_NULL을 선택한다.
  • 이메일, 이름, 사용자 id, 주문 내역을 보내준다.
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;
}

주문내역 클래스엔

  • 상품 아이디, 수량, 개당 가격, 총 가격, 주문 날짜, 주문 아이디가 들어간다.

Service

 @Override
    public Iterable<Users> getUserByAll() {
        return userRepository.findAll();
    }

전체 사용자 조회를 위해 간단하게 서비스를 작성했다.

Controller

@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로 변환 후, 넣어준다.

그리고 상태 코드와 반환 값을 넣어 보내준다.

결과

사용자 정보 조회 & 주문 내역


Service

@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에 넣어 반환한다.

Controller

@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에 매핑하여 사용자에게 반환한다.

결과


두 사용자를 등록하고 확인한다.

위 사용자중 한명의 아이디를 사용해 사용자 정보를 가지고 오면 아래와 같이 사용자 정보와 주문내역에 관한 리스트를 가지고 온다.

profile
ㅎㅎ

0개의 댓글