CallToPrintStackTrace 속성과 @SuppressWarnings 처리하기

Sundae·2023년 11월 18일

@SuppressWarnings


printStackTrace를 사용하다가 경고 메시지가 나타났다. 찾아보니 코드가 특정 경고 유형에 해당하면 메시지를 띄운다고한다.

경고 메시지를 없애려면 경고를 억제하는 애너테이션 @SuppressWarnings을 추가해줘야한다.

@SuppressWarnings 애너테이션은 컴파일러 경고를 무시하기 위해 사용되며, 각 경고 유형에 대응하는 속성을 지정해야한다. 주요 @SuppressWarnings 속성들은 다음과 같다.

  1. unchecked: 제네릭에서 발생하는 "unchecked" 경고를 억제한다.
  2. rawtypes: 원시 타입(raw type) 사용으로 인한 "rawtypes" 경고를 억제한다. 제네릭을 사용하지 않고 타입을 명시하지 않은 경우 발생한다.
  3. deprecation: 사용되지 않거나 더 이상 권장되지 않는 API를 사용할 때 발생하는 "deprecation" 경고를 억제한다.
  4. serial: 직렬화(serialization)와 관련된 경고를 억제한다.
  5. unused: 사용되지 않은 지역 변수, 매개변수, 필드 등에 대한 "unused" 경고를 억제한다.
  6. all: 모든 종류의 경고를 억제한다.

CallToPrintStackTrace 속성?

본인의 경우에는 printStackTrace를 사용하다가 경고 메시지가 떴다. 인텔리제이에서 지원하는 수정 도우미(Alt+Enter)를 사용하였는데@SuppressWarnings("CallToPrintStackTrace") 애너테이션이 추가됐다. 위에서 작성한 경고 속성에 나와있지 않은 속성이라 구글링해보았다.

결론은 IntelliJ CallToPrintStackTrace 속성은 IntelliJ IDEA에서 정의한 속성이라고 한다. 왜 인텔리제이는 스택 트레이스를 사용하는 것에 경고를 날릴까?

그 이유는 다음과 같다. 스택 트레이스는 버그를 디버깅하거나 예외 처리를 분석하는 데 유용하지만, 비즈니스 코드에서는 보안 및 로깅에서 주의가 필요하다.

  • 보안 문제
    스택 트레이스에는 프로그램이 동작하는 동안의 호출 경로와 관련된 정보가 포함되어 있다. 이 정보를 외부에 노출하는 것은 보안상의 위험을 초래할 수 있다.

  • 불필요한 정보 노출
    비즈니스 환경에서는 사용자에게 불필요한 기술적인 세부 사항을 노출시키는 것을 지양해야 한다. 스택 트레이스는 주로 개발자를 위한 디버깅 도구로 사용되며, 일반 사용자에게는 이 정보가 필요하지 않다.

  • 로그 용량 증가
    스택 트레이스는 긴 에러 메시지를 생성하므로 로그 파일의 크기를 증가시킨다. 많은 양의 스택 트레이스가 로그에 기록되면 로그 파일의 관리 및 분석이 어려워질 수 있다.

  • 가독성 및 유지보수
    스택 트레이스는 개발자에게 유용한 정보일 수 있지만, 사용자 또는 운영 팀에게는 이해하기 어려울 수 있다. 또한, 코드의 성능에 불필요한 부하를 일으킬 수 있다.

대신에, SLF4J, Logback, Log4j와 같은 로깅 프레임워크를 사용하여 적절한 로깅 수준과 메시지로 정보를 기록하는 것이 권장된다. 로깅 레벨을 설정하여 필요한 정보만을 기록하고, 비즈니스 환경에서는 민감한 정보를 최소화하여 보안을 유지하는 것이 중요하다.

나가는 글


평소 에러가 발생 시 어느 곳에서 어떤 에러가 발생했는지 알려주는 printStackTrace를 별 생각없이 사용해왔었다. 하지만 인텔리제이가 알려주는 경고에 대해서 찾아보자 printStackTrace의 문제점에 대해서 상세히 알게되었다. 또한, @SuppressWarnings 어노테이션과 어노테이션에서 사용하는 속성에 대해서 알게되었다.

비즈니스 환경에서 printStackTrace를 지양하고 로깅 프레임워크에 대해 공부하고 적용시켜봐야겠다.

profile
성장 기록 / 글에 오류가 있다면 댓글 부탁드립니다.

0개의 댓글