티스토리 뷰
transient
은 Serialize하는 과정 중 제외하고 싶은 항목에 선언하는 키워드입니다.
Transient 을 사용하는 이유는?
보안정책 상 패스워드, 주민등록 번호와 같은 개인정보를 직렬화(Serialize) 과정에서 제외하고 싶은 경우에 적용합니다.
그 외에 직렬화 과정 후 데이터를 전송을 하고 싶지 않을 때 선언하여 예외처리 합니다.
Transient 코드로 알아보기.
간단히 회원정보를 저장하는 Data을 갖고 Transient 되는 것을 확인하겠습니다.
Model (Member)
class Member implements Serializable { | |
private String name; | |
private String email; | |
private int age; | |
public Member(String name, String email, int age) { | |
this.name = name; | |
this.email = email; | |
this.age = age; | |
} | |
@Override | |
public String toString() { | |
return String.format("My name is %s, email is %s, age is %d}", name, email, age); | |
} | |
} |
Main
public class TransientTest { | |
public static void main(String[] args) throws IOException, ClassNotFoundException { | |
Member member = new Member("KYU", "dev.faithpeople@gmail.com", 30); | |
String serialData = toString( member); // 직렬화 | |
System.out.println("Encoded serialized version " ); | |
System.out.println(serialData); | |
Member deSerializeData = (Member)fromString(serialData); // 역직렬화 | |
System.out.println("Member deSerialized version " ); | |
System.out.println(deSerializeData); | |
} | |
/** Read the object from Base64 string. */ | |
private static Object fromString( String s ) throws IOException, ClassNotFoundException { | |
byte [] data = Base64.getDecoder().decode( s ); | |
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data)); | |
Object o = ois.readObject(); | |
ois.close(); | |
return o; | |
} | |
/** Write the object to a Base64 string. */ | |
private static String toString( Serializable o ) throws IOException { | |
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |
ObjectOutputStream oos = new ObjectOutputStream( baos ); | |
oos.writeObject( o ); | |
oos.close(); | |
return Base64.getEncoder().encodeToString(baos.toByteArray()); | |
} | |
} |
아래의 이미지 처럼 직렬화가 잘 된 것을 확인할 수 있습니다.
Name 변수에 transient keyword를 추가하여 결과를 보겠습니다.
class Member implements Serializable { | |
private transient String name; | |
private String email; | |
private int age; | |
public Member(String name, String email, int age) { | |
this.name = name; | |
this.email = email; | |
this.age = age; | |
} | |
@Override | |
public String toString() { | |
return String.format("My name is %s, email is %s, age is %d}", name, email, age); | |
} | |
} |
name field는 유지되지만 값은 null로 대입됩니다.
마무리
Transient 을 활용하여 직렬화 (Serialize)의 예외처리를 확인하였습니다.
Transient 을 사용 시에는 해당 Data가 필요 여부 파악이 중요합니다.
만약 제대로 파악 없이 Data를 제외하였을 경우 서비스 장애에 이상이 있으면 원인 파악하는데 힘들겠죠.
보안적인 측면에서는 장점이지만 쉽게 보안이 되는만큼 프로젝트 정책과 프로세스에 따른 분석 후 사용하는 것을 권장합니다.
참고
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.3.1.4
'프로그래밍 > Java' 카테고리의 다른 글
직렬화(Serializable)에 대해서 가볍게 살펴보기 (0) | 2020.04.08 |
---|---|
DI(의존성주입) 은 무엇인가? (0) | 2018.07.14 |
[Java]enum을 이용한 for-each 문 (0) | 2017.12.18 |
[Java]직렬화(Serializable) (0) | 2017.12.18 |
- MCC
- 고시문헬퍼
- 미션차이나센터
- 코틀린
- 안드로이드
- missionchina
- flutter
- missioon
- 알고리즘
- 스코어헬퍼
- Android
- 탁구
- Kotlin
- IT
- 점수판
- 고시문
- push
- view
- Android Studio
- 선교
- swift
- RXjava
- issue
- IOS
- 임용고시
- DI
- java
- 패턴
- 디자인패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |