데이터베이스를 사용하려면 필요한 것
- 데이터베이스에 요청을 전달하고 결과를 받을 때 사용할 도구 (JDBC)
- 데이터베이스에 명령을 내릴 때 사용할 언어 (SQL)
Type4 JDBC 드라이버는 MySQL 통신 프로토콜에 맞추어 데이터베이스와 직접 통신하기 때문에 ODBC 드라이버를 필요로하지 않아. 그래서 실무에서 Type4 JDBC 드라이버 주로 사용
JDBC API를 사용할 때는 예외가 발생할 수 있으므로 try ~ catch ~ 블록 JDBC 프로그래밍을 할 때 주의할 점은 정상적으로 수행되든 오류가 발생하든 간에 반드시 자원 해제를 수행하는 것. finally 블록이 가장 적당함. ex) xxx.close(); 자원흘 해제할 때는 역순으로 처리.
Servlet
GenericServlet -> service() HttpServlet -> doGeT(), doPost() …
<a>
태그의 URL이 ‘/‘로 시작하면 절대경로, 그렇지 않으면 상대경로 절대경로 URL : 웹 서버 루트를 기준으로 계산. 상대경로 URL : 현재 경로를 기준으로 계산.
HttpServlet은 상속 받을 때 service() 메소드를 그대로 구현하기보다는 클라이언트의 요처 방식에 따라 doXXX() 메소드를 오버라이딩.
회원목록조회 예제와는 다르게 insert SQL문을 실행할 때는 Statement 대신 PreparedStatement를 사용해야 함.
PreparedStatement는 반복적인 질의를 하거나, 입력 매개변수가 많은 경우에 유용. 특히 이미지와 같은 바이너리 데이터를 저장하거나 변경할 때는 PreparedStatement만 가능.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Connection conn = null;
PreparedStatement stmt = null;
try{
conn = DriverManager.getConnection(
“jdbc:mysql://localhost/stduydb”, // JDBC URL
“study”, // DBMS 사용자 아이디
“1234”); // DBMS 사용자 암호
stmt = conn.prepareStatement(
“INSERT INTO MEMBERS (EMAIL, PWD< MNAME,CRE_DATE, MOD_DATE)"
+ “ VALUEWS (?,?,?,NOW(),NOW())”);
stmt.setString(1, request.getParameter(“email”));
stmt.setString(2, request.getParameter(“password”));
...
stmt.executeUpdate(); // 쿼리 실행
} catch (Exception e) {
throw new Servlet Exception(e);
} finally {
// 자원해제는 연결 역순
try { if (stmt != null) stmt.close();} catch (Exception e) {}
try { if (conn != null) conn.close();} catch (Exception e) {}
}
getParameter()를 호출하면 기본적인 매개변수의 값이 ISO-Latin-1로 인식 한글이 깨지는 것을 해결하려면 getParameter()를 호출하기 전에 클라이언트가 보낸 매개변수의 값이 어떤 인코딩으로 되어있는지 지정해야 해. (UTF-8) 깨지는 원인은 서블릿에서 데이터를 꺼낼 때 클라이언트가 보낸 데이터를 ISO-8859-1이라 가정하고 유니코드로 변환하기 때문임. request.setCharacterEncoding(“UTF-8”);
리프래시
일정 기간이 지나고 나서 자동으로 서버에 요청을 보내는 방법
응답 헤더를 이용한 리프레시 response.addHeader(“Refresh”, “1;url=list”); —> 1초 후에 다시 서비스를 요청
HTML의 meta태그를 이용한 리프래시
<head>
태그 안에 리프래시를 설정하는<meta>
태그를 추가. <meta http=equiv = ‘Refresh’ content = ‘1; url=list’>
리다이렉트
작업 결과를 출력하지 않고 즉시 다른 페이지로이동하는 것.
- 리다이렉트 메소드 sendRedirect()
응답코드가 200이 아닌 302 (요청한 자원이 다른 URL로 이동되었으니 Location헤더에 있는 주소로 다시 요청하라) 리다이렉트할 페이지 URL이 Location헤더에 있음
웹 브라우저가 이런 응답을 받으면 즉시 Location헤더의 주소로 다시 요청함. 이런 이유로 sendRedirect()할때는 HTML 출력 코드를 작성할 필요가 없음.
—> 작업 결과를 출력하지 않고 즉시 다른 페이지로 이동하기를 원한다면 리다이렉트 사용 —> 작업 결과를 잠깐이나마 출력하고 다른 페이지로 이동하기를 원한다면 리프레쉬 사용 —> 둘의 가장 큰 차이점은 본문을 보내냐 마느냐
서블릿 초기화 매개변수
–> 서블릿을 생성하고 초기화할 때, 즉 init()을 호출할 때 서블릿 컨테이너가 전달하는 데이터. -—> 보통 데이터베이스 연결정보와 같은 정적인 데이터를 서블릿에 전달할 때 사용. web.xml이나 @WebServlet 어노테이션으로 서블릿 초기화 매개변수를 설정할 수 있음.
web.xml
1
2
3
4
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
@WebServlet
1
2
3
4
5
6
7
@WebServlet(
urlPatterns = {/votree/{votreeId},
initParams ={
@WebInitParam(name = “driver”, value =“com.mysql.jdbc.Driver”);,
@WebInitParam(name=“url”, value=“adbc:mysql://localhost:/studydb);
}
)
class.forName(/* 파라미터 : 클래스 */)은 인자값으로 클래스 이름을 넘기면 해당 클래스를 찾아 로딩 함. JDBC 드라이버 로딩할 때 사용.
컨텍스트 초기화 매개변수
서블릿 초기화 매개변수는 말 그대로 그 매개변수가 선언된 서블릿에서만 사용될 수 있음 따라서 JDBC 드라이버와 데이터베이스 연결 정보에 대한 초기화 매개변수를 각 서블릿마다 별도로 설정해주어야 해. 그러나 여러 서블릿이 사용하는 JDBC 드라이버와 DB연결정보가가 같다면, 각각의 서블릿마다 초기화 매개변수를 선언하는 것은 낭비. 이런 경우 컨텍스트 초기화 매개변수를 사용
web.xml
1
2
3
4
5
6
7
8
<context-param>
<param-name>driver</param-name>
<param-value> com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value> jdbc:mysql://localsdfmaklsf</param-value>
</context-param>
—> HttpServlet으로 부터 받은 getServletcontext()를 호출해서 ServletContext 객체를 준비 해. 이 객체를 통해 web.xml에 선언된 컨텍스트 초기화 매개변수값을 얻을 수 있음.
1
2
3
ServletContext sc = this.getServletContext();
sc.getInitParameter(“url”)
sc.getInitParameter(“driver”)
필터
서블릿 실행 전후에 어떤 작업을 하고자 할 때 사용하는 기술 예를 들면, 클라이언트가 보낸 데이터의 암호를 해제한다거나,서블릿이 실행되기 전에 필요한 자원을 미리 준비한다거나, 서블릿이 실행될 때마다 로그를 남긴다거나 할 때 필터롤 틍호 처리.
ex)
- 클라이언트가 보낸 데이터의 문자집합을 설정
- 압축 데이터 풀기
- 암호화된 데이터를 원래 데이터로 복원하기
- 로그 남기기
- 사용자 검증하기
- 사용권한 확인하기
implements Filter
init() : 서블릿의 init()과 같은 용도. 딱 한번만 실행 됨. doFilter() : 필터와 연결된 URL에 대해 요청이 들어오면 항상 호출 됨 FilterChain을 매개변수로하여 필터를 연쇄적으로 만들 수 있음. FilterChain nextFilter nextFilter.doFilter()
destory() : 서블릿 컨테이너는 웹 앱 종료 전에 필터들에 destroy()를 호출하여 마무리 작업을 할 수 있는 기회를 줌.
web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping
<filter>
<filter-name> CharacterEncodingFilter </filter-name>
<filter-class> spms.filters.CharacterEncodingFilter </filter-class>
<init-param> // 서블릿 초기화 매개변수와 같음. 필터를 사용할 정적인 데이터를 정의 함. 이 필터는 매개변수 값을 사용하여 요청 메시지 인코딩 설정.
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
DB 연결정보와 같은 몇몇 설정 정보는 서버에 웹 앱을 배치한 후에도 언제든지 변경할 수 있어야 함. 그런데 이런 정보를 소스코드에 넣는다면 설정정보가 바뀔때마다 매번 소스코드를 변경해야하므로 유지보수가 어려움. 이러한 점을 해결하기 위해 서블릿 초기화 매개변수와 컨텍스트 초기화 매개변수를 사용해야 함.
서블릿을 실행하기 전이나 후에 특별한 작업을 수행하려면 필터를 사용해야 함.