CatalogService

조현재·2023년 1월 29일
0

MSA

목록 보기
9/17

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/**
profile
내일이 다른

0개의 댓글