반응형

 

 

요약


 

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 전용이면 필요 없음 (단, 캐시/세션 사용 시엔 예외적으로 필요)

 

728x90
반응형