ݺߣ

ݺߣShare a Scribd company logo
제작자 : 안홍섭
팀 프로젝트 파일의 압축을 풀고 import 시킨다.
Import시 <errors running builder 'JavaScript
validator' on project (프로젝트 이름)>이와 같은 에러가
발생하는 경우 http://fillin.tistory.com/2 블로그를 참조해보자
Spring project 예제 분석
http://localhost:8500/project/main
예제를 이용해보려고 하자 처음 마주하는 오류이다.
연결+SQL 관련 오류라는 것을 확인할 수 있다.
DB설정을 바꿔주면 된다.
사용자 id, password, url 을 사용하는 DB에 맞게 설정해주면 된다.
(현재 진행중인 프로젝트를 기준으로 하면
Id = pizza ,password = java304 ,
url = url=jdbc:oracle:thin:@localhost:1521:xe
잘 만들어져 있다. (견본으로 삼기 딱 적당하다.)
1조의 설계 아이디어와 여러 가지로 일치하는 모습을 보인다.
정말 잘 구현 되어있다. 하지만 여기서 다음 문제가 발견된다.
함께 저장되어 있는 sql문을 이용해 table을 전부 등록하고
회원가입을 시도하니 다음과 같은 화면이 나온다.
NullPointerException 이 발생했는데 어디를 수정해야할지
구조파악이 잘 안된 상태에서는 판단하기가 어렵다.
해결방법은 제일 처음에 하나의 데이터는 미리 입력하는 것이었다.
오라클에서 직접 데이터를 넣었다.
참고로 쿼리문을 이용해 넣을 생각이었지만
이상하게 자꾸 틀린 value 값을 입력한다는 에러가 발생해서
행추가 기능을 사용해서 입력했다.
성공한 결과이다. 다만 한가지 결점이 있다.
회원 가입 페이지를 보면 주소 같은 값은 account 테이블이 아닌
Info 테이블에 저장된다. 두 테이블이 연동되어 있어서 그런듯하다.
하지만 지금 같은 방법으로는 처음 오라 클 에서 직접 입력했던 사용자
는
Info 테이블에 값이 존재하지 않게 된다. 따라서 정상적인 사용자로 이
용하기에는 부적합하다. 비정상적인 사용자는
차후 삭제 시키는 걸로 한다.
관리자 메뉴에는
권한을 부여하는
기능이 존재한다.
하지만 그 권한
을 부여할
최초의 관리자는
오라클에서 설정
해준다.
관리자로 로그인
하면 mypage가
Admin으로 바
뀐 것을 볼 수 있
다.
회원관리 메뉴
예약관리메뉴
현재는 입력된 데이터가 없다.
Q&A 게시판
보이는 바와 같이 아무것도 나오지 않는다.
심지어 에러도 뜨지 않는다.
Veiws/QABoardDetail.java
본래 출력되어야 할
화면의 JSP 소스인
듯하다.
즉 소스는 있지만
연결이 안되어있는
케이스
차근차근 쫓아가
보도록 하자.
화면 사이의 연결문제라고 하면
가장 의심되는 부분은
컨트롤러에 있는 맵핑이다.
맵핑마다 출력문구를 배치하여 client 의 Q&A게시판 화면 요청이
어느 맵핑을 타는지 추적한다. 확인 결과
Value = “/Qalist” 맵 루트를 탄다.
(나중에 알았지만 아래 화면처럼 URL만 확인하면 금방 알수 있다.)
Q&A 와 Board 코드의 비교이다.
Model.addAttribute () 부분은 GUI 제작 때 사용했던 기억이 난다.
표를 만들 때 위의 속성을 표시해주는 부분과 연관이 있다.
(현재 문제가 있는 부분이 이곳 근처이다.)
해당 맵핑의 시작하는 부분, 중간부분, 끝나는 부분에 검사용
출력 코맨트를 첨부 하여 문제가 발생하는 부분을 찾는다.
(결과 : test-QABoard-Alist-middle이 출력되지 않았다.
문제는 중간 부분에 있었다.)
중간 부분의 코딩이다. 추적을 위해 심어놓은 코맨트가 작동하지 않는 이유는
윗부분인 if 문 두 개중 하나 혹은 둘 다 작동하지 않기 때문이다.
Count와 endPage, pageCount를
모두 출력해봐서 if문의 조건과 비교해본다.
결과는 if(count > 0)  if(count >=0) 로
코딩을 수정함으로 문제는 해결됐다.
로그인 하지 않은 상태로
글쓰기를 시도하면
로그인 화면으로 이동한다.
보면 이름과 예약날짜는 텍스트 필드
방 번호는 select 박스로 되어있다.
(가격은 어차피 비활성화 되어있으므로 논외)
여기서 방 번호를 설정하면 이름과
예약날짜 방 번호가
모두 초기화되는 문제가 있었다.
URL을 보면 굉장히 수상한 부분이 발견된다.
방 번호를 203으로 선택해서 문제가 발생한 화면인데
조금 전 화면과 거의 같지만 URL 끝부분에
?roomNum=203 이라는 부분이 추가되어 있다.
브라우저에서 확인 가능한 소스와
이클립스에서 소스를 비교하던 중
문득 “사이트 에러나 소스 에러는 나지 않았지?”
라는 생각이 들었다.
그리고 URL이 바뀌는 것과 데이터가 초기화
되는 부분을 고려해보니
DB의 “아직 입력되지 않은 데이터를
불러오는 것은 아닐까?” 라는 생각이 들었다.
다음과 같이 초기값을 넣고 commit을 해보았다.
(commit 빼먹지 말자.)
방 번호를 로딩하자 가격과 방 이미지도 함께 나온다.
나머지 예약자 이름과 예약날짜만 입력해주면 된다.
(참고로 로그 인을 안하고 예약작업을 하려고 하면 500번 에러가 뜬다.
예외처리만 해주면 될 것 같다.)
(중간에 에러가 나서 시험을 위해 예약자 이름을
봉고로라는 이름으로 바꾸었다.)
보면 정상적으로 예약이 되었음을 확인할 수 있다.
이번 문제는 눈에 잘 띄지 않아서 방치하고 있던
회원가입 시 인 코딩 문제 되시겠다.
내용은 간단하다. 회원가입 시 입력한 글자가 깨지는 현상이 발생
DB에 저장된 데이터가 깨진이상 여기서 데이터를 가는가는
모든 화면에는 깨진 데이터가 보이게 된다.
JSP 내부에서의 인 코딩과 캐릭터 타입 셋팅
파일 속성을 조회하면 나오는 인 코딩설정
Web.xml에 있는 웹설정중 인 코딩필터
모조리 실패.
나중에는 소스를 고칠 때마다 에러 메시지가 뜨는
비참한 상황에 부딪히게 되었다.
(여기에는 결과 위주로 적지만 혹시나 4시간에 걸친
탐색과정이 어떤 논리로 진행됐는지 궁금하신 분은 개인적으로
연락바랍니다.)
문제 해결의 계기가 된 것은 게시판코딩이었다.
(등잔 밑이 어둡다라는 말이 현실이 되었다…)
게시판의 제목이나 글 내용은 DB에 한글로 잘만 입력되고 있었던것
양쪽 파트의 코딩을 비교하니 한글 깨짐의 원인은
get 방식과 post 방식의 차이라고 결론이 나왔다.
(수업시간에 몇 번 강조되었지만 이렇게 애먹일 줄은 몰랐다…)
구글에 검색어로 “spring get 한글 깨짐” 이라고 입력하니
금방 찾을 수 있었다. 초보 개발자들이 한번쯤은 걸리고 넘어가는
문제라고 한다.
하긴 코딩에 문제가 있는 게 아니라 서버 쪽 코딩을 수정해야 하니
경험이 없으면 쉽게 생각이 나지 않을 것이다…
DB에 정상적으로 입력된 모습이 보인다.
아직 테스트를 더 해야 하지만 게시판 등에서 실행했을 때는
작성자의 이름이 깨지지 않고 정상로딩 되는 것이 확인되었다.
문제의 화면이다. 여기서 덧 글 입력기능이 새로 발견된 문제이다.
처음 봤을 때는 당황해서 잘 안보였는데. 천천히 살펴보니
꽤 많은 단서가 보인다.
(그렇다기 보다는 대놓고 오류부분을 지적해주고 있다…
모르니까 눈에도 안 들어 오더구먼…)
여기서 다음화면으로 넘어가려고 하면 에러가 발생하는 거니까
지금 이 화면에 대한 JSP 파일부터 확인해보자.
덧글을 입력해서 submit 시켜주는 코딩을 발견했다.
Action 설정을 확인해서 이 다음 과정이
QACommentInsert 라는 것을 알수있다.
(JSP 파일목록에 보이지 않으면 분명히 컨트롤러 쪽에 있다)
QABoard 덧글이 문제 였으니 당연히 QABoardController를
확인한다. 내려가다 보면 익숙한 value 값이 눈에 들어온다.
위 화면에서는 System.out.println()을 여러 개 배치하여
어느 부분에서 에러가 나오는지 확인하였다.
위에서 출력한 값들의 결과이다.
보이는 대로 3번째 추적 구문이 출력되지 않았다.
그러므로 2번째와 3번째 추적 구문 사이에 있는
qaboarddao.QACommentInsert(qr);
여기서 문제가 발생했다는 것을 알 수 있다.
여기서 오류화면과 방금 전의 추적구문을 비교해보면
이상한 점이 발견된다.
SQL문에서 받아야 할 값을 다섯 개인데 보내주는 값은
네 개뿐이다.(오류메시지를 이해했다면
이 결론에 도달하는데 10초도 안 걸릴 것이다…참고로
필자는 단지 거북하다는 이유로
추적방식을 썼다가 1시간 걸렸다.)
여기까지 오면 해결은 간단하다.
문제가 되는 SQL문을 지워버리면 된다.
앞부분의 username과 뒷부분의 UserName 을 삭제하면
덧 글 기능이 정상작동하기 시작한다.

More Related Content

What's hot (20)

Golang 개발 환경(profile) 다르게 잡아주기
Golang 개발 환경(profile) 다르게 잡아주기Golang 개발 환경(profile) 다르게 잡아주기
Golang 개발 환경(profile) 다르게 잡아주기
라한사 아
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료
라한사 아
스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기
라한사 아
구글앱엔진+스프링+스프링dٲ貹+메이븐
구글앱엔진+스프링+스프링dٲ貹+메이븐구글앱엔진+스프링+스프링dٲ貹+메이븐
구글앱엔진+스프링+스프링dٲ貹+메이븐
라한사 아
spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼
라한사 아
동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO
라한사 아
스프링 오픈소스 정리
스프링 오픈소스 정리스프링 오픈소스 정리
스프링 오픈소스 정리
라한사 아
자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)
자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

DK Lee
Groovy 시작 입문
Groovy 시작 입문Groovy 시작 입문
Groovy 시작 입문
라한사 아
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
라한사 아
스프링 Generic autowired이용해보기
스프링 Generic autowired이용해보기스프링 Generic autowired이용해보기
스프링 Generic autowired이용해보기
라한사 아
신림프로그래머 스터디 웹팩 발표자료
신림프로그래머 스터디 웹팩 발표자료신림프로그래머 스터디 웹팩 발표자료
신림프로그래머 스터디 웹팩 발표자료
라한사 아
Django in Production
Django in ProductionDjango in Production
Django in Production
Hyun-woo Park
Gulp 입문
Gulp 입문 Gulp 입문
Gulp 입문
라한사 아
나의 jQuery 실력 향상기
나의 jQuery 실력 향상기나의 jQuery 실력 향상기
나의 jQuery 실력 향상기
정석 양
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
Kwangyoun Jung
jQuery 구조와 기능
jQuery 구조와 기능jQuery 구조와 기능
jQuery 구조와 기능
Kenu, GwangNam Heo
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
Kyoung Up Jung
Growing object oriented software guided by test
Growing object oriented software guided by testGrowing object oriented software guided by test
Growing object oriented software guided by test
라한사 아
뭔지 모르지만 발표
뭔지 모르지만 발표뭔지 모르지만 발표
뭔지 모르지만 발표
Kyoung Up Jung
Golang 개발 환경(profile) 다르게 잡아주기
Golang 개발 환경(profile) 다르게 잡아주기Golang 개발 환경(profile) 다르게 잡아주기
Golang 개발 환경(profile) 다르게 잡아주기
라한사 아
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료
라한사 아
스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기
라한사 아
구글앱엔진+스프링+스프링dٲ貹+메이븐
구글앱엔진+스프링+스프링dٲ貹+메이븐구글앱엔진+스프링+스프링dٲ貹+메이븐
구글앱엔진+스프링+스프링dٲ貹+메이븐
라한사 아
spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼
라한사 아
동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO
라한사 아
스프링 오픈소스 정리
스프링 오픈소스 정리스프링 오픈소스 정리
스프링 오픈소스 정리
라한사 아
자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)
자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

자바 웹 개발 시작하기 (10주차 : ㅌㅗㅇ ㅎㅏ ㄹㅏ)

DK Lee
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
라한사 아
스프링 Generic autowired이용해보기
스프링 Generic autowired이용해보기스프링 Generic autowired이용해보기
스프링 Generic autowired이용해보기
라한사 아
신림프로그래머 스터디 웹팩 발표자료
신림프로그래머 스터디 웹팩 발표자료신림프로그래머 스터디 웹팩 발표자료
신림프로그래머 스터디 웹팩 발표자료
라한사 아
나의 jQuery 실력 향상기
나의 jQuery 실력 향상기나의 jQuery 실력 향상기
나의 jQuery 실력 향상기
정석 양
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
Kwangyoun Jung
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
Kyoung Up Jung
Growing object oriented software guided by test
Growing object oriented software guided by testGrowing object oriented software guided by test
Growing object oriented software guided by test
라한사 아

Similar to Spring project 예제 분석 (20)

[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
SangHyeok Hong
Spring4 + my batis3 + mariadb (maven) 게시판 예제 1
Spring4 + my batis3  + mariadb (maven) 게시판 예제  1Spring4 + my batis3  + mariadb (maven) 게시판 예제  1
Spring4 + my batis3 + mariadb (maven) 게시판 예제 1
HeoJJun
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&CJavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
sys4u
Light Tutorial Django
Light Tutorial DjangoLight Tutorial Django
Light Tutorial Django
Kwangyoun Jung
초보개발자의 TDD 체험기
초보개발자의 TDD 체험기초보개발자의 TDD 체험기
초보개발자의 TDD 체험기
Sehun Kim
레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화
Jaehoon Choi
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
Seomgi Han
2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유
은아 정
Spring Boot 1
Spring Boot 1Spring Boot 1
Spring Boot 1
경륜 이
리팩토링
리팩토링리팩토링
리팩토링
Wonjun Hwang
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
SangIn Choung
[NEXT] Android 개발 경험 프로젝트 3일차 (Database)
 [NEXT] Android 개발 경험 프로젝트 3일차 (Database) [NEXT] Android 개발 경험 프로젝트 3일차 (Database)
[NEXT] Android 개발 경험 프로젝트 3일차 (Database)
YoungSu Son
보다 나은 웹 어플리케이션 설계
보다 나은 웹 어플리케이션 설계보다 나은 웹 어플리케이션 설계
보다 나은 웹 어플리케이션 설계
Eb Styles
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
성훈 김
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - HTML, Android Animation
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - HTML, Android Animation[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - HTML, Android Animation
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - HTML, Android Animation
NAVER D2
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
Kwangyoun Jung
퍼블리셔, 프론트엔드개발을 시작하다
퍼블리셔, 프론트엔드개발을 시작하다퍼블리셔, 프론트엔드개발을 시작하다
퍼블리셔, 프론트엔드개발을 시작하다
정석 양
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
개발이 테스트를 만났을 때(Shift left testing)
개발이 테스트를 만났을 때(Shift left testing)개발이 테스트를 만났을 때(Shift left testing)
개발이 테스트를 만났을 때(Shift left testing)
SangIn Choung
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdfNHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
Mancheol Jeon
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
[NDC 2018] 테라 콘솔 포팅기 - 현세대 콘솔 이식을 위한 렌더링 최적화 여정
SangHyeok Hong
Spring4 + my batis3 + mariadb (maven) 게시판 예제 1
Spring4 + my batis3  + mariadb (maven) 게시판 예제  1Spring4 + my batis3  + mariadb (maven) 게시판 예제  1
Spring4 + my batis3 + mariadb (maven) 게시판 예제 1
HeoJJun
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&CJavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
sys4u
초보개발자의 TDD 체험기
초보개발자의 TDD 체험기초보개발자의 TDD 체험기
초보개발자의 TDD 체험기
Sehun Kim
레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화
Jaehoon Choi
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
Seomgi Han
2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유
은아 정
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
SangIn Choung
[NEXT] Android 개발 경험 프로젝트 3일차 (Database)
 [NEXT] Android 개발 경험 프로젝트 3일차 (Database) [NEXT] Android 개발 경험 프로젝트 3일차 (Database)
[NEXT] Android 개발 경험 프로젝트 3일차 (Database)
YoungSu Son
보다 나은 웹 어플리케이션 설계
보다 나은 웹 어플리케이션 설계보다 나은 웹 어플리케이션 설계
보다 나은 웹 어플리케이션 설계
Eb Styles
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
성훈 김
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - HTML, Android Animation
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - HTML, Android Animation[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - HTML, Android Animation
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - HTML, Android Animation
NAVER D2
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
Kwangyoun Jung
퍼블리셔, 프론트엔드개발을 시작하다
퍼블리셔, 프론트엔드개발을 시작하다퍼블리셔, 프론트엔드개발을 시작하다
퍼블리셔, 프론트엔드개발을 시작하다
정석 양
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
개발이 테스트를 만났을 때(Shift left testing)
개발이 테스트를 만났을 때(Shift left testing)개발이 테스트를 만났을 때(Shift left testing)
개발이 테스트를 만났을 때(Shift left testing)
SangIn Choung
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdfNHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
Mancheol Jeon

Spring project 예제 분석

  • 2. 팀 프로젝트 파일의 압축을 풀고 import 시킨다. Import시 <errors running builder 'JavaScript validator' on project (프로젝트 이름)>이와 같은 에러가 발생하는 경우 http://fillin.tistory.com/2 블로그를 참조해보자
  • 4. http://localhost:8500/project/main 예제를 이용해보려고 하자 처음 마주하는 오류이다. 연결+SQL 관련 오류라는 것을 확인할 수 있다. DB설정을 바꿔주면 된다.
  • 5. 사용자 id, password, url 을 사용하는 DB에 맞게 설정해주면 된다. (현재 진행중인 프로젝트를 기준으로 하면 Id = pizza ,password = java304 , url = url=jdbc:oracle:thin:@localhost:1521:xe
  • 6. 잘 만들어져 있다. (견본으로 삼기 딱 적당하다.) 1조의 설계 아이디어와 여러 가지로 일치하는 모습을 보인다.
  • 7. 정말 잘 구현 되어있다. 하지만 여기서 다음 문제가 발견된다.
  • 8. 함께 저장되어 있는 sql문을 이용해 table을 전부 등록하고 회원가입을 시도하니 다음과 같은 화면이 나온다.
  • 9. NullPointerException 이 발생했는데 어디를 수정해야할지 구조파악이 잘 안된 상태에서는 판단하기가 어렵다. 해결방법은 제일 처음에 하나의 데이터는 미리 입력하는 것이었다.
  • 10. 오라클에서 직접 데이터를 넣었다. 참고로 쿼리문을 이용해 넣을 생각이었지만 이상하게 자꾸 틀린 value 값을 입력한다는 에러가 발생해서 행추가 기능을 사용해서 입력했다.
  • 11. 성공한 결과이다. 다만 한가지 결점이 있다. 회원 가입 페이지를 보면 주소 같은 값은 account 테이블이 아닌 Info 테이블에 저장된다. 두 테이블이 연동되어 있어서 그런듯하다. 하지만 지금 같은 방법으로는 처음 오라 클 에서 직접 입력했던 사용자 는 Info 테이블에 값이 존재하지 않게 된다. 따라서 정상적인 사용자로 이 용하기에는 부적합하다. 비정상적인 사용자는 차후 삭제 시키는 걸로 한다.
  • 12. 관리자 메뉴에는 권한을 부여하는 기능이 존재한다. 하지만 그 권한 을 부여할 최초의 관리자는 오라클에서 설정 해준다. 관리자로 로그인 하면 mypage가 Admin으로 바 뀐 것을 볼 수 있 다.
  • 14. Q&A 게시판 보이는 바와 같이 아무것도 나오지 않는다. 심지어 에러도 뜨지 않는다.
  • 15. Veiws/QABoardDetail.java 본래 출력되어야 할 화면의 JSP 소스인 듯하다. 즉 소스는 있지만 연결이 안되어있는 케이스 차근차근 쫓아가 보도록 하자.
  • 16. 화면 사이의 연결문제라고 하면 가장 의심되는 부분은 컨트롤러에 있는 맵핑이다.
  • 17. 맵핑마다 출력문구를 배치하여 client 의 Q&A게시판 화면 요청이 어느 맵핑을 타는지 추적한다. 확인 결과 Value = “/Qalist” 맵 루트를 탄다. (나중에 알았지만 아래 화면처럼 URL만 확인하면 금방 알수 있다.)
  • 18. Q&A 와 Board 코드의 비교이다. Model.addAttribute () 부분은 GUI 제작 때 사용했던 기억이 난다. 표를 만들 때 위의 속성을 표시해주는 부분과 연관이 있다. (현재 문제가 있는 부분이 이곳 근처이다.)
  • 19. 해당 맵핑의 시작하는 부분, 중간부분, 끝나는 부분에 검사용 출력 코맨트를 첨부 하여 문제가 발생하는 부분을 찾는다. (결과 : test-QABoard-Alist-middle이 출력되지 않았다. 문제는 중간 부분에 있었다.)
  • 20. 중간 부분의 코딩이다. 추적을 위해 심어놓은 코맨트가 작동하지 않는 이유는 윗부분인 if 문 두 개중 하나 혹은 둘 다 작동하지 않기 때문이다. Count와 endPage, pageCount를 모두 출력해봐서 if문의 조건과 비교해본다. 결과는 if(count > 0)  if(count >=0) 로 코딩을 수정함으로 문제는 해결됐다.
  • 21. 로그인 하지 않은 상태로 글쓰기를 시도하면 로그인 화면으로 이동한다.
  • 22. 보면 이름과 예약날짜는 텍스트 필드 방 번호는 select 박스로 되어있다. (가격은 어차피 비활성화 되어있으므로 논외) 여기서 방 번호를 설정하면 이름과 예약날짜 방 번호가 모두 초기화되는 문제가 있었다.
  • 23. URL을 보면 굉장히 수상한 부분이 발견된다. 방 번호를 203으로 선택해서 문제가 발생한 화면인데 조금 전 화면과 거의 같지만 URL 끝부분에 ?roomNum=203 이라는 부분이 추가되어 있다.
  • 24. 브라우저에서 확인 가능한 소스와 이클립스에서 소스를 비교하던 중 문득 “사이트 에러나 소스 에러는 나지 않았지?” 라는 생각이 들었다. 그리고 URL이 바뀌는 것과 데이터가 초기화 되는 부분을 고려해보니 DB의 “아직 입력되지 않은 데이터를 불러오는 것은 아닐까?” 라는 생각이 들었다.
  • 25. 다음과 같이 초기값을 넣고 commit을 해보았다. (commit 빼먹지 말자.)
  • 26. 방 번호를 로딩하자 가격과 방 이미지도 함께 나온다. 나머지 예약자 이름과 예약날짜만 입력해주면 된다. (참고로 로그 인을 안하고 예약작업을 하려고 하면 500번 에러가 뜬다. 예외처리만 해주면 될 것 같다.)
  • 27. (중간에 에러가 나서 시험을 위해 예약자 이름을 봉고로라는 이름으로 바꾸었다.) 보면 정상적으로 예약이 되었음을 확인할 수 있다.
  • 28. 이번 문제는 눈에 잘 띄지 않아서 방치하고 있던 회원가입 시 인 코딩 문제 되시겠다.
  • 29. 내용은 간단하다. 회원가입 시 입력한 글자가 깨지는 현상이 발생 DB에 저장된 데이터가 깨진이상 여기서 데이터를 가는가는 모든 화면에는 깨진 데이터가 보이게 된다.
  • 30. JSP 내부에서의 인 코딩과 캐릭터 타입 셋팅
  • 31. 파일 속성을 조회하면 나오는 인 코딩설정
  • 32. Web.xml에 있는 웹설정중 인 코딩필터
  • 33. 모조리 실패. 나중에는 소스를 고칠 때마다 에러 메시지가 뜨는 비참한 상황에 부딪히게 되었다. (여기에는 결과 위주로 적지만 혹시나 4시간에 걸친 탐색과정이 어떤 논리로 진행됐는지 궁금하신 분은 개인적으로 연락바랍니다.)
  • 34. 문제 해결의 계기가 된 것은 게시판코딩이었다. (등잔 밑이 어둡다라는 말이 현실이 되었다…) 게시판의 제목이나 글 내용은 DB에 한글로 잘만 입력되고 있었던것 양쪽 파트의 코딩을 비교하니 한글 깨짐의 원인은 get 방식과 post 방식의 차이라고 결론이 나왔다. (수업시간에 몇 번 강조되었지만 이렇게 애먹일 줄은 몰랐다…)
  • 35. 구글에 검색어로 “spring get 한글 깨짐” 이라고 입력하니 금방 찾을 수 있었다. 초보 개발자들이 한번쯤은 걸리고 넘어가는 문제라고 한다. 하긴 코딩에 문제가 있는 게 아니라 서버 쪽 코딩을 수정해야 하니 경험이 없으면 쉽게 생각이 나지 않을 것이다…
  • 36. DB에 정상적으로 입력된 모습이 보인다. 아직 테스트를 더 해야 하지만 게시판 등에서 실행했을 때는 작성자의 이름이 깨지지 않고 정상로딩 되는 것이 확인되었다.
  • 37. 문제의 화면이다. 여기서 덧 글 입력기능이 새로 발견된 문제이다.
  • 38. 처음 봤을 때는 당황해서 잘 안보였는데. 천천히 살펴보니 꽤 많은 단서가 보인다. (그렇다기 보다는 대놓고 오류부분을 지적해주고 있다… 모르니까 눈에도 안 들어 오더구먼…)
  • 39. 여기서 다음화면으로 넘어가려고 하면 에러가 발생하는 거니까 지금 이 화면에 대한 JSP 파일부터 확인해보자.
  • 40. 덧글을 입력해서 submit 시켜주는 코딩을 발견했다. Action 설정을 확인해서 이 다음 과정이 QACommentInsert 라는 것을 알수있다. (JSP 파일목록에 보이지 않으면 분명히 컨트롤러 쪽에 있다)
  • 41. QABoard 덧글이 문제 였으니 당연히 QABoardController를 확인한다. 내려가다 보면 익숙한 value 값이 눈에 들어온다. 위 화면에서는 System.out.println()을 여러 개 배치하여 어느 부분에서 에러가 나오는지 확인하였다.
  • 42. 위에서 출력한 값들의 결과이다. 보이는 대로 3번째 추적 구문이 출력되지 않았다. 그러므로 2번째와 3번째 추적 구문 사이에 있는 qaboarddao.QACommentInsert(qr); 여기서 문제가 발생했다는 것을 알 수 있다.
  • 43. 여기서 오류화면과 방금 전의 추적구문을 비교해보면 이상한 점이 발견된다. SQL문에서 받아야 할 값을 다섯 개인데 보내주는 값은 네 개뿐이다.(오류메시지를 이해했다면 이 결론에 도달하는데 10초도 안 걸릴 것이다…참고로 필자는 단지 거북하다는 이유로 추적방식을 썼다가 1시간 걸렸다.)
  • 44. 여기까지 오면 해결은 간단하다. 문제가 되는 SQL문을 지워버리면 된다. 앞부분의 username과 뒷부분의 UserName 을 삭제하면 덧 글 기능이 정상작동하기 시작한다.