MSA의 동기적 (Synchronous) 통신

MSA 통신 방식 중 동기적 통신을 정리하기 위한 글!

 

 

1. 동기적 통신

동기 통신 방식은 클라이언트가 요청을 보내고 응답을 받을 때까지 기다리는 방식이다.

일반적으로 즉각적인 응답이 필요한 서비스에서 사용된다.

 

 

REST API


✔️ 개념

REST(Representational State Transfer) API는 HTTP 프로토콜을 기반으로 한 웹 서비스 통신 방식이다.

REST의 기본 원칙을 따르면 클라이언트-서버 구조에서 상태를 유지하지 않고, -> stateless

자원을 URI로 식별하여 CRUD(Create, Read, Update, Delete) 연산을 수행할 수 있다.

 

특징

자원(Resource): URI (예시: /user/login)로 접근 가능

HTTP 메서드 활용

JSON 또는 XML 데이터 포맷 사용

 

🔥 REST API 동작 원리

1. 클라이언트가 HTTP 요청을 보냄

2. 서버에서 요청을 처리하고, JSON 등의 포맷으로 응답

3. 클라이언트가 응답을 받아 처리

 

 

장단점

장점

  • 사용이 간편하고 직관적 (브라우저에서 바로 테스트 가능)
  • JSON 기반으로 가볍고 효율적
  • HTTP 기반이라 별도의 프로토콜 없이 사용 가능
  • 다양한 언어 및 플랫폼에서 지원

단점

  • 데이터 크기가 클 경우 성능 저하 가능 (예: XML 사용 시)
  • HTTP 요청이 많아질수록 오버헤드 증가
  • 요청-응답 구조로 인해 실시간 양방향 통신이 어려움

 

구현 예제 Spring Boot 기반

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = new User(id, "test", "test@example.com");
        return ResponseEntity.ok(user);
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        user.setId(1L); // 예제용 ID 설정
        return ResponseEntity.status(HttpStatus.CREATED).body(user);
    }
}

 

 

gRPC


✔️ 개념

gRPC(Google Remote Procedure Call)는 Google에서 개발한 고성능 RPC(Remote Procedure Call) 프레임워크다.

HTTP/2 기반으로 동작하고, Protocol Buffers(ProtoBuf)라는 직렬화 방식을 사용해 데이터 전송 효율성을 높였다.

 

 특징

이진 데이터(Protocol Buffers)을 사용해서 REST보다 빠르다.

HTTP/2 기반이라 멀티플렉싱, 헤더 압축을 지원한다.

다양한 언어에서 gRPC 클라이언트 사용이 가능하다.

 

🔥 REST API 동작 원리

1. .proto 파일을 생성해 서비스를 정의

2.. gRPC 서버 구현

3. gRPC 클라이언트에서 호출

 

 

장단점

장점

  • REST보다 빠른 속도 (ProtoBuf 직렬화 사용)
  • HTTP/2 지원으로 효율적인 네트워크 사용
  • 자동 코드 생성으로 개발 편의성 증가
  • 다중 언어 지원 (Java, Python, Go 등)

단점

  • REST보다 설정이 복잡
  • 브라우저에서 직접 호출 불가능 (JSON 기반이 아님)
  • 디버깅 및 모니터링이 어려울 수 있음

 

구현 예제 Spring Boot 기반

Proto 파일 작성

syntax = "proto3";

service UserService {
  rpc GetUser (UserRequest) returns (UserResponse);
}

message UserRequest {
  int64 id = 1;
}

message UserResponse {
  int64 id = 1;
  string name = 2;
  string email = 3;
}

 

 

gRPC 서버 구현

 

@GrpcService
public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {

    @Override
    public void getUser(UserRequest request, StreamObserver<UserResponse> responseObserver) {
        UserResponse response = UserResponse.newBuilder()
                .setId(request.getId())
                .setName("test")
                .setEmail("test@example.com")
                .build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}

 

 

gRPC 클라이언트 구현

ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9090)
        .usePlaintext()
        .build();

UserServiceGrpc.UserServiceBlockingStub stub = UserServiceGrpc.newBlockingStub(channel);

UserResponse response = stub.getUser(UserRequest.newBuilder().setId(1).build());
System.out.println(response.getName());

 

 

 

GraphQL


✔️ 개념

GraphQL은 Facebook에서 개발한 API 쿼리 언어

클라이언트가 원하는 데이터만 요청할 수 있도록 설계되어 있다.

 

 특징

필요한 데이터만 요청 가능

REST보다 유연한 쿼리를 지원

하나의 요청으로 여러 개의 데이터 조회 가능

 

🔥 REST API 동작 원리

1. 클라이언트가 원하는 데이터 구조를 요청

2. 서버에서 요청을 처리하고, JSON 형태로 반환

 

 

장단점

장점

  • 클라이언트가 필요한 데이터만 가져올 수 있음 → 네트워크 비용 절감
  • 여러 개의 리소스를 한 번의 요청으로 가져올 수 있음
  • API 버전 관리가 필요 없음

단점

  • REST보다 구현이 복잡
  • 캐싱이 어렵고 성능 튜닝이 필요
  • 대량의 데이터 요청 시 서버 부하 발생 가능

 

구현 예제 Spring Boot 기반

GraphQL Schema 정의

type Query {
  user(id: ID!): User
}

type User {
  id: ID!
  name: String
  email: String
}

 

GraphQL 서비스 구현

@Component
public class UserDataFetcher implements GraphQLQueryResolver {
    public User getUser(Long id) {
        return new User(id, "test", "test@example.com");
    }
}

 

요청 예제

query {
  user(id: 1) {
    name
    email
  }
}

 

'Spring' 카테고리의 다른 글

MSA 통신의 제로 페이로드(Zero Payload)  (0) 2025.02.28
MSA의 비동기적(Asynchronous) 통신  (0) 2025.02.28
MSA란?  (0) 2025.02.27
OpenFeign으로 API 호출 자동화하기  (0) 2025.02.27
낙관적 락과 비관적 락  (0) 2025.02.26