요약
DTO에 Serializable을 붙이는 이유는, 객체를 네트워크를 통해 다른 서비스로 전송하기 위해 직렬화 가능한 형태로 만들기 위함입니다.
MSA환경에서 Order와 같은 서비스는 User, Catalog등 다른 서비스와 통신하므로 Serializable이 없으면 NotSerializableException이 발생합니다.
Serializable
객체를 바이트 형태로 변환(직렬화)하여 네트워크로 전송하거나 파일, 캐시 등에 저장할 수 있게 하는 인터페이스입니다.
공식 Java문서 정의
"Classes that implement Serializable can be converted into a byte stream and later reconstructed back into an object.
https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html
Serializable (Java Platform SE 8 )
Serializability of a class is enabled by the class implementing the java.io.Serializable interface. Classes that do not implement this interface will not have any of their state serialized or deserialized. All subtypes of a serializable class are themselve
docs.oracle.com
Spring Msa 환경에서 DTO 객체를 다른 서비스로 전송하려면 이 객체를 네트워크에서 이해할 수 있는 바이트 스트림 형태로 변환해야 하고, 가능하게 하는 것이 Serializable이라고 한다.
왜 DTO에 붙여서 사용을 할까?
내부 통신 VS 외부 통신
내부 통신(같은 서비스 안세서)
- Controller -> Service -> Repository
- JVM 내부 메모리 안에서만 객체 전달됨
- 직렬화 필요하지 않음
외부 통신(다른 서비스와 통신)
- Order -> User, Catalog등
- 네트워크를 통해 객체를 전송해야 함 (FeignClient, Kafka 등)
- 직렬화 필요
MSA구조
[User Service] [Catalog Service]
│ │
▼ ▼
내부 통신만 수행 내부 통신만 수행
(직렬화 필요 없음) (직렬화 필요 없음)
│ │
└──────────┬──────────┘
│
▼
[Order Service]
├── User, Catalog와 외부 통신
├── FeignClient / Kafka / Redis
└── DTO 직렬화 필수 (Serializable)

직렬화가 필요한 순간
| 상황 | 설명 | 필요 여부 |
| Controller ↔ Service 내부 DTO | JVM 내부에서만 사용 | ❌ |
| FeignClient로 다른 서비스 호출 | 네트워크로 객체 전송 | ✅ |
| Redis 캐싱 | 객체를 바이트로 저장 | ✅ |
| Kafka 메시징 | 객체를 직렬화하여 전송 | ✅ |
| 세션 저장(Spring Session Redis 등) | 세션 객체 직렬화 필요 | ✅ |
Serializable이 없으면 생기는 예외
@FeignClient(name = "user-service")
public interface UserClient {
@PostMapping("/users/check")
UserResponse checkUser(UserDto userDto); // Serializable 미구현
}
java.io.NotSerializableException: com.example.orderservice.dto.OrderDto
이 예외는 JVM이 이 객체를 바이트로 변환할 수 없음을 의미합니다.
즉 Feign이나 Kafka가 OrderDto를 전송하려고 하는 순간 실패하게 됩니다.
결론
| Serializable 역할 | 객체를 네트워크 전송 가능하게 직렬화 |
| 왜 필요한가 | MSA에서 다른 서비스로 DTO 전송 시 |
| 없을 경우 | java.io.NotSerializableException 발생 |
| Entity는? | DB 전용이면 필요 없음 (단, 캐시/세션 사용 시엔 예외적으로 필요) |
'BACKEND & SERVER > Spring Boot MSA' 카테고리의 다른 글
| [Spring Boot] JitPack | MSA Project GateWay Swagger 구현 (0) | 2025.11.05 |
|---|---|
| [Spring Boot] JitPack | MSA 프로젝트에서 공통 관심사 분리하기 (0) | 2025.11.03 |
| [Spring Boot] Spring Cloud GateWay & Filter (0) | 2025.10.27 |
| [Spring Boot] Resilience4j | 서킷브레이커 (0) | 2025.10.27 |
| [Spring Boot] RestClient vs FeignClient (0) | 2025.10.24 |
