@JsonIgnore vs @Transient
카테고리: Java
태그: Serialization Java
자바에는 객체를 바이너리 데이터로 직렬화 및 역직렬화할 수 있도록 Serialization
인터페이스를 지원하고 있습니다. 그리고 특정 필드를 직렬화에서 제외시키는 trasient
키워드 또한 존재합니다.
이와 비슷하게 @JsonIgnore
와 @Transient
어노테이션도 변환 및 저장하는 과정에서 특정 필드를 제외시킬 수 있는 어노테이션들입니다. 본 포스팅에서 @JsonIgnore
와 @Transient
은 무엇이고 어떠한 차이점이 있는 다뤄보려 합니다.
@JsonIgnore
특정 메소드나 필드를 직렬화 과정에서 제외시키는 @JsonIgnore
어노테이션이 존재합니다. 이 어노테이션은 Jackson 라이브러리에 속한 어노테이션으로, 비밀번호와 같은 민감한 정보가 저장되지 않도록 하기위해 사용됩니다.
class Person implements Serializable {
private Long id;
private String firstName;
private String lastName;
// getters and setters
}
위와 같은 클래스가 있고, Jackson 라이브러리를 이용하여 Json 형식의 데이터로 변환하고 싶다고 가정하겠습니다.
@Test
void initializeTest() throws JsonProcessingException {
Person person = new Person(1L, "My First Name", "My Last Name");
String result = new ObjectMapper().writeValueAsString(person);
System.out.println(result);
// 결과: {"id":1,"firstName":"My First Name","lastName":"My Last Name"}
}
하지만 Json으로 변환된 필드 중 id
와 같은 필드는 저장(직렬화)되지 않길 원할 수 있습니다. 이때 사용되는 것이 @JsonIgnore
입니다.
class Person implements Serializable {
@JsonIgnore
private Long id;
private String firstName;
private String lastName;
// getters and setters
}
@Test
void initializeTest() throws JsonProcessingException {
Person person = new Person(1L, "My First Name", "My Last Name");
String result = new ObjectMapper().writeValueAsString(person);
System.out.println(result);
// 결과: {"firstName":"My First Name","lastName":"My Last Name"}
// id 필드는 저장되지 않는다.
}
@Trasient
@Trasient은 JPA의 영속화 과정에서 특정 필드를 제외시키기 위해 사용되는 어노테이션입니다. 필드에 @Transient를 붙이면, 더 이상 그 필드는 영속 대상이 아니며, 데이터베이스에 저장이 되지도 데이터베이스에서 값을 가져올 수도 없습니다.
@Entity
@Table(name = "Users")
class User implements Serializable {
@Id
private Long id;
private String username;
private String password;
@Transient
private String repeatedPassword;
// getters and setters
}
여기서 주의해야할 점은 영속 대상에서 제외되는 것이지, 직렬화에서 제외되는 것이 아니라는 점입니다.
@Test
void givenUser_whenSerializing_thenTransientFieldNotIgnored() throws JsonProcessingException {
User user = new User(1L, "user", "newPassword123", "newPassword123");
String result = new ObjectMapper().writeValueAsString(user);
System.out.println(result);
// 결과: {"id":1,"username":"user","password":"newPassword123","repeatedPassword":"newPassword123"}
// repeatedPassword 필드는 직렬화 가능
}
정리
@JsonIgnore와 @Transient은 둘 다 특정 필드가 저장이 되지 않길 바랄 때 사용할 수 있습니다.
@JsonIgnore은 Json 형식으로 데이터를 직렬화할 때 사용할 수 있고, @Trasient는 특정 필드가 영속 대상에서 제외되길 바랄 때 사용할 수 있습니다.
따라서 각각의 어노테이션을 목적에 맞게 잘 사용해야합니다.
댓글 남기기