11월 28일 - 수업 26일차 (JSP)

수아레스·2022년 11월 28일
post-thumbnail

1. 아래의 쿼리를 완성하시오.

--사원테이블(DEPT)에서 급여 (SAL)가 3000 이상인 사원을 출력하는 쿼리문
👉 select * from dept where sal >= 3000;

--부서 번호(DEPTNO)가 20인 사원에 관한 정보만 출력
👉 select * from emp where deptno = 20;

--이름(ENAME)이 FORD인 사람의 사번(empno), 이름(ename), 급여(SAL)를 출력하는 쿼리문
👉 select empno, ename, sal from emp where ename = 'FORD';

--1982년 1월 1일 이후에 입사한 사원을 출력하는 쿼리문
👉 select * from emp where hiredate >= '1982-01-01';

--부서번호가 10번이고 job 이 매니져인 사람을 출력
👉 select * from emp where deptno = 10 and job = 'MANAGER';

--부서번호가 10번 이거나(또는) job 이 매니져인 사람을 출력
👉 select * from emp where deptno = 10 or job = 'MANAGER';

--부서번호가 10번 부서가 아닌 사원
👉 select * from emp where deptno != 10;

--급여가 2000~3000 사이의 사원을 검색하는 쿼리문
👉 select * from emp where sal between 2000 and 3000;

--급여가 2000 미만이거나 3000 초과인 사원을 검색하는 쿼리문
👉 select * from emp where sal not between 2000 and 3000;

--1980년에 입사한 사원을 출력하는 쿼리문
👉 select * from emp where hiredate between '1980-01-01' and '1980-12-31';

--커미션(COMM)이 300 혹은 500 혹은 1400인 사원이 있는지 검색하는 쿼리문
👉 select * from emp where comm in(300, 500, 1400);

--커미션(COMM)이 300 혹은 500 혹은 1400이 아닌 사원이 있는지 검색하는 쿼리문
👉 select * from emp where comm not in(300, 500, 1400);

--이름이 F로 시작하는 사람을 찾는 쿼리문
👉 select * from emp where ename like 'F%';

--위치 상관 없이 이름 중에 A가 들어있는 사람을 찾는 쿼리문
👉 select * from emp where ename like '%A%';

--이름이 N으로 끝나는 사람을 찾는 쿼리문
👉 select * from emp where ename like '%N';

--이름의 두 번째 글자가 A인 사원을 찾는 쿼리문
👉 select * from emp where ename like '_A%';

--이름의 세 번째 글자가 A인 사원을 찾는 쿼리문
👉 select * from emp where ename like '__A%';

2. RDBMS의 종류는?

RDBMS란?
Relational DataBase Management System 의 약자
(관계형 모델을 기반으로 하는 DBMS 유형)

관계형(Relational)이란 정보를 저장하는 테이블들이 서로 연관되어 있음을 뜻한다. 관계형 데이터베이스는 여러 키값들을 사용해 연관된 정보들을 함께 조회하는데 특화되어 있다.


  1. ORACLE (오라클)
  • 객체관계형 데이터베이스 (Object-relational database; ORD, ORDB) 를 지원
  • 개발자가 스스로 데이터형과 메서드를 자유롭게 정의하여 데이터베이스를 개발할 수 있는 관리 시스템
  1. PostgreSQL (포스트-그레스-큐엘)
  • 오픈소스 DBMS (여러 개발자들과 연구자들이 함께 모여 만든 공개된 소프트웨어)
  • ORDBMS (객체-관계형 데이터베이스 시스템)
  1. MySQL
  • 오픈 소스이며 무료로 사용 가능
  • 현재 Oracle에 합병
  1. SQL Server (MS-SQL)Permalink
    마이크로소프트에서 개발한 SQL Server
  • 신뢰성, 생산성, 지능적 DBMS
  • 모든 데이터 형식에 대한 분석
  • 원하는 언어와 플랫폼을 탄력적으로 사용할 수 있음
  • 높은 보안성 수준을 보여줌
  1. SQLite (에스큐엘-라이트)Permalink
    임베디드에 사용될 목적으로 개발된 RDBMS
  • 세탁기, 자동차, 스마트폰 등 적은 메모리 상에서 DBMS를 구현하는데 사용

3. 쿠키란 무엇인가요?

클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법

  • 세션과 달리 상태 정보를 웹 서버가 아닌 클라이언트에 저장한다.
  • 클라이언트의 정보를 웹 브라우저에 저장하므로 이후에 웹 서버로 전송되는 요청에는 쿠키가 가지고 있는 정보가 포함된다.
  • 클라이언트의 일정 폴더에 정보를 저장하기 때문에 웹 서버의 부하를 줄일 수 있다.
  • 웹 브라우저가 접속했던 웹 사이트에 관한 정보와 개인 정보가 기록되기 때문에 보안에 문제가 있다.

🍪 쿠키 생성

Cookie() 메소드 사용

Cookie Cookie(String name, String value)

name은 쿠키를 식별하기 위한 이름, value는 쿠키 값

Cookie cookie = new Cookie("memberId", "admin");
response.addCookie(cookie);
  1. 쿠키 정보를 담고 있는 Cookie 클래스의 생성자 Cookie()를 통해 쿠키 객체를 생성한다. (String name, String value)
  2. response 내장 객체의 addCookie() 메소드를 사용하여 쿠키 객체를 설정한다. addCookie() 메소드는 웹 브라우저에 쿠키 정보를 추가로 전송한다.

🍪 쿠키 객체

getCookies() 메소드 사용 - 쿠키 객체가 여러개일 때는 배열 형태로 가져온다.

Cookie[] cookies = request.getCookies();

for(int i=0; i<cookies.length; i++){
	out.println(cookies[i].getName + ":" + cookies[i].getValue() 
    + "<br>";

request 내장 객체의 getCookies() 메소드로 쿠키 객체를 읽어온 후 해당 쿠키 객체의 개수만큼 쿠키 이름과 값을 출력한다.

🍪 쿠키 삭제

Cookie 클래스는 쿠키를 삭제하는 기능을 별도로 제공하지 않으며, 쿠키를 더 유지할 필요가 없으면 쿠키의 유효 기간을 만료하면 된다.
-> 쿠키의 유효 기간을 결정하는 setMaxAge() 메소드에 유효 기간을 0으로 설정하여 쿠키를 삭제한다.

void setMaxAge (int age)

setMaxAge() 메소드 사용 예

Cookie cookie = new Cookie("memberId", "admin");
cookie.setMaxAge(0);
response.addCookie(cookie);
<body>
	<%
    	Cookie[] cookies = request.getCookies();
    	// 쿠키 정보를 얻어오도록 request 내장 객체의 getCookies() 
        메소드 작성
        
        for(int i=0; i<cookies.length; i++){
        	cookies[i].setMaxAge(0);
            response.addCookie(cookies[i]); 
            	// 생성된 Cookie 객체를 쿠키로 저장
                // -> response의 addCookie() 메소드 작성
       }
      	response.sendRedirect("cookie02.jsp");      
    %>
</body>

4. 세션이란 무엇인가요?

클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법

사용자 인증을 통해 특정 페이지를 사용할 수 있도록 권한 상태를 유지하는 것

  • 웹 서버에서만 접근이 가능하므로 보안 유지에 유리하며 데이터를 저장하는 데 한계가 없다.
  • 오직 웹 서버에 존재하는 객체로 웹 브라우저마다 하나씩 존재하므로 웹 서버의 서비스를 제공받는 사용자를 구분하는 단위가 된다.
  • 웹 브라우저를 닫기 전까지 웹 페이지를 이동하더라도 사용자의 정보가 웹 서버에 보관되어 있어 사용자 정보를 잃지 않는다.
    (예: 로그인 후 다른 웹 페이지에 갔다가 되돌아와도 로그인 상태가 유지되므로 회원 전용 페이지를 계속 사용할 수 있다.)

🍅 세션 생성

void setAttribute(String name, Object value)

setAttribute() 메소드를 이용하여 세션의 속성을 설정하면 계속 세션 상태를 유지할 수 있다.

첫번째 매개변수 name: 세션으로 사용할 세션 속성 이름
두번째 매개변수 value: 세션의 속성 값 -> Object 객체 타입만 가능
(int, double, char 등의 기본 타입은 사용할 수 없다. 사용하려면 형변환 해줘야함.)

<body>
	<%
    	String user_id = request.getParameter("id");
        String user_pw = request.getParameter("passwd");
        
        if(user_id.equals("admin") && user_pw.equals("1234")){
        	session.setAttribute("userID", user_id);
            session.setAttribute("userPW", user_pw);
            
    		out.println("세션 설정이 성공했습니다.<br>");
            out.println(user_id + "님 환영합니다.");
    		} else {
            	out.println("세션 설정이 실패했습니다.");
            }
    %>
</body>

🍅 세션 정보

🍳 단일 세션 정보 얻기

Object getAttribute(String name)

String id = (String)session.getAttribute("memberId");

getAttribute() 메소드는 반환 유형이 Object형이므로, 세션 속성 이름 memberId 값이 String 형의 admin이라면 cast 연산자인 (String)을 사용하여 형변환을 해준다.

세션에 memberId라는 속성 이름이 저장되어 있지 않으면 null을 반환한다.

String user_id = (String) session.getAttribute("userID");
String user_pw = (String) session.getAttribute("userPW");

out.println("설정된 세션의 속성 값[1]: " + user_id + "<br>");
out.println("설정된 세션의 속성 값[2]: " + user_pw);

세션에 저장된 세션 속성 이름 userID, userPW의 속성 값을 가져오도록 session 내장 객체의 getAttribute() 메소드를 작성한다.


🍳 다중 세션 정보 얻기

Enumeration getAttributeNames();

<%@ page import="java.util.Enumeration"%>

String name;
String value;

Enumeration en = session.getAttributeNames();
int i = 0;

while(en.hasMoreElements()){
	i++;
    name = en.nextElements().toString();
    value = session.getAttribute(name).toString();
    
    out.println("설정된 세션의 속성 이름 [" + i + "]:" + name + 
    "<br>");
   	out.println("설정된 세션의 속성 이름 [" + i + "]:" + value); 
  1. 세션에 저장된 모든 세션 속성 이름을 가져오도록 session 내장 객체의 getAttributeNames() 메소드를 작성한다.
  2. Enumeration 객체의 hasMoreElements() 메소드를 통해 저장된 세션 속성 이름이 있을 때까지 반복하도록 while문을 작성한다.
  3. 세션 속성 이름(name)을 가져오도록 Enumeration 객체의 nextElement() 메소드를 작성한다.
  4. 세션 속성 이름의 속성 값(value)를 가져오도록 session 내장 객체의 getAttribute() 메소드를 작성한다.

getAttributeNames() 메서드: 세션에 저장된 여러개의 세션 속성 이름에 대한 속성 값을 얻어옴.

반환 유형이 Enumeration 객체 타입이므로 모든 세션 정보를 얻어오는데 유용하다.

🍅 세션 삭제

🍳 단일 섹션 삭제

void removeAttribute(String name)

<%
String name;
String value;

Enumeration en = session.getAttributeNames();
int i = 0;

while(en.hasMoreElements()){
	i++;
    name = en.nextElements().toString();
    value = session.getAttribute(name).toString();
    
    out.println("설정된 세션의 속성 이름 [" + i + "]:" + name + 
    "<br>");
   	out.println("설정된 세션의 속성 이름 [" + i + "]:" + value); 
    
    
    
    session.removeAttribute("userID");
%> 

세션을 삭제한 후

<%
	en = session.getAttributeNames();
    
    i = 0;
    while(en.hasMoreElements()){
    	i++;
        
        name = en.nextElement().toString();
        value = session.getAttribute(name).toString();
		
    out.println("설정된 세션의 속성 이름 [" + i + "]:" + name + "<br>");
   	out.println("설정된 세션의 속성 이름 [" + i + "]:" + value);
    }
    %>
    
  1. 세션에 저장된 모든 세션 속성 이름을 가져오도록 session 내장 객체의 getAttributeNames() 메소드를 작성한다.
  2. Enumeration 객체의 hasMoreElements() 메소드를 통해 저장된 세션 속성 이름이 있을 때까지 반복하도록 while 문을 작성한다.
  3. 세션 속성 이름을 가져오도록 Enumeration 객체의 nextElement() 메소드를 작성한다.
  4. 세션 속성 이름의 속성 값을 가져오도록 session 내장 객체의 getAttribute() 메소드를 작성한다.
  5. Enumeration 객체의 hasMoreElements() 메소드를 통해 저장된 세션 속성 이름이 있을 때까지 반복하도록 while 문을 작성한다.

🍳 다중 섹션 삭제

void invalidate()

<%
String name;
String value;

Enumeration en = session.getAttributeNames();
int i = 0;

while(en.hasMoreElements()){
	i++;
    name = en.nextElements().toString();
    value = session.getAttribute(name).toString();
    
    out.println("설정된 세션의 속성 이름 [" + i + "]:" + name + 
    "<br>");
   	out.println("설정된 세션의 속성 이름 [" + i + "]:" + value); 
    
    
    
    session.invalidate();
%> 

세션을 삭제한 후

<%
	if(request.isRequestedSessionInValid() == true) {
    	out.print("세션이 유효합니다.");
        }else{
        	out.print("세션이 유효하지 않습니다.");
           }
%>
  1. 요청에 포함된 클라이언트의 세션이 유효하면 유효한 메시지를 출력하고, 그렇지 않으면 유효하지 않은 메시지를 출력하도록 작성한다.
  2. 세션에 저장된 모든 세션 속성을 삭제하도록 session 내장 객체의 invalidate() 메소드를 작성한다.

🍅 세션 유효 시간 설정

세션 유효 시간이란?

세션을 유지하기 위한 세션의 일정 시간

void setMaxInactiveInterval(int interval)

  • 세션 유효 시간(interval)은 기본 값이 1800초이고 초 단위로 설정한다.
  • 세션 유효 시간을 0이나 음수로 설정하면 유효 시간이 없는 상태가 된다.
  • 이 경우 세션을 삭제했을 때 session.invalidate() 메소드를 호출하지 않으면 생성된 세션 속성이 웹 서버에서 제거되지 않고 유지된다.
  • 즉, 세션 유효 시간이 없는 상태에서 session.invalidate() 메소드를 명시적으로 실행하지 않으면 한 번 생성된 세션이 계속 메모리에 남아 있고, 시간이 흐르면 이 세션 때문에 메모리 부족 현상이 발생한다.

세션 유효 시간을 360초로 설정

session.setMaxInactiveInterval(60*60);

세션 유효 시간 변경 전

<%
	int time = session.getMaxInactiveInterval() / 60;
    out.println("세션 유효 시간: " + time + "분<br>";
%>

세션 유효 시간 변경 후

<%
	session.setMaxInactiveInterval(60*60);
    time = session.getMaxInactiveInterval() / 60;
    
    out.println("세션 유효 시간: " + time + "분<br>";
%>
  1. 세션에 설정된 유효 시간을 가져오도록 session 내장 객체의 getMaxInactiveInterval() 메소드를 작성하고, 유효 시간을 출력하도록 작성한다.
  2. 세션 유효 시간을 60*60초로 설정하도록 session 내장 객체의 setMaxInactiveInterval() 메소드를 작성한다.
  3. 세션에 설정된 유효 시간을 가져오도록 session 내장 객체의 getMaxInactiveInterval() 메소드를 작성하고, 유효 시간을 출력하도록 작성한다.

cookie_set.jsp파일을 생성하여 아래와 같이 코딩한다.

cookie_set.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%						 // String name, String value
	Cookie cookie = new Cookie("CookieN","CookieV"); 
	cookie.setMaxAge(60*60);
	
	response.addCookie(cookie);
    // response 내장 객체의 addCookie() 메소드를 사용하여 쿠키 객체를 설정
    // addCookie() 메소드는 웹 브라우저에 쿠키 정보를 추가로 전송한다.
%>

<a href="cookie_get.jsp">cookie get</a>
	
</body>
</html>

=============================================================================
cookie_get.jsp
  <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		Cookie[] cookies = request.getCookies();
// request 내장 객체의 getCookies() 메소드로 쿠키 객체를 배열 형태로 가져옴
    
		for(int i =0; i<cookies.length; i++){
			String str = cookies[i].getName();
			
			if(str.equals("cookieN")){
				out.println("cookies[" + i + "] name : " + cookies[i].getName() + "<br />");
				out.println("cookies[" + i + "] value : " + cookies[i].getValue() + "<br />");
				out.println("==================================<br />");
			}
		}
	%>
  
</body>
</html>
  

6. 아래의 session_set.jsp 파일에 대하여 session get을 클릭하면 모든 세션 값을 출력하는 session_get.jsp를 만드시오.

session_set.jsp파일을 생성하여 아래와 같이 코딩한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	session.setAttribute("sessionName","sessionValue");
	session.setAttribute("myNum",12345);
    				// String name, Object Value
%>

<a href="session_get.jsp">session get</a>
	
</body>
</html>

------------------------------------------------------------------------
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
		//다중 세션 정보 얻기
	   Enumeration enu = session.getAttributeNames();
	   
	   int i = 0;
	   while(enu.hasMoreElements()) {
	      
	      i++;
	      
	      String sName = enu.nextElement().toString();
	      String sValue = (String)session.getAttribute(sName).toString();
	// 세션 속성값은 Object 객체 타입만 가능하므로 형변환 필수!
    
	      out.println("sName : " + sName + "<br />");
	      out.println("sValue : " + sValue + "<br />");      
	   }
	   
	   out.println("************************ <br />");
	   
	   session.removeAttribute("sessionName");
	   
	   Enumeration enu1 = session.getAttributeNames();
	   
	   i = 0;
	   while(enu1.hasMoreElements()) {
	      
	      i++;
	      
	      String sName = enu1.nextElement().toString();
	      String sValue = (String)session.getAttribute(sName).toString();
	      
	      out.println("sName : " + sName + "<br />");
	      out.println("sValue : " + sValue + "<br />");      
	   }
	   
	   session.invalidate(); //섹션에 있는 것 전부 다 날림
	%>

</body>
</html>
profile
띵호와

0개의 댓글