어제 저녁부터 나의 앞길을 가로 막은것이 자바 객체 복사..
서버가 시동 되면서 서버에 있는 데이터 파일을 읽어다가 Map형태로 서버에 들고 있는 형태.
그러다 요청이 오면 그 맵파일을 그대로 보내주기만 하면 되는 그런 구조.
데이터는 오라클 디비에서 불러온 값을 자바 Object형태를 파일로 쓴걸 다시 읽어온것이다.
데이터를 싱글톤 패턴으로 읽다보니 이 데이터를 가공하게 되면 다른 데이터에도 영향을 미치는 상황이었다.
data = CachedXPG.getInstance().getData();
위와 같은 코드로 서버에 저장된 데이터를 가지고 오는것이었고.
불러온 데이터를 가공하게 되면 서버를 다시 동작 시키지 않는 이상 가공된 데이터를 내보내게 되는 상황.
Map<String, Object> copyData = data;
위와 같은 코드로 아무리 복사를 해봐야 같은 주소를 바라보기 때문에 원래의 데이터를 변경하게 된다.
그래서 알아본게 얕은 복사와 깊은 복사인데..
이건 클래스에 Cloneable 인터페이스를 상속받아 clone()메소드를 구현해 줘야 한다.
이러기가 싫다라는 분은 아래와 같은 방법을 써보기 바란다.
public Object deepCopy(Object oldObj) {
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
Object result;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(oldObj);
oos.flush();
ByteArrayInputStream bin = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bin);
result = ois.readObject();
}catch(Exception e) {
e.printStackTrace();
result = null;
}finally {
try {
if(oos != null) oos.close();
if(ois != null) ois.close();
}catch(Exception e) {}
}
return result;
}
객체를 그대로 아웃풋 스트림으로 내보냈다가 인풋 스트림으로 읽어 들여오는 방법.
왜이런 생각을 하지 못했을까..
아직은 실력부족이다.
위의 방법으로 일겅 들여와 그걸 알맞은 타입으로 캐스팅 하면 객체 복사 완료.
Cloneable을 사용 못하는 경우에는 위와 같은 방법으로 해보길 바란다.
'Java' 카테고리의 다른 글
Build path specifies execution environment J2SE-1.4...compatible with this environment. (0) | 2014.04.28 |
---|---|
Java Try Catch Finally.. (0) | 2014.01.08 |
java.lang.NoSuchMethodError.. (0) | 2013.08.27 |
Java Server Timeout Test하기. (0) | 2013.02.05 |
Https SSLHandshakeException..! (0) | 2012.10.16 |