🔍 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나 로그 출력을 위해 전체 필드를 보고 싶을 때 | ✅ 사용 권장 |
부모 클래스에도 중요한 값이 있고, 이를 확인해야 할 때 | ✅ 사용 |
부모 클래스에 민감하거나 불필요한 값이 있을 때 | ❌ 사용 주의 (민감 정보 노출 위험) |
⚠️ 주의사항
- 상속 구조가 복잡할수록 출력이 길어질 수 있음
→ 지나치게 많은 정보가 노출될 수 있음 - 보안 이슈 주의
→ 부모 클래스에 비밀번호, 인증토큰 등 민감 정보가 포함되면 toString()으로 노출될 수 있음 - 무한 순환 참조에 주의
→ @ToString.Exclude를 활용해 순환 필드는 제외할 수 있음
@ToString.Exclude
private Member member; // 예: 양방향 참조
✅ 마무리 정리
항목 | 설명 |
어노테이션 | @ToString(callSuper = true) |
목적 | 부모 클래스의 필드도 toString()에 포함 |
주 사용처 | 상속 구조에서 로그 출력, 디버깅 시 전체 정보 확인 |
주의사항 | 민감 정보, 순환 참조, 출력 과다 가능성 고려 필요 |
@ToString(callSuper = true)는 단순히 로그 예쁘게 보이기 위한 기능이 아니라,
상속 구조에서 정보 누락 없이 객체 상태를 파악할 수 있게 도와주는 도구입니다.
단, 모든 정보를 노출하는 만큼 신중하게 사용하는 것이 좋습니다. 😊
'백엔드 > Spring' 카테고리의 다른 글
Spring MVC의 Redirect와 Forward (0) | 2025.06.01 |
---|---|
@PostConstruct란? (0) | 2025.04.30 |
@RequestBody, @ResponseBody vs HttpEntity(RequestEntity, ResponseEntity) (0) | 2025.04.11 |
StreamUtils.copyToString() - InputStream을 String으로 쉽게 변환하는 방법 (0) | 2025.04.07 |
Spring MVC에서 HTTP 응답을 반환하는 두 가지 방식 (0) | 2025.04.03 |