Developer Note/국비과정 수업내용 정리&저장

24년 11월 4일

DH_PARK 2024. 11. 6. 01:34

학원에서 다 처리하지 못한 문제들을 집에와서 풀어보고 있는 중이다.. 해결해야 될 점을 몇가지 보자면

 

1. 도서 조회 페이지에서 전체로 특정 키워드 조회했을 때 문자열 포함한 검색결과 나와야하는데 안나옴

2. 조회에서 bookCode 눌렀을 때 add페이지에서 빈 칸안에 책 정보가 적혀있는 read 페이지로 포워딩 처리 되어야 하는데 안됨

3. 수정페이지까지는 갔는데 수정하기 버튼 눌렀을 때 예외가 뜸

4. Exception 발생..java.lang.NumberFormatException: update 페이지

5. 로그인페이지에서 로그인 누르면 index로 가게해야함.

 

한번 해결해보도록 하자.


집에와서 해보는 풀이

지금 join페이지에서 회원가입을 진행하면 error가 떠서 해결하는중이다.

	try {
			//Method==GET -> 페이지 표시(Forwarding)
			String method = req.getMethod();
			if("GET".equals(method)) {
				System.out.println("[BC] GET /join..");
				req.getRequestDispatcher("/WEB-INF/view/join.jsp").forward(req, resp);
				return ;
			}

여기서 하나 알게 된것은 꼭 jsp 코드에서 form 메서드가 get 방식을 요청하지 않고 있더라도 사용자가 URL 에서 직접 페이지를 요청하거나 다른 페이지에서 a 태그로 이동 하는것도 그 페이지를 요청하는 것이기 때문에 get 방식을 요청하고 있는 것이라고 한다.

고친 부분

UserLoginController 에서

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) {
		
		try {
			//Method==GET -> 페이지 표시(Forwarding)
			String method = req.getMethod();
			if("GET".equals(method)) {
				System.out.println("[BC] GET login/login....");
				req.getRequestDispatcher("/WEB-INF/view/login.jsp").forward(req, resp);
				return ;
			}
			
			//Method==POST-> 도서 등록처리
				
			//파라미터 받기
			String username = req.getParameter("username");
			String password = req.getParameter("password");

			// 유효성 확인
			if(!isValid(null)) {
				//
			}
			
			// 서비스 실행
			UserDto userDto = new UserDto(username,password,null,false);
	
			
			Map<String , Object> rValue = userService.login(userDto, req.getSession());
			
			boolean isLogined =  (boolean)rValue.get("success");
			String message = (String)rValue.get("message");                           
			
			
			// 뷰로이동(내용전달 - ?)
			if(isLogined) { //왜 false 라면일까..
				resp.sendRedirect(req.getContextPath() + "/?message="+URLEncoder.encode(message,"UTF-8"));
				System.out.println("잘 옴.");
				return ;
			}else {
				req.setAttribute("message", message);
				req.getRequestDispatcher("/WEB-INF-view/login.jsp").forward(req, resp);
				System.out.println("오류임.");
				return ;
			}
			

여기서 message 파라미터를 받아올 meesage 라고 오타 수정.

 


5. 페이지에서 HOME 버튼을 누르면 index.jsp 로 돌아가도록 설정.

이건 뭐 생각보다 아주 간단한 거였다.

nav.jsp 에서 

<a class="navbar-brand" href="${pageContext.request.contextPath}">HOME</a>

이 부분을 프로젝트 경로로 잡으면 다시 원래 화면으로 돌아갔다.

 

 


BookUpdateController 작성

@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) {

		try {
			String method = req.getMethod();
			if("GET".equals(method)) {
				//파라미터
				Long bookCode = Long.parseLong(req.getParameter("bookCode"));
	
				
				
				//서비스 실행
				BookDto bookDto =  bookService.getBook(bookCode);
				
				//뷰로
				req.setAttribute("bookDto", bookDto);
				System.out.println("[BC] GET /book/upate..");
				req.getRequestDispatcher("/WEB-INF/view/book/update.jsp").forward(req, resp);
			}
				
			Long bookCode = Long.parseLong(req.getParameter("bookCode"));
			String bookname = req.getParameter("bookName");
			String publisher = req.getParameter("publisher");
			String isbn = req.getParameter("isbn");
			
			
			//서비스
			BookDto bookDto = new BookDto(bookCode,bookname,publisher,isbn);
			boolean isUpdate =  bookService.bookUpdate(bookDto);
				
				if(isUpdate) {
					resp.sendRedirect(req.getContextPath()+"/book/read?bookCode="+bookCode);
					System.out.println("업데이트 성공");
					return ;
				}else {
					req.setAttribute("messgae", "update..");
					req.getRequestDispatcher("WEB-INF/view/book/update.jsp").forward(req, resp);
					System.out.println("업뎃 실패");
				}
				

Controller 에서 데이터를 수정할 수 있도록 작성했다. 그러나 수정하기 버튼을 누르면

[BC] Exception 발생..java.lang.NumberFormatException: For input string: " bookCode"

이라는 예외가 발생했다.

 

문자열이 올바른 형식이 아니라는 뜻이거나 문자열이 숫자로 변환될 수 없어서 발생하는 오류이다.

 

dao 도 보고 service 로직도 살펴봤지만 딱히 문제가 되는 부분은 보이지 않았는데,

isUpdate 조건문 부분에서 “업데이트 성공” 이라는 프린트가 확인이 되었으니 아마 리다이렉트를 하는 부분에서 잘못되지 않았나 하고 주소를 살펴보았다.

보았더니 ``

 

resp.sendRedirect(req.getContextPath()+"/book/read?bookCode=+bookCode”);

 

리다이렉트 URL 부분이 저런식으로 쿼리스트링에서 bookCode 가 문자열에 포함 되어있어 올바르게 파라미터를 불러오지 못했다.

그래서 올바르게

resp.sendRedirect(req.getContextPath()+"/book/read?bookCode="+bookCode);

이런식으로 문자열 쿼리스트링 + bookCode 파라미터를 올바르게 나타낼 수 있도록 수정했다.


이 예외를 빨리 눈치채지 못한건 아직 내가 URL 쿼리스트링 , GET , POST 방식의 요청방식을 정확히 이해하지 못하고 있어서이다.

request 의 getParameter 같은 메서드들도 저 쿼리스트링에 있는 파라미터 값을 받아오는 것이라고 한다.

확실히 그냥 코드만 따라친다고 이해가 되는건 아닌듯하다. 나같은 녀석은더.. ㅋㅋ

하나하나 시간들여 직접 코드를 치면서 이해해봐야 이게 어떤건지 이해가 된다.

시간이 오래 걸리는 스타일이지만 대신에 까먹지는 않겠지.

좌절하지 말고 계속 잘해보자 !

'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글

24년 11월 7일  (0) 2024.11.19
24년 11월 5일  (0) 2024.11.11
24년 11월 1일  (3) 2024.11.05
24년 10월 31일  (1) 2024.11.04
24년 10월 30일  (1) 2024.11.04