Window + R
=> java -jar lombok.jar
를 입력Setter도 마찬가지!, @ToString도 가능
지역변수를 바꾸고 싶을 때, 변수의 타입을 바꿀 때도 자동으로 수정이 됩니다.
@EqualsAndHashCode => equals, hashcode 메소드도 자동으로 override 됩니다!
@AllArgsConstructor => 매개변수가 있는 생성자 초기화
lombok library에서 제공이 됩니다! 유지보수도!
@Getter, @Setter, @ToString, @EqualsAndHashCode도 들어있습니다.
그래서 @Data를 가장 많이 씁니다.
request.setCharacterEncoding("UTF-8");
String searchCondition = request.getParameter("searchCondition");
String searchKeyword = request.getParameter("searchKeyword");
초반에 페이지가 로딩될 때, null이 전달되기 때문에 ==> 문제가 발생할 가능성이 매우 높습니다!
다양한 경우에 null이 전달됨
form 태그를 통해서 전송이 되면 => 이것으로 감싸져 있는 parameter 정보가 전달되는 것
화면 쪽에서 null 체크하고, DAO는 순수하게 DB 연동만 하면 되는 것
DAO에서 일관성 있게 getBoardList(BoardVO vo)처럼 BoardVO 객체를 받게 하자
BoardVO에 변수를 추가하는 것은 아름답지 못함
VO라는 클래스는 테이블의 Row와 매핑되는 클래스라고 생각을 하지
컬럼으로 멤버변수가 들어있겠구나 => 없는데 있다고 생각할 수 있어
문법적으로 강요되는 것은 아니지만, 가급적이면 Table의 Column 이름과 매핑되게 하는 것이 맞다
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>
<display-name>timeCheck</display-name>
<filter-name>timeCheck</filter-name>
<filter-class>com.web.common.TimeCheckFilter</filter-class>
</filter>
init 메소드가 멤버변수를 초기화
doFilter가 제일 중요
Reloading이 될 때 destroy 메소드는 자동으로 호출이 된다.
init, destroy 메소드는 한 번 실행되는 것은 같다
doFilter 메소드가 제일 중요
Filter는 Preloading, Servlet은 lazy-loading
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도 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>
Servlet은 자바 코드 안에 디자인 코드가 있어서 망함
Server를 삭제하면 tmp0가 사라지고, 구동하면 다시 생김
apache-tomcat과 tmp0의 디렉터리 구조가 비슷함
원본은 다른 폴더에 있지만, tmp0는 복사본 폴더에 있음
work > Catalina > loca
이 파일을 삭제했어? 브라우저에서 요청하면 다시 만들어줘
tomcat 서버가 다시 만들어줘
jsp는 결국에 servlet으로 변환이 되어야 실행이 된다.
hello_jsp.java
시간이 안 바뀜
<%@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. 검색 결과를 기반으로 응답 화면 구성
%>