본문 바로가기
TIL

[TIL] 2022년 3월 2주차

by happyhelen 2022. 3. 7.

 

 

 

  • 코드는 깃헙에 올리므로 여기서는 공부한 내용을 요약하는 식으로 정리합니다.

 

 

 

3월 7일

  • 지난주에 이어서 JSP/Servlet 을 공부했다.
  • GET방식, POST방식에 따라 jsp 를 만들고 Servlet 을 생성하는 것을 반복해서 연습했다.
  • .java 와 .xml 은 / 앞에 context path 가 생략되어져 있다.
  • JSP 페이지에서 사용가능한 내장객체변수 중 request, response, out 을 공부했다. 내장객체란 변수 선언 없이도 사용할 수 있는 변수이다.
  • 또한 Servlet 에서 GET, POST 방식에 상관없이 메소드를 정상적으로 호출하는 방법들을 공부했다.
    • 1. Override 하지 않은 private 메소드를 생성하고, doGet과 doPost 에서 이 메소드를 호출하는 방법
    • 2. doGet 메소드에 내용을 기술하고, doPost 메소드에서도 doGet 을 호출하도록 하는 방법
    • 3. web.xml 에서 url 매핑을 하는 것 대신에, 서블릿 클래스에 @WebServlet 어노테이션을 사용하는 방법(이 어노테이션을 조작해도 WAS 를 재구동해야한다.)
  • action 중 표준액션을 공부했다.
    •  jsp:include 와 include file 로 해당 소스파일의 html 을 정보를 가져올 수 있는데, 둘의 차이점은 다음과 같다.
    • <jsp:include page="" /> 는 실행된 결과물(html) 을 가져온다는 것이고, <%@ include file="" %> 는 파일의 소스 그대로를 가져오는 것이다.
    • 그래서 include file 방식으로는 여러개의 jsp 파일을 작성 시, 중복되는 부분이 있으면 그 부분만 별개의 jsp 파일로 만들어서 전달하는 식으로 사용된다. 이렇게 하면 코드가 훨씬 간단해지고, 기능이 분리되어서 모든 jsp 파일을 수정할 필요 없이, 기능을 분리해둔 jsp 파일만 수정하면 나머지 모든 jsp 파일에 자동 적용되어 코드를 용이하게 다룰 수 있게 된다.
  • 기억해둘 것
    • 1. WAS 는 한번 구동되어질 때 배치서술자인 web.xml 을 딱 한번만 읽어오기 때문에 JSP/Servlet 단을 만지면서 web.xml 을 변경하게 되거나, annotation 사용하는 데 변경이 발생한다면 꼭 WAS 를 재구동해주어야 WAS 가 변경사항을 인식하게 된다. (그렇지 않으면 404 에러가 발생한다. ) --- 중요!!
    • 2. request.getMethod(); 로 클라이언트에서 넘어온 메소드 방식을 알아낼 수 있다.
    • 3. post 방식은 한글이 깨져서 나오는데 해결 방법은 다음과 같이 두 가지가 있다.
      • 1. request.setCharacterEncoding("UTF-8"); 을 request.getParameter("변수명"); 보다 먼저 기술하는 방법
      • 2. Filter 을 생성해서 doFilter() 메소드 안에 1번의 내용을 입력하고 @WebFilter("/*") 어노테이션을 붙여서 모든 클라이언트 요청을 서블릿이 받기 전에 필터의 내용을 거치게 하는 것이다.
    • 4. JSP 내장객체 중 request 는 클라이언트가 보내온 데이터를 읽어들이는 역할도 있고( request.getParameter(); ), 어떤 결과물을 저장시키는 저장소 기능도 있다.( request.setAttribute("키", 저장할객체); )
 

[JSP] 클라이언트에서 요청된 데이터의 action, 그리고 jsp:forward 까지의 흐름

먼저, 다음과 같은 jsp 파일에서 클라이언트에게 정보를 요청했다고 가정하자. 아래의 예시는 입력한 두 숫자 범위안에 있는 수들을 합산하는 내용이다. form 태그에 직접적으로 action 을 주지 않

programming-hyerim.tistory.com

 

 

 

 

 

 

3월 8일

  • Post 메소드로 접근하게 했다 하더라도, 사용자가 Get 방식으로 접근을 시도하면 지정해 놓은 데이터 대신에 다른 이상한 데이터들이 들어올 수 있다.
    • 예를들어, submit() 을 하면 http://localhost:9090/JSPServletBegin/registerPerson.do 페이지로 넘어가는 것이 정상이지만,
    • 그냥 uri 검색창에 http://localhost:9090/JSPServletBegin/registerPerson.do?name=엄정화&school=초등학교졸&color=검정&food=라면&food=떡볶이&food=치킨  이런식으로 입력하고 엔터를 눌러버리면, db 에 예상치 못한 데이터들이 들어오게 되는 것이다.
  • 그래서 의도적으로 Get 방식으로 접근하지 못하도록 action 단에서 request.getMethod() 를 활용해서 지정하지 않은 방식으로 접근했을 때 만들어둔 에러페이지로 이동하게 한다.
  • DTO 가 있는 경우, jsp:useBean 와 jsp:setProperty, jsp:getProperty 와 함께 사용하면 자바코드를 작성하지 않고도 자바빈(Bean)을 만들어 사용할 수 있다. 
    • 이때, <jsp:setProperty property="*" name="useBean의id값"> 을 사용하면 모든 데이터를 setProperty 할 수 있는데, 전제조건은 DTO 클래스의 setXXX() 메소드의 XXX 이름과, form 태그에서 전달되어져 오는 name 값이 같아야 한다는 것이다. 예를들어, DTO 클래스에 setAge(){}; 이라는 메소드가 정의되어져 있고, form 태그에 name="age" 이 정의되어야 한다는 것이다. 즉, DB 의 컬럼네임(DTO) 와 form 태그의 name 값이 같아져야 한다. 이렇게 하면 일일이 쓸 필요 없이 알아서 찾아진다. 
  • 기억해둘 것
    • 1. request.setAttribute("키", 변수) 를 할 때 개수가 많으면 Map에 put 하고, 그 Map 을 setAttribute 로 request 영역에 저장한다.
    • 2. <jsp:forward page=path 주소/> 처럼 데이터를 넘겨주고자 할 때, 자바에서는 RequestDispatcher 을 사용해서 다음과 같이 한다.
      • RequestDispatcher dispatcher = request.getRequestDispatcher(path 주소);
        dispatcher.forward(request, response);
  • 2022.03.09 - [Servlet] - [JSP/Servlet] request.getRequestDispatcher 사용해 java 파일로 forward 하는 방법과 사용해 jsp 파일로 forward 하는 방법
 

[JSP/Servlet] request.getRequestDispatcher 사용해 java 파일로 forward 하는 방법과 <jsp:forward page=""> 사용해 jsp

예시를 최대한 간단하게 보기 위해 style 과 유효성 검사는 생략했다. 흐름을 이해하면서 데이터를 어떻게 전송하고 꺼내보는지에 주목해서 복습하는 용도이다. 두 가지 예시가 나온다. 1-1) 아래

programming-hyerim.tistory.com

 

 

 

 

 

3월 9일

  • 대선 및 개인공부

 

 

 

 

 

 

3월 10일

  • JSTL 을 마무리하고 JSP 와 DB 를 연결해서 웹에 띄우는 CRUD 즉, 회원가입, 회원조회, 회원삭제, 회원정보수정을 기능을 제작하는 실습을 시작했다.
  • 파라미터가 있는 생성자를 만들면 기본생성자는 자동으로 삭제되는 것을 염두에 두자. 혹시 파라미터가 있는 생성자를 만들면서 기본생성자도 사용하고 싶을 때는 기본생성자를 꼭 만들어주자.
  • .
  • 기억해둘 것
    • 1. 웹에 띄울 jsp 는 WEB-INF 파일 아래에 위치해야한다.
    • 2. DTO 에 메소드를 생성할 때 메소드명은 getXXX 혹은 setXXX 의 규칙을 따라야 한다.
    • => jsp 에서 "requestScope.저장한키.메소드이름" 으로 꺼낼 때 dto 클래스에서 가져올 메소드의 이름에서 XXX 만 가져오는데, 첫 글자는 소문자로 하기때문에 dto 의 메소드명을 규칙에 맞게 지어야한다. 
    • 3. 클라이언트가 POST 방식으로 들어왔는지, GET 방식으로 들어왔는지 Servlet 단에서 경로를 제어해야 한다.
    • 4. JS 에서 URL 페이지 이동은 location.href="이동할 url 경로명"; 이다. 암기!
    • 5. DB 에서 select 해온 정보를 담아둔 request.setAttribute("키",객체) 는, 보여주고자 하는 jsp 에서 request.getAttribute("키") 로 꺼낸다.
      • 또한 객체 안에서 DTO 의 getXXX 으로 구체적인 데이터를 꺼내오고자 할 때는 객체.xXX 로 꺼낸다. (예를들어 DTO 에 getColor 로 데이터를 꺼내올 때는 객체.color 로 꺼낸다. 소문자에 유의한다. )
    • 6. 데이터를 삽입하거나 조회하는 등의 코드를 짤 때는 여러 변수를 생각하는 습관을 만들자. 예를들어, 예외발생이라든지, null 이라든지, 데이터 타입이라든지 등의 만약을 생각하자.
    • 7. jsp 에서 스크립틀릿보다는 역시 JSTL 이 좀 덜 헷갈린다. 
  • param 과 requestScope 의 차이에 대해 질문했는데, 답변을 요약하자면 다음과 같다.
    • 사실 param 은 잘 쓰지 않는다. jsp 단에서 param 사용이 가능하지만, 규모가 좀 있는 프로젝트나 현업에서는 .do 나 회사 관련된 uri 를 쓰는데 이런거는 자바에서 다 처리해주는 것이다. 이렇게 하는게 좋은 이유는 java 와 jsp 를 구분할 수 있기 때문, 즉 액션단과 뷰단이 각자 업무가 가능하기 때문이다. 

 

 

 

 

 

 

3월 11일

  • DBCP 를 공부했다.
  • ojdbc6.jar 파일을 lib 폴더에 추가했다.
  • 기억해둘 것
    • request 는 "내장객체"이다. 
    • jsp 파일을 WEB-INF 내에 넣어두고 해당 파일에서 톰캣을 돌리면 해당 jsp 파일이 존재하지 않는다는 404에러가 뜬다. 그렇다고해서 jsp 파일을 화면에 보이게 하기위해 WEB-INF 가 아닌 다른 파일에 두고 돌려서 잘 나온다고 좋아하지 말자. uri 에 파일이 어디에 위치해 있는지 다 공개되기 때문에 보안성이 떨어진다. WEB-INF 내에 넣어두고 jsp 파일이 존재하지만 uri 상에서는 없는 것처럼 보이는게 보안성이 좋다. 돌릴 때는 jsp 파일을 돌리지 말고 uri 매핑 주소를 보고서 uri 검색창에 치도록 하자.
    • method 를 정해주지 않았다면, 기본은 get 방식이다.
    • post 방식으로 데이터를 전송해서 작업을 처리하기 위해 form 태그를 만들기도 한다. type 은 hidden 으로 해서 브라우저에는 보이지 않게한다.
<%-- POST 방식을 통해 회원을 삭제하기 위하여 화면에는 보이지 않는 form 태그를 만든다. 목적은 전송하는 것이다. --%>
	<form name="delFrm">
		<input type="hidden" name="seq" value="${requestScope.psdto.seq}" />
		<input type="hidden" name="name" value="${requestScope.psdto.name}" />
	</form>
	
	<form name="updFrm">
		<input type="hidden" name="seq" value="${requestScope.psdto.seq}" />
	</form>

 

 

 

 

 

 

3월 12-13일

  • 주간 복습 및 TIL 작성

 

 

 

 

'TIL' 카테고리의 다른 글

[TIL] 2022년 3월 4주차  (0) 2022.03.21
[TIL] 2022년 3월 3주차  (0) 2022.03.16
[TIL] 2022년 2월 5주차 ~ 3월 1주차  (0) 2022.02.28
[TIL] 2022년 2월 4주차  (0) 2022.02.21
[TIL] 2022년 2월 3주차  (0) 2022.02.15