IT/Spring Cloud

Catalogs Microservice

김 정 환 2021. 12. 15. 21:40
반응형

앞으로 구현할 카탈로그 마이크로서비스 입니다.

 

APIs입니다.

기능 마이크로서비스 URI (API Gateway  사용시) HTTP Method
상품 목록 조회 Catalogs Microservice /catalog-service/catalogs GET

 

 

프로젝트를 생성하겠습니다. 아래 Dependencies를 추가합니다.

  • Spring Boot DevTools : 코드가 변경되면 자동으로 애플리케이션 재시작 등 하기 위해서 추가 ... 참조
  • Lombok : 코드 작성을 편하게 하기 위해서 추가 ... 참조
  • Spring web : REST API 작성하기 위해서 추가
  • Eureka Discovery Client : Eureka discovery 사용하기 위해서 추가

 

 

필요한 dependencies를 추가하겠습니다. 아래 dependancies를 pom.xml에 추가합니다.

		<dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.176</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>2.3.8</version>
        </dependency>

 

 

소스코드

프로젝트 내의 파일 위치를 아래와 같습니다.

 

 

application.yaml 설정은 아래와 같습니다.

server:
  port: 0

spring:
  application:
    name: catalog-service
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console

  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    generate-ddl: true
    database: h2
    defer-datasource-initialization: true

  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb


eureka:
  instance:
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
    hostname: localhost

  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka


logging:
  level:
    com.example.catalogservice: DEBUG

 

데이터베이스를 조회할 것이기 때문에 미리 생성되어 있으면 좋겠습니다. 미리 생성하겠습니다. resource/data.sql를 만들어 줍니다.

insert into catalog(product_id, product_name, stock, unit_price)
    values('CATALOG-001', 'Berlin', 100, 1500);

insert into catalog(product_id, product_name, stock, unit_price)
    values('CATALOG-002', 'Tokyo', 110, 1600);

insert into catalog(product_id, product_name, stock, unit_price)
    values('CATALOG-003', 'Stockholm', 120, 1700);

 

모든 상품 정보를 조회하는 서비스인 CatalogService.java 인터페이스를 만들어 줍니다.

public interface CatalogService {
    Iterable<CatalogEntity> getAllCatalogs();
}

 

인터페이스의 메소드를 구현할 CatalogServiceImpl.java를 만들어 줍니다.

@Data
@Slf4j
@Service
public class CatalogServiceImpl implements CatalogService {

    CatalogRepository catalogRepository;

    @Autowired
    public CatalogServiceImpl(CatalogRepository catalogRepository) {
        this.catalogRepository = catalogRepository;
    }

    @Override
    public Iterable<CatalogEntity> getAllCatalogs() {
        return catalogRepository.findAll();
    }
}

 

데이터베이스 정보를 담을 CatalogEntity.java를 만들어 줍니다.

@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")
    private Date createAt;
}

 

데이터베이스에 접근할 메소드를 담은 레포지토리 CatalogRepository.java를 만들어 줍니다.

public interface CatalogRepository extends CrudRepository<CatalogEntity, Long> {
    CatalogEntity findByProductId(String productId);
}

 

데이터베이스의 데이터를 잠시 담아둘 클래스 CatalogDto.java를 만들어 줍니다.

@Data
public class CatalogDto implements Serializable {
    private String productId;
    private Integer qty;
    private Integer unitPrice;
    private Integer totalPrice;

    private String orderId;
    private String userId;
}

 

데이터베이스에서 조회한 데이터를 받고 담아서 응답으로 보내줄 클래스인 ResponseCatalog.java를 만들어 줍니다.

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseCatalog {
    private String productId;
    private String productName;
    private Integer unitPrice;
    private Integer totalPrice;
    private Integer stock;
    private Date createAt;
}

 

이제 CatalogController.java에 모든 상품을 조회하는 메소드를 만들어 줍니다.

@RestController
@RequestMapping("/catalog-service/")
public class CatalogController {

    // Environment로 application.yaml에서 값 가져올 수 있음
    Environment env;
    CatalogService catalogService;


    @Autowired
    public CatalogController(Environment env, CatalogService catalogService) {
        this.env = env;
        this.catalogService = catalogService;
    }


    @GetMapping("/health_check")
    public String status() {
        return String.format("It's Working in Catalog Service on PORT %s", env.getProperty("local.server.port"));
    }


    // 모든 카탈로그 조회
    @GetMapping("/catalogs")
    public ResponseEntity<List<ResponseCatalog>> getCatalogs(){
        Iterable<CatalogEntity> userList = catalogService.getAllCatalogs();

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

        return ResponseEntity.status(HttpStatus.OK).body(result);
    }

}

 

POSTMAN으로 등록된 상품을 조회해 보겠습니다. H2 DB에 등록된 모든 상품을 조회했습니다.

 

끝.

반응형

'IT > Spring Cloud' 카테고리의 다른 글

User Microservice - 회원 로그인  (0) 2021.12.17
Order Service  (0) 2021.12.15
User Microservice - 회원 등록  (0) 2021.12.13
애플리케이션 개요  (0) 2021.12.08
API Gateway  (0) 2021.12.07