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 |