반응형
앞으로 구현할 카탈로그 마이크로서비스 입니다.
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 |