본문 바로가기

학원/복기

0426 - 객체 직렬화, 네트워크

객체 직렬화(Object Serialization) 

객체 직렬화 : 객체를 byte(원시데이터) 배열로 변환하여 입력 또는 출력 처리되기 위한 기능을 제공하는 것 

 

※ 우아한 형제 기술 블로그에서 말하는 자바에서의  직렬화

•자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 말합니다.

•시스템 적으로는 JVM(Java Virtual Machine)의 메모리에 상주(heap 또는 stack) 되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 말합니다.

즉, 자바에서는 직렬화 시 데이터(Object)를 바이트(byte) 스트림 형태로 변환한다.

 

클래스를 객체 직렬화 처리하여 객체 직렬화 클래스를 만드는 방법 - 2가지 

1. Serializable 인터페이스를 상속받아 클래스를 작성한다. 
 → SErializable 인터페이스에 추상메소드가 없으므로 오버라이드 선언하지 않아도 된다.  
 → 객체의 모든 필드값을 byte 배열로 변환하여 입력 또는 출력 처리한다. 
  
2. Externalizable 인터페이스를 상속받아 클래스를 작성  
 → Externalizable 인터페이스에는 readExternal(ObjectInput in)와 writeExternal(ObjectOutput out) 
    추상메소드를 반드시 오버라이드 선언해줘야 한다.  
 → 오버라이드 선언된 메소드에서 원하는 필드값만을 byte 배열로 변환하여 입력 또는 출력 처리 한다.  
    따라서 다 보내는 것이 아니라, 필요한 것만 보내거나 받을 수 있다.

 

일반적으로는 Serializable을 많이 사용한다. 
Externalizable는 객체가 가지고 있는 값이 많을 때 입출력 속도를 빠르게 하기 위해서 등 특별한 경우에만 사용한다.

 

또한 객체 직렬화 클래스는 클래스를 구분하기 위한 고유값이 저장된 serialVersionUID 필드를 선언하는 것을 권장한다.

필드의 자료형은 long으로 설정하고 static과 final 제한자를 사용한다.

→ 이클립스에서는 고유값이 저장된 serialVersionUID 필드를 자동 생성하는 기능을 제공한다.

import java.io.Serializable;

//객체 단위로 입력 또는 출력 처리하기 위한 클래스는 반드시 객체 직렬화 클래스로 선언
public class Member implements Serializable {
	//serialVersionUID 필드 선언 
	private static final long serialVersionUID = -3306639107947980039L;
}

회원정보가 저장된 Member 객체를 이용해 파일에 전달하여 저장하고, 파일에 저장된 객체를 제공받아 출력하기

import java.io.Serializable;

//회원정보(아이디, 이름, 전화번호)를 저장하기 위한 클래스 - VO 클래스
public class Member implements Serializable {
	private static final long serialVersionUID = -3306639107947980039L;
	
	private String id;
	private String name;
	private String phone;
	
	public Member() {
		// TODO Auto-generated constructor stub
	}

	public Member(String id, String name, String phone) {
		super();
		this.id = id;
		this.name = name;
		this.phone = phone;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}
	
	@Override
	public String toString() {
		return "아이디 = "+id+", 이름 = "+name+", 전화번호 = "+phone;
	}
}


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

//회원정보(Member 객체)를 파일에 전달하여 저장하는 프로그램 작성
public class MemberSaveApp {
	public static void main(String[] args) throws IOException {
		ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("c:/data/member.txt"));
		
		//out.writeObject(Object o) 메소드 호출시 NotSerializableException 발생
		//NotSerializableException : 객체 직렬화 처리되지 않은 클래스의 객체를 출력스트림으로
		//전달할 경우 발생되는 예외
		// => 출력스트림으로 전달될 객체의 클래스를 객체 직렬화 처리하면 예외 미발생
		out.writeObject(new Member("abc123", "홍길동", "010-3174-1234"));
		out.writeObject(new Member("def456", "임꺽정", "010-2145-8741"));
		out.writeObject(new Member("ghi789", "전우치", "010-9813-6547"));
		
		out.close();
		
		System.out.println("c:\\data\\object.txt 파일에 회원정보를 저장 하였습니다.");
	}
}

package xyz.itwill.io;

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

//파일에 저장된 회원정보(Member 객체)를 제공받아 출력하는 프로그램 작성
public class MemberLoadApp {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		ObjectInputStream in=new ObjectInputStream(new FileInputStream("c:/data/member.txt"));
		
		System.out.println("<<회원목록>>");
		while(true) {
			try {
				//ObjectInputStream.readObject() 메소드 호출시 파일 커서가 EOF 위치에 있는 
				//경우 EOFException 발생
				Member member=(Member)in.readObject();
				System.out.println(member);
			} catch (EOFException e) {
				break;
			}
		}
		
		in.close();
	}
}
EOFException : readObject() 메소드는 더이상 읽어온 객체가 없을 때  EOFException 을 발생시킨다. 
따라서 예외처리를 해줘야 한다.

네트워크

네트워크 관련 용어 정리 


네트워크(Network) : 두 대이상의 컴퓨터에서 값을 송수신 하기 위한 기능 
인터넷(Internet) : 현실 세계에 존재하는 모든 컴퓨터를 연결한 네트워크 통신망 >> 프로토콜 기반 

• 프로토콜(Protocol) : 인터넷을 사용하기 위한 네트워크 관련 약속 - 통신규약 

프로토콜 구조  
: 네트워크 계층 > 인터넷 계층(IP) > 전송계층 (TCP or UDP)  > 응용계층(FTP, HTTP, SMTP 등)

 

 호스트(Host) : 네트워크 기능을 사용하는 컴퓨터(프로그램) 

  네트워크 계층 - 이더넷, 라우터, 스위치허브 등 
 → 이더넷(Ethernet) : 호스트에서 사용하기 위한 통신 장비 
 → 라우터(Router) : 네트워크 그룹과 네트워크 그룹을 연결하기 위한 통신 장비
 → 스위치허브(SwitchHub) : 호스트와 호스트 또는 호스트와 네트워크 그룹을 연결하기 위한 통신 장비 

 

• IP(Internet Protocol) : 인터넷을 사용하기 위한 네트워크 주소(IP 주소)에 대한 통신규약 - IPV4, IPV6

 TCP(Transmission Control Protocol) : 연결형 프로토콜 (네트워크 기능을 이용한 연결 후 통신 가능) 
 - 신뢰할 수 있는 데이터 전송에 대한 통신규약 - 전송 제어 프로토콜 
 → 소켓(Socekt)을 이용해 통신한다. - 1:1 연결 
 UDP(User Datagram Protocol) : 비연결형 프로토콜(네트워크 기능을 이용한 연결 설정 없이 통신 가능)로  신뢰할 수 없는 데이터 전송의 통신규약 - 사용자 데이터그램 프로토콜
→ 고속통신 - 1:다 연결 

 응용계층 : 전송계층을 기반으로 생성된 다수의 하위 프로토콜을 사용한 응용 프로그램 


 IP 주소 : 인터넷을 사용하기 위해 컴퓨터에 부여하는 네트워크 식별자 
→ IPV4 : 32Bit를 이용하여 IP 주소를 표현 - 10진수 0~255 범위의 정수값 4개를 [.]으로 구분하여 표현 
→ IPV6 : 128Bit를 이용하여 IP 주소 표현 - 16진수 0000~ffff 범위의 정수값 8개를 [:]으로 구분하여 표현 
→ 공인 IP 주소와 사설 IP 주소(A Class : 10.0.0.0~10.255.255.255, B Class : 172.16.0.0~172.31.255.255, C Class : 192.168.0.0~192.168.255.255)로 구분

 NetMask 주소 : 네트워크 그룹(SubNet)을 표현하기 위한 주소 
→ A Class : 255.0.0.0 - 16,777,216 => 0.X.X.X ~ 127.X.X.X (IP주소) 
→ B Class : 255.255.0.0 - 65,536 => 128.X.X.X ~ 191.X.X.X (IP주소) 
→ C Class : 255.255.255.0 - 256 => 192.X.X.X ~ 232.X.X.X (IP주소)

 Gateway 주소 : 라우터에 부여된 IP 주소 

 

 DNS 서버 : 도메인(호스트 이름)을 IP 주소로 변환하는 기능의 서비스를 제공하는 컴퓨터 

 

 도메인(Domain) : 인터넷을 사용하기 위해 네트워크 그룹 또는 호스트에게 부여하는 문자로된 네트워크 식별자
 → 도메인 그룹에 등록되어 있어야 호스트 사용 가능 - 도메인 호스트 

 

 포트번호(Port Number) : 인터넷을 사용하여 데이터를 송수신하기 위한 고유의 통신 경로
→ 네트워크 프로그램은 반드시 0~65535 범위의 포트 중 하나를 사용하여 데이터를 전송해야 한다.    
→ 0~1023 : Well-Known Port(HTTP : 80, HTTPS : 443, SMTP : 25, POP3 : 110 등)   >> 약속되어진 포트이기 때문에 사용해선 안된다  
→ 1024 ~ 49151 : 네트워크 프로그램 작성시 사용 가능한 포트 
→ 49152 ~ 65535 : 일시적으로 사용하는 임시 포트 - Private Port >> 사용해선 안된다

 

 패킷(Packet) : 인터넷에서 데이터를 전송하기 위한 단위 - Java에서는 byte 배열로 표현이 가능 

 

• 방화벽(Firewall) : 네트워크를 이용한 접속 및 데이터 전송 차단 또는 허용을 위한 시스템(프로그램)