본문 바로가기
Web/Spring

구조와 로그, Debugging의 이야기

by upswp 2021. 2. 25.

구조

  • jmeter - 성능 관련된 분석

로그

  • 기본적으로 구조에 있어서 분석하는 내용들은 콘솔의 로그를 참고하면된다.

  • 기본 설정은 INFO - Info, warning , fatal 부분만 나오게됨.

  • 기본 설정 수정은 log 설정파일에가서 로깅하는 옵션을 INFO level이 아니라 다른 레벨로 변경

  • image
  • 순서
    • http://localhost:8080/owners/find를 방문했다고 가정했을때

      1. spring에 있는 DispatcherServlet 으로 방문
      2. o.s.web.servlet.DispatcherServlet : GET "/owners/find", parameters={}
        1. DispatcherServlet이 Controller에 있는 owners의 find를 호출한다.
          1. 여기서 @GetMapping Annotation을 보고 get방식이 작동한다.
      3. image
      4. ownners의 new라고 가정할때 Owner 객체를 생성한다.
      5. 이후 생성된 owner를 model이라는 객체에 넣어준다.
      6. 이후 VIEWS_OWNER_CREATE_OR_UPDATE_FORM를 리턴한다.
      7. image
      8. 미리 생성되있던 String 값을 따라 움직인다.
        1. resources > owners > createOrUpdateOwnerFrom.html을 호출하여 보여준다.
    • http://localhost:8080/owners/new 에서 POST 요청으로 값이 발생한다 했을떄

      1. createOrUpdateOwnerForm.html 에서 <form>tag의 method="post"를 확인하고 POST 방식으로 값을 전달해준다.

        image

        이후 저장된 방식들이 버튼을 클릭하며 submit type으로 값을 전달해준다.

        image
      2. image

        에서 보면 OwnerController에 processCreationForm로 이동한다.

      3. image

        여기서 미리 설정된 OwnerRepository owners를 이용하여

        image

        owners에 값을 받아온 owner를 저장한다.

      4. 이후 owner의 ID값을 포함하여

        image

        redirect를 이용하여 url에서 보면

        http://localhost:8080/owners/11

        owners/11 의 11이 getID를 의미하며 그 값을 포함하여 return 시킨다.

      5. 이후 owners의 getID를 포함하여 Mapping을 받는 메서드로 이동한다.

        imageimage
      6. owners/ownerDetails경로의 ModelAndView를 생성한다.

      7. OwnerRepository owners 에서 findById를 이용하여 ownerId를 가져와서 ModelAndView에 넣어준다.

      8. 이후 mav를 리턴시킨다.

      9. 리턴된 mav값을 따라가보면
        resources > owners > ownerDetails.html을 보여준다.

  • 디버그
    1. 디버깅 할 위치를 클릭하여 break point를 설정한다.
    2. IntelliJ를 기준으로 아래와 같은 Variables를 확인하면 현재 멈춰있는 break point의 내용을 확인할 수 있다.
      image
    3. F8을 이용하여 다음 줄로 이동이 가능하다.
      F7을 이용하여 관련 객체 안으로나 메서드 안으로 이동이 가능한다.
    4. image
      위와 같이 break point를 확인하면 우측 마우스 클릭을 했을때 조건을 줄 수 있다. 위의 Condition에 특정 조건이 성립할때 의 내용을 설정해준다
      ex ) productId == 2L
      이와 같이 설정해준 다음에 해당 조건에 있어서 성립할때 해당 break point가 발생한다.

디버깅 버튼

위 내용을 통해 break를 걸게 되면, 아래처럼 여러 버튼을 사용할 수 있다.

디버깅버튼

(break가 된 상태에서만 사용 가능하다)

resume

  • 단축키 : option+command+r
  • 기능 : 다음 break point로 이동

step over1

첫번째 break point에서

resume2

다음 break point로 이동한다.

이클립스의 resume(F8)과 동일한 기능이다.

step 버튼들은 왼쪽에서 오른쪽 순으로 하겠다.

step over

  • 단축키 : F8
  • 기능 : 현재 break 된 파일에서 다음 라인 이동

step over1

break 걸린 라인을 전부 실행 후, 다음라인으로 이동한다.

step over2

이 기능을 몰라서 라인 하나하나에 전부 break를 걸었다면, F8을 사용하자.

step into

  • 단축키 : F7
  • 기능 : 현재 break 된 라인에서 실행하고 있는 라인으로 이동한다.

step into1

break 걸린 라인에서 다음 실행될 코드는 PurchaseOrder.createOrder다.
이때 F7을 누르면

step into2

이렇게 createOrder로 이동한다.

Force step into

  • 단축키 : option+shift+F7
  • 기능 : 다음 실행되는 라인으로 이동하나, step into와 달리 Stepping을 무시하고 진행한다.

예를 들어, command+shift+a -> stepping으로 설정창을 오픈후,

step 설정

아래처럼 skip simple getters를 체크 하자.

step 설정2

이렇게 한 뒤, getter 메소드를 호출하는 곳에 break point를 지정한 후,

force step into

번갈아가며 step into와 force step into를 입력해보자.

step into(F7)

force2

이렇게 메소드 invoke 영역으로 바로 이동한다.

반면에

force step into(option+shift+F7)

force3

설정과 무관하게 getter 메소드까지 이동한다.
굳이 확인이 불필요한 getter, 생성자 등에 skip 옵션을 설정한 뒤, skip이 필요할때는 step into로, 전부 확인이 필요하다면 force step into로 이동하면서 디버깅 하면 된다.

Step out

  • 단축키 : shift+F8
  • 기능 : 현재 break 된 라인에서 호출한 곳으로 이동한다.

step over1

step into 로 createOrder 메소드로 이동 후,

step into2

step out의 단축키인 shift+F8을 입력하면,

step out3

메소드를 빠져나오게 된다.

보통은 step into로 파고들어간 라인을 빠져나오려할때 많이 사용한다.

Drop Frame

  • 단축키 : 없음
  • 기능 : call stack을 거슬러 올라간다.

이것만 보면 step out과 별차이 없어 보이는데, 큰 차이점은 step out은 해당 라인이 실행된 후 돌아가지만, drop frame은 해당 라인이 실행되기 전에 돌아간다.

Run to Cursor

  • 단축키 : option+F9
  • 기능 : 포커스 되어있는 라인으로 이동

step over1

위 처럼 break된 상태에서 다음에 실행될 코드 중, ApplicationTestsassert에 포커스를 두고,

cursor2

(51라인에 포커스를 두었다.)

여기서 option+F9를 누르면

cursor3

이렇게 포커스가 지정된 51라인으로 break가 이동한다.

보통 break point로 지정하지 않고, 단발성으로 break를 걸고 싶을때 사용한다.

참고

백기선 개발자님의 예제로 배우는 스프링 프레임워크 입문

기억보단 기록을 - IntelliJ 디버깅해보기