CatalogEntity
@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 createdAt; }
Serializable 쓰는 이유
직렬화 넣어주는 이유는 우리가 가지고 있는 object를 전송하거나
데이터베이스 보관하기 위해서 우리가 마샬링(marshalling) 언마샬링(unmarshalling) 작업하기 위해서
여기서 marshalling이란
"마셜링하다"라는 용어는 파이썬 표준 라이브러리(Python standard library)에서 "직렬화하다"는 용어와 동일하게 간주되지만, 자바 계열 RFC 2713에서는 동일하게 간주되지 않는다.
"마셜링한다"는 것은 그것의 상태와 코드베이스를 기록하는 것을 의미한다. 이것은 마셜링된 오브젝트가 "언마셜링" 될 때, 오브젝트의 클래스 정의를 아마도 자동적으로 로딩함으로써 원본 오브젝트의 사본을 얻는 방식으로 기록되는 방식
참고문서
데이터 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', 200, 2000); insert into catalog(product_id, product_name, stock, unit_price) values('CATALOG-003', 'Stockholm', 300, 2300);
위 데이터 sql추가 시
data.sql 스크립트는 Hibernate가 초기화 되기 전에 실행되어야 하는데, 테이블이 자동으로 생성되지 못해서 insert 구문의 오류가 발생하면
defer-datasource-initialization: true 추가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
CatalogRepository
public interface CatalogRepository extends CrudRepository<CatalogEntity, Long> { CatalogEntity findByProductId(String productId); }
Catalog Dto
@Data public class CatalogDto implements Serializable { private String productId; private Integer qty; private Integer unitPrice; private Integer totalPrice; private String orderId; private String userId; }
Response Catalog
@Data @JsonInclude(JsonInclude.Include.NON_NULL) public class ResponseCatalog { private String productId; private String productName; private Integer unitPrice; private Integer stock; private Date createdAt; } @jsonInclude json객체가 null값이 있는건 버리고 그렇지 않은것만 챙기기
service
public interface CatalogService { Iterable<CatalogEntity> getAllCatalogs(); }
@Slf4j @Service @RequiredArgsConstructor public class CatalogServiceImpl implements CatalogService{ private final CatalogRepository catalogRepository; @Override public Iterable<CatalogEntity> getAllCatalogs() { return catalogRepository.findAll(); } }
controller
@RestController @RequiredArgsConstructor @RequestMapping("/catalog-service") public class CatalogController { private final Environment env; private final CatalogService catalogService; @GetMapping("/health_check") public String status(){ return String.format("catalogService 포트는 %s",env.getProperty("local.server.port")); } @GetMapping("/catalogs") public ResponseEntity<List<ResponseCatalog>> getAllCatalogs(){ Iterable<CatalogEntity> catalogList = catalogService.getAllCatalogs(); List<ResponseCatalog> result = new ArrayList<>(); catalogList.forEach(v -> { result.add(new ModelMapper().map(v,ResponseCatalog.class)); }); return ResponseEntity.ok().body(result); } }
gateway yml 추가
spring: application: name: apigateway-service cloud: gateway: default-filters: - name: GlobalFilter #Global Filter로 지정된 java 파일 이름 args: baseMessage: Spring Cloud Gateway Global Filter preLogger: true postLogger: true routes: - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** - id: catalog-service uri: lb://CATALOG-SERVICE predicates: - Path=/catalog-service/**