** 톰캣서버를 설치하고 서블릿 코드를 클래스 파일로 빌드해서 올리는 과정은 번거로우니 내장 톰캣이 있는 스프링부트 환경에서 진행
1. HelloServlet.java 생성
HttpServlet을 상속을 받고 @WebServlet 컴포넌트를 사용하여 name과 urlPatterns를 지정해준다. ctrl+o를 해서 protected service 메서드를 만든다. 이 서블릿이 호출이되면 서비스 메서드가 호출이 되도록 !!!
그리고 스프링 실행하자마자 에러 등장
ㅋㅋㅋㅋㅋㅋㅋ
아래는 에러 문구
Unexpected exception during bean creation; nested exception is java.lang.NoClassDefFoundError:
내가 작성한 코드는 없었고 컴포넌트, 메서드는 다 자동으로 설정했기 때문에 바로 침착하게 구글에 복사 및 붙여넣기
그런데 구글링하자마자 나와 같은 강의를 듣는 사람의 똑같은 에러 발견
https://www.inflearn.com/questions/172527
해결 방안 : build.gradle에 있는 다음 코드를 삭제
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
추가 답변 : gradle의 providedRuntime는 별도의 런타임 환경에서 라이브러리가 제공된다는 뜻입니다. 그래서 이 부분을 실행할 때 해당 라이브러리를 사용하지 않아서 발생하는 문제입니다. (별도의 톰캣 서버를 띄우고 그 서버에 빌드된 결과를 두고 실행하는 것으로 이해하시면 됩니다.) 이 부분을 제거하면 기본으로 해당 라이브러리가 포함됩니다. IDE가 이 부분을 실행할 때 인식하면 문제가 없는데, 무료 버전의 경우 인식을 하지 않더라구요. 이 부분은 크게 고민하지 않으셔도 되는데, 이후에는 모두 War 대신에 Jar를 사용하는데, 이때는 문제가 발생하지 않습니다.
해당 방안을 실행하니 바로 문제없이 해결이 됨
그런데 localhost:8080/hello로 요청하면 whitelabel error message가 출력이 됨.
허나 콘솔창에는 sysout으로 찍은 HelloServlet.service가 출력이 되었기때문에 지정해준 html파일이 없어서 일거라고 판단하고 혹시 나랑 비슷한 분이 있나하고 찾아보니 있었다
답변 : 지금은 뷰 파일을 따로 지정하지 않아 보여줄 파일이 없어 WhiteLabel이 뜨는것 같습니다.
지금 확인하실 부분은 인텔리제이 콘솔에 HelloServlet.service 메시지가 뜨는지 확인하시면 될 것 같습니다.
애니웨이!! 다시 본론으로 돌아가
http 요청이 오면 was(서블릿 컨테이너)가 request,response객체를 만들어서 서블릿에 전달함
이 말인 즉, /hello url을 호출하면 웹브라우져가 http요청메세지를 만들고 서버에 던짐 그리고 서버가 request, response 객체를 만들어 내려준다 !
request, response 객체 활용하기
System.out.println("request" + req);
System.out.println("response" + resp);
String username = req.getParameter("username");
System.out.println(username);
위와 같이 코드를 수정하고 서비스를 띄워본다
http://localhost:8080/hello?username=rosieposie 이렇게 요청하면 콘솔창에 아래와 같이 출력됨을 확인 할 수 있음
나는 username라는 키값을 가진 파라미터를 출력을 했으니 req.getParameter("username") ----> rosieposie 출력
resp.setContentType("text/plain");
resp.setCharacterEncoding("utf-8");
resp.getWriter().write("hello"+username);
이어서 response 객체에 컨텐츠타입, 인코딩, 그리고 바디를 그려본다!
내가 기대한건 whitelabel error page가 여전히 찍히지만 개발자도구의 네트워크에는 데이터가 넘어올 걸로 예상했는데
아무리 url을 요청을 해도 네트워크에 넘어오는게 없는 것이다..? 그래서 해당강의 질문내역을 또 뒤적뒤적함
나와 비슷하게 콘솔에는 찍히지만 웹브라우져에는 응답이 없었던 분이 있었음
빵칠
2021.08.14 오후 9:43
안녕하세요. 지나가던 학생인데 혹시 도움 되실까 해서 댓글 남깁니다.
저도 같은 오류가 있었는데, 제 경우 코드의 super.service(req, resp) 를 제거했을 때 정상 작동했습니다.
그러다가 이 답변을 보게 되었고, 나도 똑같이 제거했더니 whitelabel error 페이지가 사라지고 hellorosieposie가 보였다
빵칠님 감사합니다 도움이 많이 되었어요 희희
정리
@WebServlet 서블릿 어노테이션
- name : 서블릿 이름
- urlPatterns : URL매핑
- name이나 urlPatterns 중복 불가
HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿컨테이너는 다음 메서드를 실행한다.
protected void service(HttpServletRequest req, HttpServletResponse resp)
웹 브라우저 실행
- http://localhost:8080/hello?username=rosieposie
- 결과 hellorosieposie
팁 !! HTTP 요청 메세지 로그로 확인하기 - application.properties에 아래와 같이 추가
logging.level.org.apache.coyote.http11=debug
이렇게 설정해주면 콘솔에 표기되어서 쉽게 인지 할 수 있음. 운영때는 성능저하가 올 수 있으니 개발때만 사용!!
서블릿 컨테이너의 동작 방식
내장 톰캣 서버 생성
웹 어플리케이션 서버의 요청 응답 구조
개발할 때 아무 생각없이 HttpServletRequest, HttpServletResponse 객체에서 파라미터나 세션정보 가지고 오는 등으로만 사용하고 그 이외에는 더이상 알아보려고 하지 않았었는데 강의듣고 정리하면서 내 머릿속에 개념도 다시 잡고가게 되어 좋았다! 역쉬 아키텍쳐 그리면서 코드작성하니 더더욱 이해 잘가는 군! 그리고 이 모든걸 쉽게 설명해주시는 김영한 쌤 최고,, 그리고 ㅋㅋㅋ전국의 인프런 랜선 동지들 감사합미다!!!! ㅋㅋㅋㅋ
@ 스프링 MVC 1편 - 백엔드 웹개발 by 김영한을 참조하고 있습니다.
'Spring > mvc' 카테고리의 다른 글
[Spring MVC 1] - HTTP 요청 데이터 (0) | 2022.08.07 |
---|---|
[Spring MVC 1] - HttpServletRequest (0) | 2022.08.01 |
[Spring MVC 1] - 서블릿 프로젝트 생성 (0) | 2022.07.30 |
[Spring MVC 1] - HTML, HTTP API, CSR, SSR (0) | 2022.07.29 |
[Spring MVC 1] - 동시 요청 - 멀티 쓰레드 (0) | 2022.07.28 |