꾸양!
일단 시작.
꾸양!
💁‍♀️ 깃허브 링크
전체 방문자
오늘
어제
  • 분류 전체보기 (112)
    • STUDY (85)
      • JAVA (36)
      • Algorithm (1)
      • SpringBoot (9)
      • SQL (4)
      • GIT (16)
      • Front (1)
      • JPA (9)
      • Trouble Shooting (9)
    • SPARTA Project (26)
      • WIL (14)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • intellij
  • 인프런
  • 코드효율성
  • 숫자짝꿍
  • Repository
  • 잔디돌려줘
  • 트러블슈팅
  • 랠릿
  • 인프콘2024
  • 클린코드
  • 프로그래머스

최근 댓글

최근 글

hELLO · Designed By 정상우.
꾸양!

일단 시작.

STUDY/JAVA

[TIL] printStackTrace()는 왜 아래에 찍힐까?

2023. 6. 14. 08:24
<< 목차 >>
printStackTrace()는 왜 아래에 찍힐까?
printStackTrace()의 구현은 어떻게 되어 있을까?
err 출력 스트림?
printStackTrace()의 취약점

printStackTrace()는 왜 아래에 찍힐까

< 자바의 정석 > 예제 8-5를 배우고 있었다. 코드는 다음과 같았다.

public class Ex8_5 {
    public static void main( String[] args ) {
        System.out.println( 1 );
        System.out.println( 2 );
        try {
            System.out.println( 3 );
            System.out.println( 0 / 0 );
            System.out.println( 4 );
        } catch ( ArithmeticException ae ) {
            ae.printStackTrace();
            // 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력.
            System.out.println( "예외메시지 : " + ae.getMessage() );
        }

        System.out.println( 6 );
    }
}

이렇게 코드를 입력하고 자바 파일을 실행했을 때, 예상되는 출력은

1
2
3	// try
ae.printStackTrace() 내용. ~~때문에 오류 났어!
예외메시지 : ~~~
6

이것이었다. 나도 이렇게 생각했고 책에서도 이렇게 나왔다. 그런데 실제로 출력을 해보면

1
2
3
예외메시지 : / by zero
6
java.lang.ArithmeticException: / by zero
	at StandardOfJava.ExceptionStudy.Ex8_5.main(Ex8_5.java:10)

이렇게 출력이 된다.

왜 printStackTrace()는 순서를 무시하고 가장 하단에 출력되었을까?

튜터님께 여쭤보니 printStackTrace()는 err 출력 스트림을 사용하여 다른 출력 스트림을 사용하기 때문에 다른 시점에 나올 수 있다고 하셨다.


printStackTrace()의 구현은 어떻게 되어 있을까?

printStackTrace(PrintStream s), printStackTrace(PrintStreamOrWriter s) 까지 보기에는 아직 내 지식이 얕아 자세하게까지는 보지 못했다. 하지만 일단 이걸로 알게 된 것은 printStackTrace()는 err 출력 스트림을 사용한다는 것!


err 출력 스트림?

오픈 소스를 통해 공부를 해보려 했으나 너무 복잡하여 실패하였다.. 좀 더 자바에 익숙해지면 그 때 다시 한 번 파보기로 하고, 이번엔 <자바의 정석> 책과 다른 티스토리를 참고하여 공부하였다.

자바에서는 표준 입출력(standard I/O)을 위해 3가지 입출력 스트림, System.in, System.out, System.err 을 제공하는데, 이들은 자바 어플리케이션의 실행과 동시에 사용할 수 있게 자동적으로 생성되기 때문에 개발자가 별도로 스트림을 생성하는 코드를 작성하지 않고도 사용이 가능하다.
...
System 클래스의 소스에서 알 수 있듯이 in, out, err은 System 클래스에 선언된 클래스변수(static 변수)이다.선언부분만을 봐서는 out, err, in의 타입은 inputStream과 PrintStream이지만 실제로는 버퍼를 이용하는 BufferedInputStream과 BufferedOutputStream의 인스턴스를 사용한다.

여기서 알 수 있는 것은 err 출력 스트림과, out 출력 스트림은 버퍼를 이용하는 표준 출력 스트림이라는 것.

 

[Java] 자바 System.out과 System.err의 차이

자바의 System.out 과 System.err 의 차이에 대해서 알아보자. 사실 별 차이가 없는 줄 알았는데 생각보다 흥미로운 차이가 있어서 정리하게 되었다. out과 err는 다른 타이밍에 flush를 한다는 것이 차이

spongeb0b.tistory.com

이 블로그에서는 out 스트림과 err 스트림에 대한 차이를 설명해 주고 있다. 내가 필요한 핵심은 out과 err는 다른 타이밍에 flush를 한다는 것이다. 이것만으로도 약간 모호해서 OKKY에 질문을 올렸다.

 

OKKY - [Java] printStackTrace() 를 하면 가장 아래에 출력이 되는 이유가 무엇일까요..?

try { System.out.println( 3 );System.out.println( 0 / 0 );System.out.println( 4 );} catch ( ArithmeticException ae ) { ae.printStackTrace(); System.out.println( "예외메시지 : " + ae.getMessage(

okky.kr

많은 답변을 받았는데 사용하는 JDK에 따라, 에러 상황에 따라, 프로세스에서 받아온 Input/OutputStream을 어떻게 사용하느냐에 따라 출력이 다르게 나올 수 있다는 것 같다.


printStackTrace()의 취약점

튜터님께서는 답변을 해주신 다음에 printStackTrace()는 현업에서 보안상의 이유로 잘 쓰지 않고, 로컬로 확인할 때만 쓰고 서비스 배포까지는 올리지 않는다고 하셨다.

튜터님이 첨부해주신 블로그 링크를 확인해보자.

 

Throwable.printStackTrace()를 사용하면 안되는 이유

사다리 게임 미션 진행 중 입력에 대한 예외처리를 해주기 위해 다음과 같이 코드를 작성했다.리뷰어님께서 "printStackTrace() 는 사용하지 않는 것이 권장됩니다. 왜 그럴까요?" 리뷰를 남겨주셔서

velog.io

printStackTrace()의 코드 구조와 안 되는 이유에 대해 상세하게 설명해 놓으셨다.. 사실 이 글을 거의 이해하지 못했다..! ㅠㅠ 아직은 내가 이해하지 못하는 말이 너무 많았다. 일단은 나중의 공부를 위해 기록해놓는다.. ㅠㅠ

저작자표시 (새창열림)

'STUDY > JAVA' 카테고리의 다른 글

[TIL] ConcurrentModificationException  (0) 2023.06.20
[TIL] < 자바의 정석 > 예제 HighLow - 예외처리해보기  (0) 2023.06.15
[TIL] Getter와 Setter. 왜 쓸까?  (1) 2023.06.12
[TIL] 프로그래머스 - 최댓값과 최솟값 ( 느려지게 하는 범인 찾기 )  (0) 2023.06.11
[TIL] I/O Study - ByteArrayInputStream 예제 01  (0) 2023.06.08
    'STUDY/JAVA' 카테고리의 다른 글
    • [TIL] ConcurrentModificationException
    • [TIL] < 자바의 정석 > 예제 HighLow - 예외처리해보기
    • [TIL] Getter와 Setter. 왜 쓸까?
    • [TIL] 프로그래머스 - 최댓값과 최솟값 ( 느려지게 하는 범인 찾기 )
    꾸양!
    꾸양!
    차근차근 한 발자국씩.

    티스토리툴바