Frudy
3k
2019-07-02 08:24:09 작성 2019-07-02 09:07:10 수정됨
12
2930

신입 개발자가 혼자 공부하는 방법 - 스택트레이스로 디버깅하기


비전공자였던 자바개발자가, 혼자 시행착오 겪으며 만든 방법이에요.

웹개발자가 요새 인기가 많죠? 처음 시작하시는 분들에게 도움이 되었으면 좋겠어요.


제일 중요한 세 가지는,

디버깅, 원본소스 보기, 구글링 이였어요.


1. 궁금한 것을 질문하지 않고 혼자 해결할 수 있는 능력

2. 버그를 질문하지 않고 혼자 해결할 수 있는 능력


이 두가지가 부족하면, 결국 질문을 올려야 하거든요.

저도.. 처음엔 혼자 해결못해서 지식인에 질문 700개씩 올리고 했었어요...


또한, 질문은 생각보다 비용이 높아요.


1. 남들이 이해할 수 있도록 질문글을 작성하는데 시간 오래걸리구요,

2. 답변이 달릴때마다 하던 공부를 멈추고 확인하고 또.. 댓글을 달아야 해요.


즉 영양가없는 질문을 올리면, 질문자와 답변자 모두에게 좋지못해요.


서론은 여기까지에요. 목차는 다음과 같아요.


1. 디버깅

(1) 스택트레이스 읽기

(2) 예외클래스 확인하기

(3) 예외가 발생한 메소드 확인하기

(4) Jsp 디버깅 꿀팁


2. 원보소스 살펴보기

(1) 개발하는 언어의 원본 소스 사이트 알아두기

(2) 디컴파일해서 살펴보기


3. 구글링 팁

(1) 모르는 것을 영어문장으로 바꿔보기.

(2) 검색은 공식 사이트부터.

(3) 부작용을 조심하기.


ㅡㅡㅡㅡㅡ


글이 길어져서.... 일부만 적고, 다음글은

https://okky.kr/article/597508

url로 대체할게요.



자바의 장점은, 스택트레이스로 버그를 찾기쉽게 해줬다는 거라고 생각해요.

그래서, 스택트레이스를 잘 읽을 수 있으면, 혼자 버그를 질문없이 해결할 수 있어요.


 

path가, 만약 이렇게 된다면



package pac1.pac2;

public class StackTraceTest 
{
	public static void main(String[] args) 
	{
		one();
	}
	
	public static void one()
	{
		two();
	}

	public static void two()
	{
		three();
	}
	
	public static void three()
	{
		Integer.parseInt("abcde");
	}
}


이렇게 스택트레이스가 찍혀요.

Exception in thread "쓰레드이름" 예외클래스경로.예외클래스이름: 예외 메시지

    at 예외발생한클래스경로.클래스이름.메소드이름(클래스이름:예외발생한라인번호)


이렇게 구성되어있는데, 하나씩 살펴보면 다 이해가 되실거에요.


또한, 잘 살펴보시면

at ... three()

at ... two()

at ...one()

at ...main() 이라고 되어있죠?

이것은 메소드를 호출한 순서에 따라 스택트레이스가 찍힌다는 뜻이에요.


main()에서 one()호출하고

one()에서 two()호출하고

two()에서 three()를 호출하니까요.


일단 저는 아래와같은 순서로 디버깅을 합니다.

Exception in thread "main" java.lang.NumberFormatException: For input string: "abcde"

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at pac1.pac2.StackTraceTest.three(StackTraceTest.java:22)

at pac1.pac2.StackTraceTest.two(StackTraceTest.java:17)

at pac1.pac2.StackTraceTest.one(StackTraceTest.java:12)

at pac1.pac2.StackTraceTest.main(StackTraceTest.java:7)


읽는 순서는, 노란색 --> 주황색 순서로 읽어요.


노란색)

예외메시지 --> 예외클래스 순서로 읽어요.

스택트레이스에서 제일중요한건 예외메시지라고 생각하니까요.




왜냐하면, 다른사람이 클래스 만들 때 예외를 쉽게 찾을 수 있도록

예외메시지에 최대한 에러상황을 설명해줄때가 많기 때문이에요.


그래서, 예외메시지만 보고도 해결이 되버려서

이후 남아있는 디버깅과정을 스킵하는 경우도 잦아요.


>>

Exception in thread "main" java.lang.NumberFormatException: For input string: "abcde"

였죠?


익숙하신 분들은 아.. parseInt("string")나 parseDouble("strubg")같은 메소드를 사용했는데

문자열에 숫자가 아닌 문자가 들어가서 발생했구나.. 를 바로 캐치하셔서 바로 해결하실거에요.


하지만 이 에러를 처음겪는 분이라면 이게 뭔소린지 모르기 때문에,

다음 과정을 거치셔야해요.


예외메시지 --> 예외클래스

java.lang.NumberFormatException << 이게 무슨 클래스인지를 이제 찾아봐야해요.

어떤 경우에 이 예외가 발생하는지를요.


아까 NoMoneyException을 제가 정의할 때 처럼,

개발자가 예외클래스를 만드는 이유가 다 있기 때문이에요.




패키지가 java.lang이죠? 이건 자바에서 기본적으로 제공되는 패키지라서,

본인이 사용하는 jdk버전을 붙여서 검색하시면 되요.


java 8 NumberFormatException 이렇게요.



그럼 이렇게 이 예외는 어떤상황에서 발생하는지가 나와요.

 
구글번역기 돌리면,

응용 프로그램에서 문자열을 숫자 형식 중 하나로 변환하려고 시도했지만 문자열에 적절한 형식이없는 것을 나타 내기 위해 throw됩니다.

라고 하네요.


음~ 문장이 좀 어색하긴해도 이 예외는 문자열을 숫자로 변환하려다 문제가 생기면 반환하나봐요.


Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [abcde];

만약 java에서 기본적으로 제공되는게 아닌,

다른 라이브러리를 사용하다 이런 에러가 발생했다면,


해당 라이브러리의 버전을 붙여서 검색하시면 되요.

위의경우 저는 spring 5.1.7 BeanDefinitionStoreException이라고 검색해서

공식문서를 찾을 수 있었어요.



아무튼... 그다음에 체크해야하는건 

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at pac1.pac2.StackTraceTest.three(StackTraceTest.java:22)

at pac1.pac2.StackTraceTest.two(StackTraceTest.java:17)

at pac1.pac2.StackTraceTest.one(StackTraceTest.java:12)

at pac1.pac2.StackTraceTest.main(StackTraceTest.java:7)


이거에요.


메소드가 호출된 과정이 전부 적혀있는데, 맨 왼쪽에

해당 메소드의 클래스의 경로가 모두 적혀있기 때문에,


2가지를 구분하셔야해요.


1. 남이 만든 클래스인지

2. 제가 만든 클래스인지요.


Integer 이런 클래스는 똑똑한 사람이 만들었기 때문에,

당연히 버그가 있다면 제가 만든 클래스에서 발생했다고 추측하는게 옳기 때문에,


제가 만든 클래스에서 가장 마지막에 명시된 예외라인이 어디인지를 찾는게 합당해요.


그러므로..

at java.lang.NumberFormatException.forInputString(Unknown Source)

패키지가 java로 시작하네요?


제가 만든 패키지는 아까 pac1 이런거였으니까, 이런건 더이상 안읽어도 되요.


at pac1.pac2.StackTraceTest.three(StackTraceTest.java:22)

at pac1.pac2.StackTraceTest.two(StackTraceTest.java:17)

at pac1.pac2.StackTraceTest.one(StackTraceTest.java:12)

at pac1.pac2.StackTraceTest.main(StackTraceTest.java:7)


제가 만든 패키지중, 가장 위에꺼를 보시면 되요.

가장 위에꺼가 가장 나중에 호출된거니까요.

그리고 해당 코드를 가면


Integer.parseInt("abcde");

이 라인이 있어요. 여기서 예외가 발생했어요.


이 메소드를 아는사람은 여기서 버그를 해결했을 거에요.


아니라면, 여기서 Integer클래스의 parseInt()가 무슨메소드인지 찾아볼수도 있어야해요.


java 8 Integer로 검색해서,

이 메소드가 무슨 기능을 하는지, 언제 예외를 throw하는지까지 알 수 있어요.

(저처럼 영어못하시면 번역기 돌리시면되요)


이렇게 디버깅하시는게 쌓이시면,


1. 사용하시는 메소드를 좀더 정확하게 사용하여 예외를 예방 or 처리할 수 있게 되구요,

2. 동일한 or 비슷한 예외메시지가 발생하면 예외 메시지만 읽고도 디버깅이 가능해져요.


이렇게 안하고 스택트레이스만 복사붙여넣기 해서 질문글을 올리면,

똑같은 예외를 다음에 만나도 또 질문을 올릴수밖에 없게되요.


https://okky.kr/article/338405

이 글도 추천해드릴게요.

21
14
  • 댓글 12

  • 재현아빠
    1k
    2019-07-02 08:40:33

    오오오..정성글에는 무조건 추천을!!

    0
  • 재현아빠
    1k
    2019-07-02 08:41:37

    정성글에 추천하고 보니 저기 밑에 또다른 정성글을 쓰신 분이랑 같은 분이시군요. 참 열심히 활동하시네요..대단하십니다.

    0
  • Frudy
    3k
    2019-07-02 08:47:00

    재현아빠

    혹시 잘못된내용은 없을까요?


    아...그리구...

    저도 비전공자로 시작했을 때 너무 헛수고를 많이해서...


    다른분들은 저처럼 헛수고를 안했으면 좋겠다는 마음에 이렇게 활동하고있습니다.

    취직도 됬으니까요! ㅎㅎㅎ


    그리고 여기사이트에서 저도 받은게 많아서

    제가 도움이 된다면 열심히 배풀고싶습니다.

    1
  • moonti
    2k
    2019-07-02 08:50:33

    다 읽지는 않았지만 tech 게시글로 가도 좋을 것같아요

    0
  • Frudy
    3k
    2019-07-02 08:57:10

    moonti

    잘못된 내용이 없어보이면 옮겨보겠습니다.

    의견 감사합니다.

    0
  • 재현아빠
    1k
    2019-07-02 09:50:25

    @Frudy 글쎄요. 자바가 제 전문이 아니라서..하지만 구글링 팁은 참 좋은 것 같은데요..

    0
  • Frudy
    3k
    2019-07-02 09:53:16

    재현아빠

    아하, 그래도 의견주신건 감사합니다.

    0
  • bzietro
    147
    2019-07-02 13:30:04
    신입 입장에서 좋은 내용 정말 잘 읽었습니다.
    0
  • linuxer
    1k
    2019-07-04 00:05:24 작성 2019-07-04 00:08:23 수정됨

    이 분은   글을 참 깔끔하게 정말 잘 정리하시네요

    소스도 깔끔 일목요연하게 하실분임이 100%


    이런  분이 책을  쓰신다면 그 책은 베스트셀러일  확률이 높을듯


    이런 타입의 분은 대부분 개발실력도 되게 좋던데요  ㄷㄷㄷ

    0
  • Frudy
    3k
    2019-07-04 06:51:44

    헉 과대평가이십니다.

    그래도 좋게봐주셔서 감사합니다 :)

    0
  • 옆집신입개발자
    136
    2019-07-04 10:12:15

    돈이없어서 사과를 살수없다니 ㅠㅠ

    좋은글 잘보고갑니다 

    0
  • 나봉꾸
    2
    2019-07-09 09:11:29

    좋은 내용 잘 읽었습니다!! 감사합니다 :)

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.