HTTP 서버와 클라이언트간에 인터페이스를 공유하는 방법에 대해 알게되었을 때 Spring Cloud Netflix 설명서를 읽고있었습니다 . 일반 HTTP 통신으로 확장 할 수없는 이유는 없지만 마이크로 서비스에이 예제를 사용합니다.
// The shared interface, in a common library
public interface UserService {
@RequestMapping(method = GET, value = "/users/{id}")
User getUser(@PathVariable long id);
}
// The controller, on the server
@RestController
public class UserResource implements UserService {
}
// The same interface used for the client
@FeignClient("users")
public interface UserClient extends UserService {
}
이것은 서버 (Spring @RestController
이 HTTP 서버로 바꾼다)와 클라이언트 (The Feign @FeignClient
이 HTTP 클라이언트 사용을 위해 설정한다 )로 사용되는 인터페이스를 정의한다 . 서버 및 클라이언트 클래스 구현은 별도의 프로젝트에서 사용할 수 있지만 동일한 인터페이스를 사용하여 유형이 일치하는지 확인하십시오.
그러나 예제 아래에 다음과 같은 경고가 있습니다.
참고 : 일반적으로 서버와 클라이언트간에 인터페이스를 공유하지 않는 것이 좋습니다. 그것은 긴밀한 결합을 도입하고 실제로 현재 형태로 Spring MVC와 작동하지 않습니다 (메소드 매개 변수 매핑은 상속되지 않습니다).
좋아, 지금은 잘 통합되지 않았지만 ...이 부분은 코드 공유 및 서버와 클라이언트 사이의 커플 링 도입에 대한 경고 이후에 발생 합니다. 더 중요합니다. 왜 이런 식으로 인터페이스를 공유하는 것이 그렇게 나쁜 생각이라고 생각합니까?
그렇지 않으면 서버와 클라이언트가 서로 이해할 수있는 서로 다른 데이터를 보내도록 보장 할 수 없습니다. 한 필드에는 필드를 추가 할 수 있지만 다른 필드에는 추가 할 수 없으며 런타임까지 불일치를 발견 할 수 있습니다. 내 생각에, 그것은 커플 링을 소개하는 것이 아니라 이미 존재하는 커플 링을 드러내는 것입니다. 서버가 어떤 유형의 데이터를 수신하는지 알려주는 것보다 서버를 완전히 독립적으로 만들어야합니까?