Servlet & JSP (3)

HoJeong Im·2022년 8월 18일
0

lombok

  • Project lombok을 다운로드 받자

  • 실행 : Window + R => java -jar lombok.jar를 입력

  • 이클립스 실행 파일 경로를 넣어주고, install을 눌러줍니다.

  • 이클립스를 열고, lib 밑에 넣어주면 됩니다.

  • lombok 적용 전, private, public 모두 있는 것을 알 수 있습니다.

Getter, Setter 주입

  • @를 통해서 Getter를 주입해줄 수 있습니다.

  • Setter도 마찬가지!, @ToString도 가능

  • 지역변수를 바꾸고 싶을 때, 변수의 타입을 바꿀 때도 자동으로 수정이 됩니다.

    • 새로운 변수를 추가하고 싶을 때도!
  • @EqualsAndHashCode => equals, hashcode 메소드도 자동으로 override 됩니다!

  • @AllArgsConstructor => 매개변수가 있는 생성자 초기화

    • Default 생성자는? @NoArgsConstructor를 사용하자
  • lombok library에서 제공이 됩니다! 유지보수도!

lombok이 제공하는 Data

  • @Getter, @Setter, @ToString, @EqualsAndHashCode도 들어있습니다.

  • 그래서 @Data를 가장 많이 씁니다.

Servlet 복습!

request.setCharacterEncoding("UTF-8");
String searchCondition = request.getParameter("searchCondition");
String searchKeyword = request.getParameter("searchKeyword");
  • 초반에 페이지가 로딩될 때, null이 전달되기 때문에 ==> 문제가 발생할 가능성이 매우 높습니다!

  • 다양한 경우에 null이 전달됨

    • 그러면 언제 null이 전달이 안 되는 것인가? 검색 버튼을 눌렀을 때만 가능합니다.
  • form 태그를 통해서 전송이 되면 => 이것으로 감싸져 있는 parameter 정보가 전달되는 것

  • 화면 쪽에서 null 체크하고, DAO는 순수하게 DB 연동만 하면 되는 것

  • DAO에서 일관성 있게 getBoardList(BoardVO vo)처럼 BoardVO 객체를 받게 하자

    • 그 때마다 매개변수를 수정할 수 없으니 ==> 매개변수를 하나로 통합하면 편하다!
  • BoardVO에 변수를 추가하는 것은 아름답지 못함

    • VO라는 클래스는 테이블의 Row와 매핑되는 클래스라고 생각을 하지

    • 컬럼으로 멤버변수가 들어있겠구나 => 없는데 있다고 생각할 수 있어

    • 문법적으로 강요되는 것은 아니지만, 가급적이면 Table의 Column 이름과 매핑되게 하는 것이 맞다

해결책
  • SearchVO를 만들고 상속을 통해 처리한다.
public class SearchVO
public class UserVO extends SearchVO
public class BoardVO extends SearchVO

// 사용할 때는 아래와 같이 인자로 툭 던져주면 됨
List<BoardVO> boardList = boardDAO.getBoardList(vo);
  • 이게 안 돼?

    • "select * from board WHERE ? like '%'||?||'%' order by seq ASC";

    • 위의 SQL에서 첫 번째 물음표에 where 'title' 처럼 홑따옴표가 붙기 때문!

  • 각각의 Query를 만들어서 가지고 있는다.

추가

  • 여기서만 사용하면, 이곳에만 정의해서 사용해도 되지만 / 여러 곳에서 사용하면 메소드를 만들어서 사용합니다!

  • 내가 구현한 방식이 항상 옳은 방법이 아닙니다!

고급기능

Filter, Listener

  • web.xml에 filter가 자동으로 등록이 됩니다.
  <filter>
    <display-name>timeCheck</display-name>
    <filter-name>timeCheck</filter-name>
    <filter-class>com.web.common.TimeCheckFilter</filter-class>
  </filter>
  • 서버만 켜지면 다시 켜짐 = Pre-load

  • init 메소드가 멤버변수를 초기화

  • doFilter가 제일 중요

    • url-pattern에 따른 값을 요청해주어야 => filter의 클래스가 실행됩니다.
  • Reloading이 될 때 destroy 메소드는 자동으로 호출이 된다.

  • init, destroy 메소드는 한 번 실행되는 것은 같다

  • doFilter 메소드가 제일 중요

  • Filter는 Preloading, Servlet은 lazy-loading

  • doFilter가 실행되고, LogoutServlet이 실행됩니다.
System.out.println("---[ 사전 처리 ]---");
chain.doFilter(request, response);
System.out.println("---[ 사후 처리 ]---");
  • chain.doFilter가 기준점 : 클라이언트가 호출한 서블릿까지 가는 것!

    • 없다면 => 서블릿이 실행되지 않아요
long startTime = System.currentTimeMillis(); // 현재 시간을 long 타입의 숫자로 리턴한다.
chain.doFilter(request, response);
long endTime = System.currentTimeMillis();
System.out.println("서블릿 수행에 소요된 시간 : " + (endTime - startTime) + "(ms)초");
  • System.currentTimeMillis() : ms 단위의 시간 정보를 리턴합니다

  • Connection을 맺을 때 시간이 좀 걸림

  • 무슨 서블릿을 실행했는데 시간이 걸렸는지 구분이 안 됨

  • doFilter는 Servlet Container가 호출함

String uri = req.getRequestURI();
System.out.println(uri);
String path = uri.substring(uri.lastIndexOf("/"));
  • req.getRequestURI

  • URL과 URI의 범위

  • 서블릿에서는 한글 인코딩을 처리해줄 필요가 아닌 filter에서 처리해줄 수 있습니다.

  • 하나의 서블릿만을 위한 필터를 만들 수도 있음

<filter-mapping> 
	<filter-name>characterEncoding</filter-name>
    <url-pattern>/login.kt</url-pattern>
</filter-mapping>
  • FilterConfig

  • @WebFilter를 사용해서 filter 처리가 web.xml이 가능합니다.

Listener

  • listener도 filter와 동일하게 pre-loading이 됩니다.

  • 서블릿만 제외하고 나머지는 pre-loading이 되는 객체들이다.

  • tomcat 서버를 stop하면 => 죽기전, servlet-container를 먼저 죽입니다.

public class MyServletContextListener implements ServletContextListener
, ServletContextAttributeListener
  • 위와 같이 인터페이스를 하나 더 선언해서 사용할 수 있다.

ServletContext context = getServletContext();
context.setAttribute("nickname", "IDIOT");
// 이럴 때, attributeAdded가 발생합니다!
context.setAttribute("nickname", "IDIOT");
// 이럴 때, replaced가 발생 
context.removeAttribute("nickname");
// attributeRemoved가 발생합니다. 

  • LifeCycle부분에서, 등록/수정/삭제될 때 사용하는 것

  • attributeAdded

  • attributeReplaced

  • attributeRemoved

<error-page>
  <error-code>404</error-code>
  <location>/error404</location>
</error-page>

JSP

  • Servlet은 자바 코드 안에 디자인 코드가 있어서 망함

    • 디자인 바꾸기 정말 힘들어
  • Server를 삭제하면 tmp0가 사라지고, 구동하면 다시 생김

  • apache-tomcat과 tmp0의 디렉터리 구조가 비슷함

    • 원본은 다른 폴더에 있지만, tmp0는 복사본 폴더에 있음

    • work > Catalina > loca

  • 이 파일을 삭제했어? 브라우저에서 요청하면 다시 만들어줘

    • tomcat 서버가 다시 만들어줘

    • jsp는 결국에 servlet으로 변환이 되어야 실행이 된다.

  • hello_jsp.java

  • 시간이 안 바뀜

    • 그 때 JSP가 서블릿으로 다시 변환된다.

scriptlet

  • 일반적인 자바 코드가 작성되는 영역
<%@page import="com.kt.biz.user.UserVO"%>
<%@page import="com.kt.biz.user.UserDAO"%>
<%@page contentType="text/html; charset=UTF-8"%>

<%
	// Scriptlet : 일반적인 자바 코드가 작성되는 영역 
	// 1. 사용자 입력정보 추출 
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	// 2. DB 연동 처리 
	UserVO vo = new UserVO();
	vo.setId(id);
	vo.setPassword(password);
	
	UserDAO userDAO = new UserDAO();
	UserVO user = userDAO.getUser(vo);
	
	// 3. 검색 결과를 기반으로 응답 화면 구성 
	
%>
  • scriptlet으로 감싸주지 않으면, 에러가 나지는 않지만 자바 코드가 실행되지 않고 단순한 텍스트로 실행이 되어버립니다.
profile
꾸준함이 제일 빠른 길이었다

0개의 댓글