스프링 클라우드 컨트랙트 공식 레퍼런스를 한글로 번역한 문서입니다.
전체 목차는 여기에 있습니다.
엔드포인트 하나를 컨슘하는 컨슈머consumer가 둘인데, 양쪽이 원하는 응답 형태가 서로 다를 수 있다.
여기서 설명하는 방법을 사용하면 어떤 컨슈머consumer가 API의 어떤 부분을 사용하는지 즉시 확인할 수 있다. API 응답 중 일부를 제거하고서 자동 생성된 테스트 중 실패하는게 있는지 확인해보면 된다. 실패한 테스트가 하나도 없다면, 사용하는 곳이 없다는 뜻이므로 관련 응답 필드를 안전하게 삭제할 수 있다.
다음은 프로듀서 foo
에 대해 정의한 명세contract 예시다. 이 프로듀서는 두 개의 컨슈머(foo-consumer
, bar-consumer
)를 가지고 있다:
Consumer foo-service
request {
url '/foo'
method GET()
}
response {
status OK()
body(
foo: "foo"
}
}
Consumer bar-service
request {
url '/bar'
method GET()
}
response {
status OK()
body(
bar: "bar"
}
}
요청이 같은데 두 가지 다른 응답을 생성할 수는 없다. 그렇기 때문에 명세contract를 적절한 경로에 패키징해서 stubsPerConsumer
기능을 활용하는 게 좋다.
stubsPerConsumer
기능을 사용하면, 컨슈머consumer는 프로듀서producer 측에 있는 명세contract 중, 자신과 관련된 명세contract가 포함된 폴더만 참조할 수 있다. stubrunner.stubs-per-consumer
플래그를 true
로 설정하면 더 이상 모든 스텁stub을 등록하지 않고, 컨슈머consumer 애플리케이션 이름에 해당하는 스텁stub만 등록한다. 즉, 모든 스텁stub의 경로를 스캔해서, 컨슈머consumer 이름을 가진 하위 폴더가 있을 때에만 스텁stub을 등록한다.
foo
프로듀서producer 측에 있는 명세contract는 다음과 같다:
.
└── contracts
├── bar-consumer
│ ├── bookReturnedForBar.groovy
│ └── shouldCallBar.groovy
└── foo-consumer
├── bookReturnedForFoo.groovy
└── shouldCallFoo.groovy
bar-consumer
컨슈머consumer는 spring.application.name
또는 stubrunner.consumer-name
을 bar-consumer
로 설정하거나, 아니면 테스트를 다음과 같이 설정하면 된다:
@SpringBootTest(classes = Config, properties = ["spring.application.name=bar-consumer",
"stubrunner.jms.enabled=false"])
@AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers",
repositoryRoot = "classpath:m2repo/repository/",
stubsMode = StubRunnerProperties.StubsMode.REMOTE,
stubsPerConsumer = true)
@ActiveProfiles("streamconsumer")
class StubRunnerStubsPerConsumerSpec {
...
}
이렇게 설정하면 bar-consumer
라는 폴더가 포함된 경로에 등록한 스텁stub만 참조할 수 있다 (즉, src/test/resources/contracts/bar-consumer/some/contracts/...
안에 있는 스텁stub).
다음과 같이 컨슈머consumer 이름을 직접 명시하는 것도 가능하다:
@SpringBootTest(classes = Config, properties = "stubrunner.jms.enabled=false")
@AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers",
repositoryRoot = "classpath:m2repo/repository/",
consumerName = "foo-consumer",
stubsMode = StubRunnerProperties.StubsMode.REMOTE,
stubsPerConsumer = true)
@ActiveProfiles("streamconsumer")
class StubRunnerStubsPerConsumerWithConsumerNameSpec {
...
}
이렇게 설정하면 foo-consumer
라는 폴더가 포함된 경로에 등록한 스텁stub만 참조할 수 있다 (즉, src/test/resources/contracts/foo-consumer/some/contracts/…
안에 있는 스텁stub).
이 기능이 생기게 된 자세한 히스토리가 궁금하다면 224번 이슈를 확인해봐라.
Next :
3.6.8. Fetching Stubs or Contract Definitions From A Location
클래스패스에 있는 스텁, 컨트랙트 재사용하기
전체 목차는 여기에 있습니다.