상세 컨텐츠

본문 제목

[인턴 OJT 4일차] 직렬화 ( serialization ), file i/o 기반 주소록

인턴

by 리잼 2022. 12. 15. 17:51

본문

반응형

직렬화 ( serialization )

직렬화란?

- 인스턴스의 상태를 그대로 파일 저장하거나 네트웍으로 전송하고 ( serialization )

- 이를 다시 복원 ( deserialization )하는 방식

- 자바에서는 보조 스트림을 활용하여 직렬화를 제공함

ObjectInputStream과 ObjectOutputStream

생성자
설명
ObjectInputStream(InputStream in)
InputStream을 생성자의 매개변수로 받아 ObjectInputStream을 생성합니다.
ObjectOutputStream(OutputStream out)
OutputStream을 생성자의 매개변수로 받아 ObjectOutputStream을 생성합니다.

Serializable 인터페이스

- 직렬화는 인스턴스의 내용이 외부로 유출되는 것이므로 프로그래머가

해당 객체에 대한 직렬화 의도를 표시해야 함

- 구현 코드가 없는 marker interface

- transient : 직렬화 하지 않으려는 멤버 변수에 사용함 (Socket등 직렬화 할 수 없는 객체)

직렬화 예제

class Person implements Serializable{ private static final long serialVersionUID = -1503252402544036183L; String name; String job; public Person() {} public Person(String name, String job) { this.name = name; this.job = job; } public String toString() { return name + "," + job; } } public class SerializationTest { public static void main(String[] args) throws ClassNotFoundException { Person personAhn = new Person("이순신", "대표이사"); Person personKim = new Person("김유신", "상무이사"); try(FileOutputStream fos = new FileOutputStream("serial.out"); ObjectOutputStream oos = new ObjectOutputStream(fos)){ oos.writeObject(personAhn); oos.writeObject(personKim); }catch(IOException e) { e.printStackTrace(); } try(FileInputStream fis = new FileInputStream("serial.out"); ObjectInputStream ois = new ObjectInputStream(fis)){ Person p1 = (Person)ois.readObject(); Person p2 = (Person)ois.readObject(); System.out.println(p1); System.out.println(p2); }catch (IOException e) { e.printStackTrace(); } } }

file i/o 기반 주소록 만들기

AddressBookVo

package com.barunsw.ojt.vo; import java.io.Serializable; import org.apache.commons.lang3.builder.ToStringBuilder; import com.barunsw.ojt.constants.Gender; public class AddressBookVo implements Serializable { private static int SEQ_NUM = 1; private int seqNum; private String name; private String birthday; private Gender gender; private String phoneNumber; private String address; public AddressBookVo() {} // 디폴트 생성자 public AddressBookVo(String name, String birthday, Gender gender, String phoneNumber, String address) { this.seqNum = generateSeqNum(); this.name = name; this.birthday = birthday; this.gender = gender; this.phoneNumber = phoneNumber; this.address = address; } public static int generateSeqNum() { return SEQ_NUM++; } public static void resetSeqNum(int seqNum) { SEQ_NUM = seqNum; } public int getSeqNum() { return seqNum; } public void setSeqNum(int seqNum) { this.seqNum = seqNum; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }

AddressBookInterface // 인터페이스에서 주소록 규격을 맟춤

package com.barunsw.ojt.intf; import java.util.List; import com.barunsw.ojt.vo.AddressBookVo; public interface AddressBookInterface { /** * 주소록 정보를 조회한다. * @param paramData 주소록 정보 리스트 * @return */ public List<AddressBookVo> selectAddressBook(AddressBookVo paramData); /** * 주소록 정보를 생성한다. * @param paramData 주소록 정보 * @return * @throws Exception */ public int insertAddressBook(AddressBookVo paramData) throws Exception; /** * 주소록 정보를 수정한다. * @param paramData 주소록 정보 * @return * @throws Exception */ public int updateAddressBook(AddressBookVo paramData) throws Exception; /** * 주소록 정보를 삭제한다. * @param paramData 주소록 정보 * @return * @throws Exception */ public int deleteAddressBook(AddressBookVo paramData) throws Exception; }

FileAddressBookImpl

package com.barunsw.ojt.jmlee.day04; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.barunsw.ojt.intf.AddressBookInterface; import com.barunsw.ojt.vo.AddressBookVo; public class FileAddressBookImpl implements AddressBookInterface { private List<AddressBookVo> addressBookList = new ArrayList<AddressBookVo>(); private static Logger LOGGER = LoggerFactory.getLogger(FileAddressBookImpl.class); private static String FILE_PATH = ""; // static으로 filepath를 지정해주 private void resetPath(String filePath) { FILE_PATH = filePath; } public FileAddressBookImpl(String filePath) throws Exception { File file = new File(filePath); boolean isExists = file.exists(); if (!isExists) { file.createNewFile(); } resetPath(filePath); loadAddressBook(); } private void loadAddressBook() { // 파일로부터 Address 정보를 가져와서 addressBookList에 담는다.(ObjectInputStream) // AddressBookVo의 SEQ_NUM를 가장 큰 seqNum + 1로 reset한다. try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(FILE_PATH ))) { Object o = null; while ((o = inputStream.readObject()) != null) { if(o instanceof AddressBookVo) { AddressBookVo addressBook = (AddressBookVo)o; addressBookList.add(addressBook); } } } catch (EOFException eof) {} catch (Exception ex) { LOGGER.error(ex.getMessage(),ex); } } private void saveAddressBook() throws Exception { // addressBookList의 데이터를 파일에 저장한다.(ObjectOutputStream) AddressBookVo.resetSeqNum(1); try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(FILE_PATH))) { for (AddressBookVo addressBook : addressBookList) { addressBook.setSeqNum(AddressBookVo.generateSeqNum()); outputStream.writeObject(addressBook); } } catch (Exception ex) { LOGGER.error(ex.getMessage(),ex); } } @Override public List<AddressBookVo> selectAddressBook(AddressBookVo paramData) { for (AddressBookVo oneAddressBook : addressBookList) { LOGGER.debug(oneAddressBook.toString()); } return addressBookList; } @Override public int insertAddressBook(AddressBookVo paramData) throws Exception { // TODO Auto-generated method stub addressBookList.add(paramData); LOGGER.debug(paramData.getName()+" 정보등록 완료"); saveAddressBook(); return 0; } @Override public int updateAddressBook(AddressBookVo paramData) throws Exception { // 동일한 seqNum의 주소 정보를 addressBookList에 찾아 해당 index의 데이터를 치환한다. addressBookList.set(paramData.getSeqNum()-1, paramData); LOGGER.debug(paramData.getName() + " 님의 정보수정 완료"); saveAddressBook(); return 0; } @Override public int deleteAddressBook(AddressBookVo paramData) throws Exception { // 동일한 seqNum의 주소 정보를 addressBookList에 찾아 해당 index의 데이터를 삭제한다. addressBookList.remove(paramData.getSeqNum()-1); LOGGER.debug(paramData.getName() + " 님의 정보삭제 완료"); saveAddressBook(); return 0; } }

AddressBookMain

package com.barunsw.ojt.jmlee.day04; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.barunsw.ojt.constants.Gender; import com.barunsw.ojt.intf.AddressBookInterface; import com.barunsw.ojt.vo.AddressBookVo; public class AdressBookMain { private static Logger LOGGER = LoggerFactory.getLogger(AdressBookMain.class); public static void main(String[] args) { try { AddressBookInterface addressBook = new FileAddressBookImpl("data/addressbook2.dat"); AddressBookVo addressBookVo = new AddressBookVo("배수현", "1975-09-04", Gender.MAN, "010-0000-0000", "서울"); AddressBookVo addressBookVo2 = new AddressBookVo("이재민", "1995-09-15", Gender.MAN, "010-0000-0000", "대전"); AddressBookVo addressBookVo3 = new AddressBookVo("정은원", "2000-04-06", Gender.MAN, "010-0000-0000", "대전"); addressBook.insertAddressBook(addressBookVo); // 연락처 등록문 addressBook.insertAddressBook(addressBookVo2); addressBook.insertAddressBook(addressBookVo3); addressBook.selectAddressBook(null); // 연락처 조회문 addressBook.deleteAddressBook(addressBookVo2); // 연락처 삭제문 addressBookVo.setBirthday("2020-01-01"); // 연락처 수정 addressBook.updateAddressBook(addressBookVo); // 연락처 업데이트 addressBook.selectAddressBook(null); LOGGER.debug("NEXT SEQ_NUM : " + (AddressBookVo.generateSeqNum())); } catch (Exception ex) { LOGGER.error(ex.getMessage(), ex); } } }

기능이 정상적으로 작동하는 모습

반응형

관련글 더보기

댓글 영역