Spring Cloud + MSA 애플리케이션 개발 5(Catalogs and Orders Microservice)

지원·2024년 2월 16일
0

MSA개발

목록 보기
5/15

Users Microservice

앞으로 추가할 것

  • 지금까지는 포트번호를 일일이 확인하고 Postman 에 그 포트번호로 바꾸고 요청을 보냈어야 했다.
  • 하지만 API Gateway Service 에 등록을 하면 포트번호에 상관없이 유레카서버의 이름으로 접근할 수 있기 때문에 훨씬 편하다.
  • yml 파일에 routes 에 정보를 추가하면 된다. (전에 했던 내용이기 때문에 코드로 보면 바로 이해할 수 있다)

Users Microservice 와 Spring Cloud Gateway 연동

# apigateway-service
spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE # 이 이름은 유레카 서버에 등록된 이름을 지정해줘야한다.
          predicates:
            - Path=/user-service/**
  • 위에 처럼 등록을 하면 /user-seirve/ 로 오는 요청은 USER-SERVICE 로 이동하게 된다.
  • 즉 원래는 포트번호를 확인하고 그 포트번호로 요청을 했지만 이제는 apigateway-service 의 port 번호가 8000 이기 때문에 8000/user-service/ 으로 요청을 보내면 된다.

실제로 이렇게 바꾸고 실행해보면 8000/user-serivce/health_check 는 404 에러가 발생한다.

왜 그런것일까?

  • Users Service 의 URI 와 API Gateway 의 URI 가 다르기 때문이다.
  • Users Service 의 컨트롤러에서는 /health_check 의 경로만 받고 있지 /user-service/health_check 의 경로는 받지 않는다.
  • 하지만 apigateway-service 에서 수정한 yml 파일에서는 predicates 에서 Path 를 /user-service 로 지정했기 때문에 두 개의 URI 가 서로 다르다.
  • 그래서 Users Service 의 컨트롤러를 /user-service/health_check 로 수정하면 정상적으로 동작된다.

Users Microservice - 사용자 조회

@JsonInclude(JsonInclude.Include.NON_NULL)

  • 해당 애노테이션을 통해서 API 통신을 할 때 JSON 으로 값이 넘어올 때 일부의 값은 채워지지 않고 넘어올 수 있다.
  • 그렇게 되면 NULL 로 처리를 하는데 그것을 방지하기 위한 애노테이션이다.
    @GetMapping("/users")
    public ResponseEntity<List<ResponseUser>> getUsers() {
        Iterable<UserEntity> userList = userService.getUserByAll();

        List<ResponseUser> result = new ArrayList<>();
        userList.forEach(v -> {
            result.add(new ModelMapper().map(v,ResponseUser.class));
        });

        return ResponseEntity.status(HttpStatus.OK).body(result);
    }
  • 모든 User 조회
  • 위에 코드로 모든 User 를 가져오고 ResponseUser 포맷에 맞게 바꾼 후 ResponseEntity.body() 에 담아서 return 해주면 된다.
  • ResponseEntity 안에 List< ResponseUser> 를 넣어서 보내는 것
  • Spring Data JPA 에서 제공하는 findAll 함수를 사용
  • 단건 조회는 @PathVariable 을 사용
  • 똑같이 ModelMapper 를 사용해서 ResponseUser 로 바꾼후 return

Catalogs Microservice 개요 및 설계

  • 상품 목록 조회
  • 똑같이 catalogs-serivce 프로젝트를 만들고 해당 service 를 유레카 서버에 등록시킨다. (yml 파일에서 설정)
  • 또한 data.sql 스크립트를 만들어서 insert into 쿼리로 3개의 상품을 먼저 테이블에 넣는 로직도 추가
  • 이렇게 되면 apigateway-service 의 포트번호인 8000 으로 user-service 와 catalogs-service 모두 접근할 수 있다.
  • 8000/user-service/ , 8000/catalogs-service/ 로 구분해서 접근할 수 있다.
  • 이제 직접 catalgos-service 를 만들어보자.

user-service 와 yml 파일은 상당히 비슷하다.

  • application.name 만 달라지고 그 외 부분은 모두 같다.
@Data
@Entity
@Table(name = "catalog")
public class CatalogEntity implements Serializable { // 직렬화?

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(nullable = false , length = 120 , unique = true)
    private String productId;
    @Column(nullable = false)
    private String productName;
    @Column(nullable = false)
    private Integer stock;
    @Column(nullable = false)
    private Integer unitPrice;
    @Column(nullable = false , updatable = false ,insertable = false)
    @ColumnDefault(value = "CURRENT_TIMESTAMP") // h2 DB 에서 현재 날짜 및 시간을 가져오기 위한 함수를 호출하는 것
    private LocalDateTime createdAt;
}
  • catalogEntity 는 다음과 같고 catalogDto , ResponseCatalog 도 위에 있는 데이터를 이용해서 만든다.

Serializable

  • Serializable 는 직렬화를 의미하는데, 직렬화란 현재 데이터의 상태를 영속적으로 저장하거나 다른 환경으로 전달(네트워크 통신)하기 위해 어떠한 정해진 포맷으로 변환하는 과정이다.
  • 현재 예제에서도 JSON 데이터를 사용하는데, 자바 직렬화를 사용하면 더 빠르다.
  • 물론 Jackson , GSON 라이브러리도 있지만 자바 직렬화는 같은 자바 시스템에서의 데이터 전송 및 저장에 최적화가 되어있다.

user-service 와 비슷한 로직이기 때문에 구현하는데 큰 어려움이 없었다.

# apigateway-service
        - id: catalog-service
          uri: lb://CATALOG-SERVICE # 이 이름은 유레카 서버에 등록된 이름을 지정해줘야한다.
          predicates:
            - Path=/catalog-service/**
  • 위에 처럼 추가를 해야 8000 포트로 네이밍을 통해 요청할 수 있다.

Order Microservice - 개요

  • 사용자 별 상품 주문 (POST)
  • 사용자 별 주문 내역 조회 (GET)
  • 같은 URI 지만 HTTP Method 로 구분

order-service 도 마찬가지로 지금까지 만들었던 service 와 큰 차이점이 없다.

  • 먼저 order-service 의 yml 파일에서 유레카 서버에 등록시킨다.
  • 다른 서비스와 마찬가지로 Controller , Service , Repository 를 구현한다.

3개의 서비스를 모두 구현하고 유레카 서버 , apigateway , 3개 서비스 다 기동을 시켰다.

  • postman 을 통해서 User 를 만들고 , 상품을 주문하고 , 이러한 값들이 DB 에도 정상적으로 들어가는 것을 알 수 있다.

이제 사용자의 인증 기능을 추가해보자.

참고자료

profile
덕업일치

0개의 댓글