본문 바로가기

Server Development/Client API

Object to Network and vise versa

 

 

 

직렬화

- 직렬화는 기본적으로 객체를 저장하거나 전송하기 위해 객체를 바이트 스트림으로 변환하는 과정을 의미한다.

- 자바에서 주로 사용된다.

- 자바에서는 ObjectOutputStream 클래스를 이용해 객체를 직렬화하여 네트워크로 전송가능하다.

- 직렬화된 객체를(바이트 스트림을) 다시 객체로 바꾸는 과정을 역직렬화라고 한다.

 

 

 

직렬화 및 역직렬화의 조건

  • 1. 클래스는 Serializable 인터페이스를 구현해야한다. 이는 직렬화 가능한 객체임을 명시해준다.
  • 2. 클래스의 필드들은 직렬화 가능해야 한다. 직렬화 가능한 필드란 기본 자료형과 해당 클래스도 Serializable 인터페이스를 구현한 경우를 의미한다. 또한 필드들은 public, protected 둘 중 하나여야 한다.
  • 3. Json 데이터는 자바 객체와 일치해야한다. 즉, Json의 데이터의 필드 이름과 자바 객체의 필드 이름은 같아야 한다.
  • 4. Json 데이터에서 null 값을 가진 필드가 있다면 해당 필드의 자료형이 객체여야 한다. 기본 자료형에서는 null 값을 가질 수 없기 때문이다.

 

 

바이트 스트림

- 데이터를 바이트 단위로 읽거나 쓰는 스트림을 의미한다. 자바에서는 바이트 단위로 데이터를 처리하는 InputStream과 OutputStream 클래스를 제공한다.

- 바이트 스트림은 텍스트나 이미지, 음악 등 모든 종류의 파일을 처리 가능하다. 파일의 내용을 읽을 때는 FileInputStram 클래스를 사용하고, 파일에 내용을 쓸 때는 FileOutPutStream 클래스를 사용한다. 이 클래스들은 모두 InputStream, OutputStream 클래스를 상속받아 바이트 스트림을 처리하는 기능을 제공한다.

- 텍스트 데이터를 처리할 때는 문자스트림을 사용하는 것이 더 효율적이다. 문자열을 바이트 단위로 읽으면(바이트 스트림) 인코딩의 문제가 발생할 수 있기 때문이다.

 

 

 

JVM의 직렬화

- 직렬화는 Serializable 인터페이스를 구현하지 않은 클래스(객체)도 가능하다. JVM에서 자동으로 직렬화하게 된다.

- 하지만 인터페이스를 구현하지 않은 클래스는 애플리케이션 업그레이드나 서버 사양 변경 등과 같은 환경 변화에 따라 직렬화 오류가 발생할 가능성이 높다. 따라서 인터페이스를 구현하는 것이 일반적이다.

 

 

 

이번에는 Spring으로 프로그램을 제작중이라고 가정하고 Json 데이터를 객체로 직렬화한다고 가정한다.

이 때, 다음과 같은 조건이 필요하다.

 

 

조건

1. Json의 필드명과 매핑하려는 클래스의 필드명의 일치

- 매핑시 필드명의 일치여부로 매핑하기에 필요하다.

 

2. 기본생성자

- 매핑의 원리는 우선 기본생성자로 객체를 초기화하고 다음 getter/setter로 필드를 매핑하는 구조다. 따라서 기본생성자가 필요하다.

- 또한 기본생성자는 기본적으로 생성되지만 다른 매개변수가 있는 생성자 생성시 기본생성자는 생성되지 않는다. 따라서 만약 다른 생성자 존재시 기본 생성자를 따로 명시해두어야 한다.

 

3. getter/setter

- 위에서 설명한 이유하에 필요하다.

 

4. 데이터 타입의 일치

- 필드간 데이터 타입이 일치해야 성립된다.

 

 

 

'Server Development > Client API' 카테고리의 다른 글

RestTemplete  (0) 2023.04.03
Class Validation  (0) 2023.04.01
Restful API  (0) 2023.03.27
API  (0) 2023.03.27