Skip to main content

· 2 min read
  1. EL
  • Expression Language란, 표현식 또는 액션 태그를 대신해서 값을 표현하는 언어
  • <%= value %> 표현식, ${value} EL
  • ${안에서 연산자 사용 가능}
${1+2 } <br/> -> <%= 1+2 %>
${1-2 } <br/>
${1*2 } <br/>
${1/2 } <br/>
${1 <2 } <br/>
${ 1 >2 } <br/>
${(1>2)?1:2 } <br/>
  1. 액션태그로 사용되는 EL
<jsp:getProperty name="member" property="name"/>
${member.name}
  1. 내장객체
  • pageScope: page객체를 참조하는 객체
  • requestScope: request 객체를 참조하는 객체
  • sessionScope: session 객체를 참조하는 객체
  • applicationScope: application 객체를 참조하는 객체
  • param: 요청 파라미터를 참조하는 객체
  • paramValues: 요청 파라미터(배열)을 참조하는 객체
  • initParam: 초기화 파라미터를 참조하는 객체
  • cookie: cookie 객체를 참조하는 객체
    <%
String id = request.getParameter("id");
String pw = request.getParameter("pw");
%>

아이디 : <%=id %> <br/>
비밀번호 : <%=pw %> <br/>

<hr/>

아이디: ${param.id } <br/>
비민번호: ${param.pw } <br/>
아이디 : ${param["id"] } <br/>
비밀번호 : ${param["pw"] } <br/>


<hr/>

applicationScope : ${applicationScope.application_name } <br/>
sessionScope : ${sessionScope.session_name } <br/>
pageScope : ${pageScope.page_name } <br/>
requestScope : ${requestScope.request_name } <br/>

<hr/>

context 초기화 파라미터 <br/>
${initParam.con_name } <br/>
${initParam.con_id } <br/>
${initParam.con_pw } <br/>

· One min read
  1. 파일 업로드 프로그래밍
  • www.servlets.com 에서 COS library 다운받아 WebContent/WEB-INF/lib 에 넣어줌.
<form action="fileFormOk.jsp" method="post" enctype="multipart/form-data">
파일 : <input type="file" name="file"> <br/>
<input type="submit" value="File Upload">
</form>
  • enctype속성 multipart/form-data 넣어야 서버로 파일 전송 가능
<%
String path = request.getRealPath("fileFolder"); // path to save files

int size = 1024 * 1024 * 10; // 10M
String file = "";
String oriFile = "";

try{
MultipartRequest multi = new MultipartRequest(request, path, size, "EUC-KR", new DefaultFileRenamePolicy()); //DefaultFileRenamePolicy 동일 이름 있을 때 뒤에 숫자 추가 해주는 정책.

Enumeration files = multi.getFileNames();
String str = (String) files.nextElement();

file = multi.getFilesystemName(str);
oriFile = multi.getOriginalFileName(str); //실제 파일 이름
} catch(Exception ex){
ex.printStackTrace();
}
%>
  • 실제 파일일 저장되는 경로는 tomcat folder/stpwebapps/projectname/fileFolder

· 10 min read
  1. 수에즈 운하 파나마 운하
  • 이집트
  • 파나마
  1. 죄수의 딜레마
  • 개인의 최선의 선택의 합이 사회의 최선의 선택과 같지 않다.
  • 1980 로버트 액설로드
    • 컴퓨터를 이용한 모의 경진대회
    • N번 반복 시 최고의 점수를 획득하는 프로그램이 우승
    • 협력의 진화
    • tit for tat
      • 상대가 치면(tit) 나도 친다.(tat)
        • 1번째는 협력 (3,3)
        • 2번째부터는 배반 (5,0)
        • 서로 배반(1,1)
        • n번째에 협력 시도하면 사회적 최선의 선택 가능 (응징 후 용서) (0,5)
        • 상대가 오해하지 않도록 신뢰 관계 유지 (3,3)
        • 1:1에서는 무조건 배반이 유리
        • Golden bals (사람 현실판)
  1. 암호화폐 거래대금 1년새 10배 증가
  • 1월 업비트 18조 빗썸 12조

  • 하루 거래량이 8조

  • 5대 거래소 한달 거래량 331조

  • 코스피 한달 거래대금 300조

  • 암호화폐 > 코스피

  • 암호화폐 거래소 수수료는 !?

    • 0.05% ~ 0.25%
    • 한 거래소 당 한달 수수료 1000억 1년 1조 예상
    • 증권사 한 곳 연간 순이익 1000억원
    • 업비트 1위(두나무) 카카오가 22% 이상 보유 추정
    • 두나무 상장 나스닥 상장 가능성
    • 미국 최대 가상화폐 거래소 코인베이스 다음달 나스닥 상장 (50조 예상 -> 100조 예상)
      • 작년 영업이익 300억
    • 빗썸
      • BK컨소시엄이 인수하려다가 포기
      • 개인이 65%
      • 넥슨이 빗썸인수 5000억 시도 -> 가격 올라서 포기
      • 네이버가 빗썸 인수 설
  • 과거 주식 매매 방법

    • 수작업 격탁 매매(딱딱이) -> 포스트 매매로 변경(제출한 호가표를 순차적으로 처리) -> 1978년 박황 부장 사건(1970년 판 리딩방) -> 한국증권전산 설립(KOSCOM) -> 1997년 전산매매 -> 1999년 온라인 증권사 등장 -> 주식 수수료 0.015%로 인하
  1. 군경 무차별 총격 91명 사망
  • 03.27 미얀마 군의날 -> 미얀마 저항의 날
  • 미얀마 국부
    • 아웅 산 장군
    • 아웅 산 수지 아버지
    • 영국과 일본에 맞서 미얀마의 독립 운동
    • 1945년 3월 임시정부
    • 회의 중 7인의 장관 암살
    • 마다구치 렌야
      • 중일 전쟁 단초
      • 일본 육군 최악의 전투 임팔 전쟁 지휘
      • 미얀마에서 인도를 넘어 영국 공격 시도
      • 해발 2000m 고산지대 넘으려고 시도
      • 징기스칸 전략 (보급품 현지 조달)
      • 7만명 -> 1만명 (아사)
    • 네윈
      • 1962년 군 쿠데타
      • 1988년 8월 8일 항쟁 발생
      • 3000명 이상 사망
      • 반정부 민주화 시위
      • 1989년 물러남
    • 아웅산 수지
      • 1990년 자유 총선 실시
      • 압승
    • 신군부 쿠데타
      • 자유 총선 무효
      • 1991년 노벨 평화상 수상
      • 군부의 지배 25년간 지속
      • 2015년 자유 총선 실시해 문민정부 압승
      • 2021년 2월 군부 쿠데타
      • 미얀마 군 통수권자는 대통령이 아닌 군이 뽑는 최고사령관
      • 사실상 2인 체제
      • 전체 의석의 25% 군부가 지명
      • 문민 정부가 군부 의석 축소(15년 걸쳐) 개헌안 시도 하여 쿠데타 발생
  1. 중국, 미 영 EU 등 서벙에 '전쟁 예고' 수준의 경고
  • 화춘잉 외교부 대변인 신장 문제 조작 말라
  • 사전에 알리지 않았다고 말하지 말라 ( 중국- 인도 전쟁에서 중국이 했던 말 )
  • 위구르 인권 겨냥 EU, 미국 중국 제재 예고
  • 바이든 동맹과 함께하는 포위망 전략
  • 중국 영에 보복 제재 실시
  • H&M 나이키(중국 면화 사용 금지 노동 착취 문제) 불매 운동 실시
  • 바이든 '내 임기 중 중국이 가장 힘 센 국가 되는 일 없을 것'
  • 미 남중국해 200척 배 (필리핀 영해 분쟁) 철수 요청
  • 머스크의 중국 띄우기 중 미래는 위대할 것
    • 중 '테슬라 금지령' '국가안보 우려'
    • 중국 테슬라 면담(웨탄) -> 마윈 웨탄 이후 사라짐
  • 바이든 일대일로 대신 할 동맹 연합 구성
  • 중국 이란과 협력
  • 미 증시 중국 21조원 주식 블록딜 (차이나 리스크 부각)
  1. 인텔 파운드리 진출 선언 22조 투자
  • 애리조나 주 파운드리 공장 2곳
  • TSMC, 삼성 중 어디냐? 기대였는데 갑자기 깜짝 진출 선언
  • 반도체 생산
    • 애플과 결별
    • 헤지펀드 -> 생산 하지말라
  • 인텔의 구원투수 펫 겔싱어 CEO
    • 7nm 공정 해결
    • TSMC 삼성 5nm 4nm 공정
    • ASML(네덜란드) 협력 수혜
    • TSMC 뒤통수 하락
    • PC(AMD에 밀림), MOBILE(퀄컴에 밀림), SERVER(고객들 자체 제작)
  • AMD 는 2011년 반도체 생산 포기
    • 분사 글로벌 파운드리
  • 파운드리 최대 고객
    • MS 구글 애플 퀄컴, 엔비디아
    • 대형 고객 거래 힘듬
    • 기술 부족, 자금 부족, 대형 구매자들과의 관계
    • 아시아가 쥐고 있는 반도체 패권 미국과 유렵이 가져가야 할 떄라고 주장
    • 바이든 반도체는 21세기 편자의 못 미국이 더 만들어야 한다.
    • 미국 상무부 환영, 미국 기업과 긴밀이 협력
    • 바이든 반도체 등 공급망 점검 (공격적 인센티브 예상, 미 정부 고객 압박 가능성?)
  • EU
    • 독자 반도체 생산 라인
    • 인텔 유럽에 파운드리 공장 지을 것
    • 이미 아일랜드에 공장
    • ASML과 협력
  • 일본
    • 반도체 산업전략 회의 발표
    • 35년전 미-일 반도체 전쟁
      • 인텔 D램 사업 포기
      • 1985년 9월 플라자 합의
      • 1986년 미일 반도체 협정 서명
  1. 한국남자 40대 사망률 세계 1등(1993년 뉴스)
  • 1위 암 (담배) 2위 간암 간질환 (술) 3위 교통사고 (위험한 주행)
  • 현재 한국 세계 장수 3위
  • 남녀 수명 차이 가장 큰 국가 1위 러시아 남자 기대수명 65세 여자 76세, 11년 차이
  • 남녀 수명 차이 가장 작은 국가 1위 이슬람 문화권 (남자 스트레스 적고, 여성 스트레스 많고)
  • 한국 기대여명 차이 -> 간질환, 폐질환 등으로 조기사망 -> 술, 담배, 마시고 죽는 회식 문화
  • 고혈압, 순환기계, 주 5일제, 40시간 제도, 문화변화 -> 남녀 기대여명 차이 줄고있음
  • 미국 백인 사망률 유지 및 증가 -> 약물중독, 폐암, 자살, 음주 -> 절망의 죽음
  • 앵거스 디턴(노벨경제학상) Deaths of despair책
    • 기대수명은 올라가는데 미국 저학력 백인 중년 남자 사망률은 러시아 수준
    • 미국 고학력자 변화 없는데 저학력자 심각하기 증가
    • 원인, 누적된 박탈감-> 저임금, 일자리 -> 결혼과 가족 구성, 자녀 양육에 영향 -> 부모 세대에 비해 삶이 악화되었다고 느낌 -> 좌절 -> 자살, 음주, 약물 -> 사망 증가
    • 사회적 지위 상승의 계단 박탈 -> 좌절감
    • 트럼프 Make America great again(MAGA)
  • 영국
    • 북동쪽에서는 빈번하게 절망의 죽음 발생
  • 한국
    • 지역적 차이 서울은 자살률 적은데 지방은 자살률 증가
    • 30, 70, 80대 자살률 세계 1위
    • 2018년 기준 40~50대에 자살률 절대값이 높음 (남성 여성에 비해 3배 이상 높음)
    • 자살 이유: 경제적 어려움
    • 따라갈 수 없는 격차 -> 베팅 -> 코인

· 5 min read
  1. DAO, DTO
  • DAO
    • Data Access Object
    • 데이터 베이스에 접속해서 데이터 추가, 삭제, 수정 등의 작업을 하는 클래스
    • 일반적인 JSP 혹은 Servlet 페이지내에 위에 로직을 함께 기술할 수 도 있음
    • 유지보수 및 코드의 모듈화를 위해 별도의 DAO 클래스를 만들어 사용.
    • DataBase 설정에 관련된 셋팅 및 DTO객체에 Database에서 가져온 데이터 넣어주는 해주는 작업
    • package daodto;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class MemberDAO {

private String url = "jdbc:oracle:thin:@localhost:1521:xe";
private String uid = "c##davidyoon";
private String upw = "DBPASS";

public MemberDAO() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch(Exception e) {
e.printStackTrace();
}
}


public ArrayList<MemberDTO> memberSelect() {
ArrayList<MemberDTO> dtos = new ArrayList<MemberDTO>();

Connection connection = null;
Statement stmt = null;
ResultSet resultSet = null;

try {
connection = DriverManager.getConnection(url, uid, upw);
stmt = connection.createStatement();
resultSet = stmt.executeQuery("select * from member");

while(resultSet.next()) {
String name = resultSet.getString("name");
String id = resultSet.getString("id");
String pw = resultSet.getString("pw");
String phone1 = resultSet.getString("phone1");
String phone2 = resultSet.getString("phone2");
String phone3 = resultSet.getString("phone3");
String gender = resultSet.getString("gender");

MemberDTO dto = new MemberDTO(name, id, pw, phone1, phone2, phone3, gender);

dtos.add(dto);
}

}catch(Exception e) {
e.printStackTrace();
}

return dtos;

}
}
  • DTO
    • Data Tranfer Object
    • DAO클래스를 이용하여 데이터 베이스에서 데이터를 관리할 때 데이터를 일반적인 변수에 할당하여 작업할 수도 있지만, 해당 데이터의 클래스를 만들어 사용
    • DAO라는 클래스를 만들어 데이터 베이스에서 가져온 데이터들은 넣어 get set함수로 사용.
    • package daodto;
public class MemberDTO {
private String name;
private String id;
private String pw;
private String phone1;
private String phone2;
private String phone3;
private String gender;




public MemberDTO(String name, String id, String pw, String phone1, String phone2, String phone3, String gender) {
super();
this.name = name;
this.id = id;
this.pw = pw;
this.phone1 = phone1;
this.phone2 = phone2;
this.phone3 = phone3;
this.gender = gender;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getPhone1() {
return phone1;
}
public void setPhone1(String phone1) {
this.phone1 = phone1;
}
public String getPhone2() {
return phone2;
}
public void setPhone2(String phone2) {
this.phone2 = phone2;
}
public String getPhone3() {
return phone3;
}
public void setPhone3(String phone3) {
this.phone3 = phone3;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
  • 웹브라우저 -> 서버( Servlet/JSP <-> DAO <-> DTO) -> DataBase
  1. PreparedStatement객체
  • SQL문을 실행하기 위해 Statement 객체 이용
  • Statement 객체의 경우 중복코드가 많아지는 단점
    public void memberUpdate(Member member) {
try {
connection = DriverManager.getConnection(url, uid, upw);
String query = "insert into memberforpre (id, pw, name, phone) values(?, ?, ?, ?)";
int n;
pstmt = connection.prepareStatement(query);

pstmt.setString(1, member.getId());
pstmt.setString(2, member.getPw());
pstmt.setString(3, member.getName());
pstmt.setString(4, member.getPhone());
n = pstmt.executeUpdate();

if (n == 1) {
System.out.println("insert success");
}else {
System.out.println("insert fail");
}

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(connection != null) connection.close();
if(pstmt != null) pstmt.close();
} catch (Exception e) {
// TODO: handle exception
}
}

}
  1. 커넥션 풀(DBCP)
  • 클라이언트 다수의 요청이 발생할 경우 데이터베이스에 부하 발생
  • 이 문제를 해결하기 위해 커네션 풀 사용 (DataBase Connection Pool)
  • 클라이언트가 요청전에 서버에서 미리 데이터베이스 객체를 여러개 생성하여 풀을 만들고 고객이 들어오면 해당 객체가 사용 되는 형식
  • tomcat 컨테이너가 테이터베이스 인증을 하도록 context.xml 파일에 코드 추가
    <Resource
auth="Container"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1532:xe"
username="c##davidyoon"
password="xxxx"
name="jdbc/Oracle18g"
type="javax.sql.DataSource"
maxActive="50" //풀 갯수
maxWait="1000" // 다음 풀(51번째) 만들때 대기 시간
/>

· 2 min read
  1. 데이터 베이스의 개요
  • DBMS(DataBase Management System): 데이터 베이스 관리 시스템
  • DBMS는 언어와 데이터 베이스를 연결해 주는 도구
  • RDBMS(Relational DataBase Management System)
  • application -> DBMS -> DataBase
  • Oracle DB 무료판(Express Edition)
  1. Oracle 설치
  • sqlplus: 데이터 베이스 관리를 위한 무료 툴
  • sqlplus system/system_password
  • 유저 생성
   create user c##user_id identified by user_pwd;
  • oracle ex 12c 이후 유저 아이디 앞에 c##붙여야 계정 생성가능
  • 권한 부여
    • grant connect, resource to c##davidyoon;
  1. SQL

    • 테이블 생성

      create table 테이블명(컬럼명 자료형);
      create table member(
      id varchar2(20) primary key,
      pw varchar2(20),
      name varchar2(20),
      phone varchar2(20)
      );
      • 자료형
        • number: 수치 데이터형
        • char: 고정 문자열
        • varchar2: 가변길이 문자열
    • 테이블 검색

      select \* from tab;
    • 레코드 추가

      • Insert into 테이블이름(컬럼이름, 컬럼이름, ...) values(데이터, 데이터, ...);
      • ORA-01950 : 테이블스페이스'USERS'에 대한 권한이 없습니다.
      • system으로 로그인해서 테이블 스페이스에 할당량 부여하는 권한
      • alter user 유저계정명 default tablespace users quota unlimited on users;
      • Inser into member(id, pw, name, phone) values('davidyoon','1234','jiwon','01012341234');
    • 레코드 삭제

      • delete from 데이블이름(조건)
      • delete from memeber where id='qqpo14';
    • 데이터 변경

      • update 테이블이름 set 컬럼이름=값, 컬럼이름=값 조건
      • update member set pw='0000' where id='qqpo13';
    • 테이블 삭제

      • drop table 테이블이름
      • drop table member;

· 3 min read
  1. JDBC 살펴보기
  • Java Database Connectivity
  • JAVA 프로그램에서 SQL문을 실행하여 데이터를 관리하기 위한 JAVA API
  • JDBC의 특징은 다양한 데이터 베이스에 대해서 별도의 프로그램을 만들 필요 없이, 해당 데이터 베이스의 JDBC를 이용하면 하나의 프로그램으로 데이터 베이스를 관리할 수 있다.
  1. 데이터 베이스 연결 순서
  • oracle 설치Path/product/18.0.0/dbhomeXE/jdbc/lib/ojdbc8.jar 복사
  • project/lib/ 붙여넣기
  • project java build path -> libraries -> add library -> user Library -> user Libraries -> add ojdbc8
  • tomcat lib/ 아래에도 ojdbc.jar 넣어주어야 한다.
  • JDBC 드라이버 로드 DriverManager
    • Class.forName("oracle.jdbc.driver.OracleDriver"); -> 메모리에 OracleDriver 로드
  • 데이터 베이스 연결 Connection
    • DriverManager.getConnection(JDBC URL, 계정아이디, 비밀번호); -> Connection 객체 생성
  • SQL문 실행 Statement
    • connection.createStatement(); -> Statement 객체를 통해 SQL문이 실행
  • 데이터 베이스 연결 해제 ResultSet
    • statement.executeQuery(), statement.executeUpdate() -> SQL문의 결과값을 ResultSet 객체로 받음
  1. Statement 객체 살펴보기
  • Statement(interface)
    • executeQuery() resultSet: SQL문 실행 후 여러 개의 결과값 생기는 경우 사용 ex(select)
    • executeUpdate() int: SQL문 실행 후 테이블의 내용만 변경되는 경우 사용 ex (insert, delete, update)
  • executeQuery() 실행 후 반환 되는 레코드 셋
    • executeQuery() -> ResultSet -> 로우 데이터 셋
    • ResultSet()
      • next() : 다음 레코드로 이동
      • previous(): 이전 레코드로 이동
      • first(): 처음으로 이동
      • last(): 마지막으로 이동
      • get메소드(getString, getInt)
    <%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%!
Connection connection;
Statement statement;
ResultSet resultSet;

String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String uid = "c##davidyoon";
String upw = "3302";
String query = "select * from member";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
try{
Class.forName(driver);
connection = DriverManager.getConnection(url, uid, upw);
statement = connection.createStatement();
resultSet = statement.executeQuery(query);

while(resultSet.next()){
String id = resultSet.getString("id");
String pw = resultSet.getString("pw");
String name = resultSet.getString("name");
String phone = resultSet.getString("phone");

out.println("아이디 :" + id + ", 비밀번호 : "+ pw +", 이름 :" + name + ", 전화번호 : " + phone +"<br/>");
}
}catch(Exception e) {
e.printStackTrace();
}finally{
try{
if(resultSet != null) resultSet.close();
if(statement != null) statement.close();
if(connection != null) connection.close();
} catch(Exception e) {
e.printStackTrace();
}

}

%>


</body>
</html>

· 2 min read
  1. 빈이란
  • 반복적인 작업을 효율적으로 하기 위해 빈을 사용
  • Java 언어의 데이터(속성)와 기능(메소드)으로 이루어진 클래스
  • JSP페이지를 만들고, 액션태그를 이용하여 빈을 사용
  • 빈의 내부 데이터를 처리
  1. 빈 만들기
  • 데이터 객체를 만들기 위한 클래스를 만드는 것
  • Student.java 클래스 만들고
  • .jsp에서 사용
  1. 빈 관련 액션 태그
  • useBean
    <jsp:useBean id="student" class="com.javalec.ex.Student" scope="page"/>
  • id: 빈 이름 class: 빈 패스 scope: 범위
  • Scope
    • page: 생성된 페이지 내에서만 사용 가능
    • request: 요청된 페이지 내에서만 사용 가능
    • session: 웹브라우저의 생명주기와 동일하기 사용 가능
    • application: 웹 어플리케이션 생명주기와 동이하기 사용 가능
  • setProperty
    <jsp:setProperty property="student" name="name" value="홍길동"/>
<jsp:setProperty property="student" name="age" value="13"/>
<jsp:setProperty property="student" name="grade" value="6"/>
<jsp:setProperty property="student" name="studentNum" value="7"/>
  • getProperty

    • 이름
    <jsp:getProperty property="student" name="name"/> <br/>
    • 나이
      <jsp:getProperty property="student" name="age"/> <br/>
    • 학년
      <jsp:getProperty property="student" name="grade"/> <br/>
    • 번호
      <jsp:getProperty property="student" name="studentNum"/> <br/>

· One min read
  1. 예외 페이지의 필요성
  • JSP, Servlet에서 예외 발생
  • 예외 상황에서 웹컨테이너(톰캣)에서 제공되는 기본적인 에외 페이지 보여줌
  • 사용자 예외 페이지로 설정가능
  1. page지시자를 이용한 예외 처리
 <%@ page errorPage="errorPage.jsp"%>
<%
int i = 40/0;
%>
  • errorPage.jsp
 <%@ page isErrorPage="true"%> -> true 값이어만 exceptio 관련 메소드 사용가능
<% response.setStatus(200); %>
<%= exception.getMessage() %>
  1. web.xml파일을 이용한 예외 처리
 <error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>

· 3 min read
  1. 세션이란
  • 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단
  • 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버상에 객체로 존재
  • 따라서 세션은 서버에서만 접근이 가능하여 보안이 좋고, 저장할 수 있는 데이터에 한계가 없다.
  1. 세션 문법
  • 클라이언트의 요청이 발생하면 자동생성 (컨테이너)

  • session이라는 내부 객체를 지원하여 세션의 속성을 설정

  • 클라이언트요청 -> seesion 자동 생성 -> Session 속성 설정(session 내부 객체의 메소드 이용)

  • 관련 메소드

    • setAttribute(): 세션에 데이터를 저장
    • getAttribute(): 세션에서 데이터를 얻는다
    • getAttributeNames(): 세션에 저장되어 있는 모든 데이터의 이름(유니크한 키값)을 얻는다
    • getId(): 자동 생성된 세션의 유니크한 아이디를 얻는다.
    • isNew(): 세션의 최초 생성되었는지, 이전에 생성된 세션인지를 구분
    • getMaxInactiveInterval(): 세션의 유효시간을 얻는다. 가장 최근 요청시점을 기준으로 카운트 된다.(apache-tomcat/web.xml에서 디폴트 30분으로 되어있음 변경가능)
          <session-config>
      <session-timeout>30</session-timeout>
      </session-config>
      ```
    • removeAttribute(): 세션에서 특정 데이터 제거
    • invalidate(): 세션의 모든 데이터를 삭제
  • session 초기화

        <%
    session.setAttribute("mySessionName", "mySessionData");
    session.setAttribute("myNum", 12345);
    %>
  • session get

        <%
    Object obj1 = session.getAttribute("mySessionName");
    String mySessionName = (String)obj1;
    out.println(mySessionName + "<br/>");

    Object obj2 = session.getAttribute("myNum");
    Integer myNum = (Integer)obj2;
    out.println(myNum + "<br/>");

    out.println("============================ <br/>");

    String sName;
    String sValue;
    Enumeration enumeration = ses`0xzion.getAttributeNames();

    while(enumeration.hasMoreElements()){
    sName = enumeration.nextElement().toString();
    sValue = session.getAttribute(sName).toString();

    out.println("sName: " + sName + "<br/>");
    out.println("sValue: " + sValue + "<br/>");
    }
      out.println("============================ <br/>");

String sessionID = session.getId();
out.println("sessionID : " + sessionID + "<br/>");
int sessionInter = session.getMaxInactiveInterval();
out.println("sessionInter : " + sessionInter + "<br/>");


out.println("============================ <br/>");

session.removeAttribute("mySessionName");
Enumeration enumeration2 = session.getAttributeNames();
while(enumeration2.hasMoreElements()){
sName = enumeration2.nextElement().toString();
sValue = session.getAttribute(sName).toString();

out.println("sName: " + sName + "<br/>");
out.println("sValue: " + sValue + "<br/>");
}

out.println("============================ <br/>");


session.invalidate();
if(request.isRequestedSessionIdValid()){
out.println("session valid");
}else{
out.println("session invalid");
}

%>