🔍 Lombok @ToString(callSuper = true)란?
- 상속 구조에서 부모 클래스의 필드까지 출력하려면?


✅ @ToString 어노테이션이란?

Lombok에서 제공하는 @ToString은 클래스의 toString() 메서드를 자동으로 생성해주는 어노테이션입니다.

@Getter
@ToString
public class User {
    private String name;
    private int age;
}

위 코드에서 User 객체의 toString()을 호출하면 다음과 같은 문자열을 자동으로 출력합니다:

User(name=철수, age=30)

 


❓ 그런데 상속받은 클래스라면?

public class BaseEntity {
    private LocalDateTime createdAt;
}

@Getter
@ToString
public class Member extends BaseEntity {
    private String name;
}

이 경우 Member의 toString() 결과는 다음과 같습니다:

 
Member(name=철수)

⚠️ 부모 클래스인 BaseEntity의 createdAt 필드는 출력되지 않습니다!


🧩 해결 방법: @ToString(callSuper = true)

@Getter
@ToString(callSuper = true)
public class Member extends BaseEntity {
    private String name;
}

이렇게 하면 toString() 결과에 부모 클래스의 필드까지 포함됩니다:

Member(super=BaseEntity(createdAt=2024-05-18T22:01:23.456), name=철수)

 

📌 언제 사용하면 좋을까?

상황 사용 여부
DTO나 로그 출력을 위해 전체 필드를 보고 싶을 때 ✅ 사용 권장
부모 클래스에도 중요한 값이 있고, 이를 확인해야 할 때 ✅ 사용
부모 클래스에 민감하거나 불필요한 값이 있을 때 ❌ 사용 주의 (민감 정보 노출 위험)
 

⚠️ 주의사항

  1. 상속 구조가 복잡할수록 출력이 길어질 수 있음
    → 지나치게 많은 정보가 노출될 수 있음
  2. 보안 이슈 주의
    → 부모 클래스에 비밀번호, 인증토큰 등 민감 정보가 포함되면 toString()으로 노출될 수 있음
  3. 무한 순환 참조에 주의
    → @ToString.Exclude를 활용해 순환 필드는 제외할 수 있음
@ToString.Exclude
private Member member; // 예: 양방향 참조
 

 

✅ 마무리 정리

항목 설명
어노테이션 @ToString(callSuper = true)
목적 부모 클래스의 필드도 toString()에 포함
주 사용처 상속 구조에서 로그 출력, 디버깅 시 전체 정보 확인
주의사항 민감 정보, 순환 참조, 출력 과다 가능성 고려 필요

@ToString(callSuper = true)는 단순히 로그 예쁘게 보이기 위한 기능이 아니라,
상속 구조에서 정보 누락 없이 객체 상태를 파악할 수 있게 도와주는 도구입니다.
단, 모든 정보를 노출하는 만큼 신중하게 사용하는 것이 좋습니다. 😊

 

 

+ Recent posts