https://extsdd.tistory.com/113
자 저번시간까지 우리가 만든 마리아 DB를 내 스프링 프로젝트와 연동했고, 테스트로 데이터도 넣고, 컨트롤러에서 select까지 해보면서 포스팅을 마쳤다.
오늘 알아볼껀 실제로 어떻게 데이터가 오고가는지 간단하게 디버깅을 해보려고한다. 혹시 아직 디버깅이 뭔지 모르는 분들은 아래 포스팅을 보고오면 될 것 같다. 거기에 간단하게 BreakPoint를 설정하고 진행하는 방법이 있으니 이 포스팅에선 굳이 또 한번 더 설명하진 않겠다.
https://extsdd.tistory.com/102
1. 중단점(BreakPoint) 설정
자 우리 컨트롤러에 저 26번 줄에 커서를 대고 Ctrl+Shift+B 단축키를 눌러 중단점을 걸어주자
2. 서버 Debug 모드로 실행
자 우리가 디버깅을 하려면, 서버도 Debug모드로 켜져있어야 들여다 볼 수 있다. 디버그 모드로 실행하기 위해 서버를 클릭하고 Run(재생버튼)이 아닌 옆에 벌레모양의 Debug 버튼을 눌러서 실행해주자!
3. URL 요청
자 이제 우리가 만든 요청을 어떻게 처리하는지 보기위해 아래 링크를 요청해보자
http://localhost:8080/reqUrl.do?reqParam=3
reqUrl.do에 reqParam에 3이라는 값을 담아서 요청했다 엔터를 누르는 순간
하단에 이클립스가 주황색으로 변하면서 보라고!! 몸부림 친다. 이클립스를 눌러보자.
26번째 줄이 초록색으로 변해있다. 지금 이 서버가 저 요청을 처리하기위해 저 26번째 줄에 멈춰있다는 것이다. 여기서 F8을 누르면 그냥 진행이 되고, F6을 누르면 한줄씩 진행이 되고, F5를 누르면 저 함수 내부로 들어가게 된다. 일단 우리가 확인할 것부터 확인하자.
자 우리가 reqUrl.do를 처리할때 1번 박스를 보면 들어오는 데이터를 FwdVO객체에 맵핑해서 가져오는 걸로 되어있다. 그럼 저 26번째줄이 실행되기 직전 값이 제대로 들어왔는지 볼까?
우측 Variable탭의 2번 박스를 보면 현재 searchVO라는 객체에 어떤 값들이 할당되어있는지 보인다. 펼쳐서 보면 reqParam에 3이라는 값을 정상적으로 mapping 해서 가져온걸 볼 수 있다. 이건 ,http://localhost:8080/reqUrl.do?reqParam=3이걸 실행할 때 reqParam=3 이란걸 보고 FwdVO안에 있는 reqParam이라는 변수와 이름을 매칭시켜 가지고 온것이다.
3번 박스를 보면 자바에서 정상적으로 해당 요청값을 받아온 것을 볼 수 있다. 일단 우리가 여기까지 정리할껀, 현재 searchVO에 reqParam이 3의 값으로 요청이 들어왔단거다.
자 그럼 다시 중단점이 걸린 26번째 줄을 다시보면 저기 selectTargetUrl()함수가실행되는데 보면 함수안에 저 searchVO 객체를 넣어주는 것을 볼 수 있다. 즉 아까 위에서 봤던 reqParam이 3으로 셋팅된 searchVO객체를 쿼리돌리는 함수에 변수로 넣어준다는 거다.
더 구체적으로 보면 1번 번박스에 쿼리를 요청하면서 searchVO라는 객체를 input으로 같이 넣어주는데 그 객체를 살펴보면 2번을 보자, 지금 searchVO에 들어가 있는 값들인데 3번을 보면 객체 타입이 FwdVO로 되어있고 , 해당 쿼리문이 Mapping 되어있는 fwdSql.xml에서 해당 쿼리를 보면 3번 박스처럼 파라미터 형이 FwdVO로 같은 것을 볼 수 있다. 그럼 저 쿼리가 실행될때 자동으로 들어오는 변수들을 FwdVO의 형태로 받아들인 다는 것이다.
자 그럼 이 쿼리가 FwdVO의 형태로 Input이 들어오고 4번 박스를 보면 FwdVO에있는 reqParam이라는 변수를 fwdSql.xml에서 동일하게 쓰는것을 알 수 있다. 이렇게 VO에서 불러온 변수를 쓰려면 #{변수명} 형태로 쓸 수 있게 된다. 현재 searchVO에 reqParam이 3으로 들어있으니 저 fwdSql.xml에 들어있는 쿼리문이 실행될때도 자동으로 mapping 된 값을 가져와 WHERE PM.SEQ_NO = 3으로 마이바티스가 처리할 것이다.
여기까지 알아봤으니 한번 F6을 눌러 저 26번째줄을 실행시켜보자.
자 26번째 줄을 실행하니 커서는 다음 코드인 28번째 줄로 이동했고, 좌측 Variable 탭을보면 방금 26번째 줄을 수행함으로써 변경된 데이터들이 최신화되었다. 한번보자.
1번 박스를 보면 아까 26번째 줄을 실행하면서 쿼리 조회한 결과가 resulstList라는 변수에 들어갔다. 그 resultsList라는 변수를 보기위해 Variable탭에 2번 박스를 눌러보자. 그럼 3번에 어떤 내용을 담고 있는지 나온다. 이 결과는 어디서 온걸까?
우리가 fwdSql.xml 에 쿼리를 작성해놨고 이 4번박스에 있는 쿼리가 실제로 실행된 것이다. #{reqParam}에는 VO에 들어있던 3이 들어갔을꺼고 실제로 DB에서 조회하는 쿼리는 5번과 같이 작성됐을 것이다. 이걸 HeidiSQL에서 실제로 돌려보면 6번과 같은 결과가 조회된다.
다시 3번으로 돌아가서, 아까 6번에서 조회된 DB데이터들을 온전히 불러온 것을 알 수 있다. 결론적으로 지금 1번 박스에있는 resultsList 변수에는 6번 박스에있는 SQL 조회 결과가 들어있는 것이다. 이제 이걸 어떻게 처리할까? 28번째줄도 마저 실행하기위해 F6을 눌러보자!
커서는 다음 코드인 30번줄로 이동했고, 다시 데이터들이 최신화 됐다. 자 1번 구문을 통해서 resultsList에서 get(0)을 통해 가장 첫번째 데이터를 가져왔고 그 안에 들어있는 값들은 아까 우리가본 2번 박스다. 저기보면 key=value형태로 되어있는데 1번박스의 .get("urlStr")을보면 저 객체에서 저 urlStr칼럼을 가져오겠다는 뜻이다.
그럼 저 3번 박스에 있는 Key에 해당하는 Value인 www.google.com을 가지고 오게 되는것이고 이 데이터가 1번 박스에 (String)형으로 형변환뒤 URL이라는 변수에 담기는 것이다. 4번박스를 보면 URL이라는 변수에 정상적으로 DB에서 조회한 www.google.com이 담긴 것을 볼 수 있다. 이제 마저 30번째줄인 return구문이후로 쭉 수행시키도록하기위해 F8 버튼을 눌러주자.
보면 아까 했던 요청이 google 페이지를 열어준 것을 알 수 있다. redirect로 return했기 때문이다.
앞으로도 이런식으로 값이 변하는 과정을 보면서 코딩을 하면 보다 쉽게, 보다 이해하기 쉽게 만들 수 있을 것이다.
#스프링#전자정부프레임워크 #이클립스 #마리아DB #데이터조회 #Select #디버깅 #방법 #Debug