공부/Spring

Spring Cloud로 개발하는 마이크로서비스 애플리케이션_Catalogs and Orders Microservice_2

데부한 2023. 3. 1. 17:04
반응형

 

 

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Users Microservice - 사용자 조회

User의 전체 사용자 목록과 상세 정보 보기 기능을 추가해보자.

UserController의 각 메서드 uri 매핑 주소에 prefix 격으로 '/user-service/'가 들어간다. 그러므로 클래스 블럭에 있는 @RequestMapping() 어노테이션에 해당 uri를 기재하고, 각 메서드 XXXMapping()에 적혀있는 '/user-service/'는 지워주자.

@RequestMapping("/user-service/")
public class UserController { ... }

 

ResponseUser vo에 회원 주문 목록을 볼 수 있도록 필드를 하나 추가한다. 아직 ResponseOrder vo를 만들지 않아 빨간 줄이 뜨는데 mac 기준 커맨드 + 엔터 단축키를 입력하고 Create class 'ResponseOrder'를 클릭하면 해당 vo 클래스를 생성할 수 있다.

  • ResponseUser.java
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseUser {
    private String email;
    private String name;
    private String userId;

    private List<ResponseOrder> orders;
}

 

  • UserDto.java
private List<ResponseOrder> orders;

UserDto에도 미리 orders 필드를 추가해놓는다.

 

@JsonInclude(JsonInclude.Include.NON_NULL) 어노테이션은 객체를 JSON 포맷으로 변경할 때 필드의 값이 'null'일 경우 해당 필드는 JSON 포맷 시 제외된다. 

{
    "name" : "test",
    "age" : 14,
    "phoneNumber" : null
}

// 어노테이션 사용 시
{
    "name" : "test",
    "age" : 14
}

 

 

  • ResponseOrder.java
@Data
public class ResponseOrder {

    private String productId;
    private Integer qty;
    private Integer unitPrice;
    private Integer totalPrice;
    private LocalDateTime createdAt;

    private String orderId;
}

강의에서는 createdAt 필드를 Date 타입으로 생성했다. Date 타입은 deprecated 되었으므로 나는 LocalDateTime 패키지를 사용했다.

 

 

  • UserService.interface
UserDto getUserById(String userId);
Iterable<UserEntity> getUserByAll();

userId를 이용해 상세 정보를 가져오는 기능을 하는 메서드 getUserById는 UserDto 타입으로 반환해줄 것이다.

그리고 사용자의 전체 목록을 가져오는 메서드 getUserByAll()은 DB에 저장되어있는 데이터 그대로를 반환해줄 것이기 때문에 UserEntity 타입을 사용해 Iterable로 반환한다. 만약 DB에 가져오는 데이터를 가공할 것이라면 UserDto 타입으로 반환해도 좋다.

 

 

  • UserServiceImpl.java

UserService.interface에서 두 개의 메서드를 생성했으니 구현체에도 두 개의 메서드 getUserById와 getUserByAll 메서드를 구현한다.

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

getUserByAll() 같은 경우는 이미 JPA에서 findAll()이라는 메서드를 제공하기 떄문에 별 다른 로직 없이 해당 메서드의 반환 값을 리턴해주면 끝이 난다.

 

@Override
public UserDto getUserById(String userId) {
    UserEntity userEntity = userRepository.findByUserId(userId);

    if(userEntity == null)
        throw new UsernameNotFoundException("User not found");

    // UserEntity -> UserDto로 변환
    UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);

    List<ResponseOrder> orders = new ArrayList<>();
    userDto.setOrders(orders);
    
    return userDto;
}

userRepository에 findByUserId() 메서드는 기본으로 제공해주지 않기 때문에 따로 만들어줘야한다. UserRepositoy.Interface에 해당 메서드를 추가해준다.

 

  • UserRepository.interface
UserEntity findByUserId(String userId);

 

 

Controller도 작성해주자.

  • UserController.java
@GetMapping("/users")
public ResponseEntity<List<ResponseUser>> getUsers() {
    Iterable<UserEntity> userList = userService.getUserByAll();

    //userEntity > ResponseEntity로 변경
    List<ResponseUser> result = new ArrayList<>();
    userList.forEach(v -> {
        result.add(new ModelMapper().map(v, ResponseUser.class));
    });
    return ResponseEntity.status(HttpStatus.OK).body(result);
}

 

 

서버 실행 후 포스트맨 확인

POST Method로 사용자를 하나 생성 후

 

전체 사용자를 조회한다.

 

 

  • UserController.java

하나의 사용자에 대한 상세 정보를 가져오는 method를 구현하자.

@GetMapping("/users/{userId}")
public ResponseEntity<ResponseUser> getUser(@PathVariable("userId") String userId) {
    UserDto userDto = userService.getUserById(userId);

    //userDto > ResponseUser로 변경
    ResponseUser result = new ModelMapper().map(userDto, ResponseUser.class);
    return ResponseEntity.status(HttpStatus.OK).body(result);
}

 

서버 재실행 후 확인

POST Method로 사용자 하나 추가 후 아이디를 복사해서 조회한다.

 

 

 

 


- 출처 : 인프런 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의

반응형