Spring/Spring JPA

[JPA]@ToString.Exclude

개발자잡 2024. 11. 25. 09:36

@ToString.Exclude는 Lombok 라이브러리에서 제공하는 어노테이션입니다. 이는 @ToString 어노테이션과 함께 사용되며, 객체를 문자열로 변환할 때(ToString 메서드 생성 시) 특정 필드를 제외하도록 설정할 수 있습니다.

 

주요 기능

  • 무한 순환 참조 방지:
    • 엔티티 간 양방향 관계가 있는 경우, @ToString 메서드에서 무한 순환 참조가 발생할 수 있습니다.
    • 예를 들어, A가 B를 참조하고 B가 다시 A를 참조하는 경우, toString() 호출 시 무한 루프에 빠질 수 있습니다.
    • 이 경우 @ToString.Exclude를 사용하여 순환 참조 문제를 방지합니다.
  • 필드 제외:
    • toString() 메서드 출력에서 특정 필드를 제외할 수 있습니다.
    • 예를 들어, 비밀번호와 같은 민감한 데이터를 출력에서 제외하려는 경우 유용합니다.

예제

1. 순환 참조 방지

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class User {
    private Long id;
    private String name;

    @ToString.Exclude
    private Profile profile; // 이 필드는 toString() 출력에서 제외됩니다.
}

@Getter
@Setter
@ToString
public class Profile {
    private Long id;
    private String bio;

    @ToString.Exclude
    private User user; // 이 필드도 toString() 출력에서 제외됩니다.
}
  • User와 Profile이 서로를 참조하는 양방향 관계.
  • @ToString.Exclude로 toString() 출력에서 서로 참조하는 필드를 제외함으로써 순환 참조 문제를 방지.

2. 민감한 데이터 숨기기

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Account {
    private String username;

    @ToString.Exclude
    private String password; // 민감한 데이터를 제외
}
Account account = new Account();
account.setUsername("john_doe");
account.setPassword("securepassword");

System.out.println(account);

 

출력 결과

Account(username=john_doe)

 

password 필드는 출력되지 않습니다.

 

사용 시 주의점

  1. 필드 누락:
    • @ToString.Exclude로 제외된 필드는 toString() 결과에 포함되지 않으므로 디버깅 시 필요한 정보를 의도치 않게 누락할 수 있습니다.
    • 사용 전 제외 여부를 신중히 고려해야 합니다.
  2. 순환 참조와 성능:
    • 순환 참조 문제를 방지하면서도 객체의 구조를 효율적으로 표현할 수 있습니다.

정리

  • @ToString.Exclude는 Lombok에서 @ToString 어노테이션과 함께 특정 필드를 toString() 출력에서 제외하는 데 사용됩니다.
  • 주로 순환 참조 문제 해결 또는 민감한 정보 보호를 위해 활용됩니다.