[ITWILL : JSP]자료구조2 : Stack클래스, Queue인터페이스, Map인터페이스

ITWILL학원 : 27강 JSP기초 BY 정규태강사

https://slidesplayer.org/slide/11290986/

1. 자료구조 : Stack 클래스

  • top에서만 데이터의 입출력 발생하기 때문.
  • LIFO 구조(FILO 구조) : 가장 먼저 들어온 데이터가 가장 마지막에 나가는 구조.
    • 데이터 입력 -> push
    • 데이터 빼내기 -> pop
  • 장점 : 특정 자료구조의 형태로 처리했을때 데이터처리가 가장 효율적이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Stack st = new Stack();

//데이터삽입
st.push("1-java");
st.push("2-jsp");
st.push("3-web");
st.push("4-db");
System.out.println(st);

//데이터 빼내기
while(! st.isEmpty()){ //스택클래스가 비어있지 않은 경우
System.out.println(st.pop()); //LIFO
}
System.out.println(st);

//출력값
[1-java, 2-jsp, 3-web, 4-db]
4-db
3-web
2-jsp
1-java
[]

출력값을 보면 데이터가 빠져나가는 순서가 LIFO이다.

2. 자료구조 : Queue 인터페이스

  • FIFO/LILO : 먼저 들어온 데이터가 먼저 처리되는 구조. 즉 입력된 순서대로 처리되는 구조
    • First Input First Output
    • Last Input Last Output
  • 스택은 클래스이지만 큐는 인터페이스이다 -> 따라서 큐는 객체생성을 할수없지만 구현을 통해서 생성가능하다
    • LinkedList 클래스 : 큐인터페이스를 구현한 클래스
    • 인터페이스는 업캐스팅이 가능할까? ㅇㅇ 가능!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Queue que = new LinkedList(); //업캐스팅(LinkedList클래스->Queue인터페이스)
//데이터입력
que.offer("1-java");
que.offer("2-jsp");
que.offer("3-web");
que.offer("4-db");
System.out.println(que);

//데이터빼내기
//peek() : Queue안에 데이터가 있는지 없는지 판단하는 메서드 -> 없으면 null리턴
while(que.peek() != null){ // 큐 안에 데이터가 있는지 없는지 판단, 없을경우 null
System.out.println(que.poll());
}

//출력값
[1-java, 2-jsp, 3-web, 4-db]
1-java
2-jsp
3-web
4-db

출력값을 보면 빠져나가는 순서가 FIFO이다.

3. 자료구조 : Map인터페이스

  • Map, table 접미어가 붙은 자료구조이다.
  • 데이터저장시 (키, 데이터)쌍으로 저장하여 사용하는 구조
  • map은 인터페이스이므로 객체생성을 할수없지만 구현을 통해서 생성가능하다
    • hashtable 클래스 : 맵인터페이스를 구현한 클래스
  • 키값을 사용해서 검색 인덱스생성 -> 데이터 검색시간이 짧음.
  • 참고링크 : 컬렉션 프레임워크 Map계열 자세히

https://lelumiere.tistory.com/3

  • 예시 : Map계열의 hashtable
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Map m = new Hashtable(); //업캐스팅

    //데이터입력
    m.put("사과", "apple");
    m.put("오렌지", "orange");
    m.put("복숭아", "peach");
    System.out.println(m);

    //데이터출력하기
    System.out.println(m.get("복숭아"));
    System.out.println(m.get("바나나"));

    //출력값
    {오렌지=orange, 사과=apple, 복숭아=peach}
    peach
    null

[ITWILL : JSP]Javabean 6 : 게시판만들기(글쓰기)

ITWILL학원 : 27강 JSP기초 BY 정규태강사

1. 웹 개발의 기초 : CRUD

https://newstars.tistory.com/436

  • 기본 로직 :

    1. 게시판 글쓰기 = 데이터입력
    2. 글 리스트 = 데이터검색
    3. 글 본문보기 = 데이터검색
    4. 글 수정 = 데이터 수정
    5. 글 삭제 = 데이터 삭제
  • 추가할 로직 :

    1. 답글쓰기 (댓글과 다른 답글기능)
    2. 파일업로드 / 썸네일

위와 같은 두 개의 로직은 요구사항분석이라고도 부른다

1-1. 개발순서

  1. 사용자 요구사항 분석
  2. 데이터 테이블 설계 = DB
    1. 테이블생성 테이블명 itwill_board
    2. 글번호 : bno
    3. 글쓴이 : name
    4. 글 비밀번호 : pw
    5. 글 제목 : subject
    6. 글 내용 : content
    7. 조회수 : readcount
    8. 답글 : re_ref, re_lev, re_seq
    9. 글쓴날짜 : date
    10. 파일 : file
      • varchar(200)를 쓰는 이유는
    11. 글쓴이의 IP주소 : ip
  3. writeForm.jsp 작성
  4. writePro.jsp 작성
  5. BoardBean.java 생성
  6. BoardDAO.java 에서 getCon() DB연결메서드 구현
  7. BoardDAO.java 에서 insertBoard() 글쓰기메서드 구현

1-2. 데이터 테이블 설계 = DB

테이블생성 테이블명 itwill_board을 생성한 뒤 아래처럼 컬럼을 작성한다.

  1. 글번호 : bno - INT NOT NULL, PRIMARY KEY (bno)
    • 글번호는 AI(Auto Increment)를 해야한다 말아야한다는 의견이 분분하다. 실습에선 AI없이 진행.
  2. 글쓴이 : name - VARCHAR(45) NOT NULL
  3. 글 비밀번호 : pw - VARCHAR(45) NOT NULL
  4. 글 제목 : subject - VARCHAR(45) NOT NULL
  5. 글 내용 : content - VARCHAR(2000) NOT NUL
  6. 조회수 : readcount - INT NULL
  7. 답글 : re_ref, re_lev, re_seq - 세 컬럼 다 INT NULL
  8. 글쓴날짜 : date - DATE NULL
  9. 파일 : file - VARCHAR(200) NULL
    • varchar(200)를 쓰는 이유는 파일은 DB가 아닌 서버에 저장되고 DB는 이름만 저장해놓기때문.
  10. 글쓴이의 IP주소 : ip - VARCHAR(45) NULL

1-3. writeForm.jsp 작성

1
2
3
4
5
6
7
8
9
10
11
12
<fieldset>
<legend>게시판 글쓰기</legend>
<form action="writePro.jsp" method="post" name="fr">
글쓴이 : <input type="text" name="name"><br>
비밀번호 : <input type="password" name="pw"><br>
제목 : <input type="text" name="subject"><br>
내용 : <br>
<textarea rows="10" cols="35" name="content" placeholder="여기에 작성해주세요"></textarea><br>
<input type="submit" value="글쓰기">
<button type="reset">초기화</button>
</form>
</fieldset>

1-4. writePro.jsp 작성

글쓰기를 처리하는 페이지이다.
입력창에서 받은 데이터를 DB로 이동시킨 뒤 사용자는 글목록페이지로 이동

  • jsp:setProperty 의 동작방식

      1. String name = request.getParameter(“bno”)
      1. bb.setbno(bno)
    • 모든 변수에 위의 1번,2번동작을 처리
  • 전달정보 확인위한 출력

    • System.out.println(bb)
    • System.out.println(bb.toString())
    • 위의 두 코드는 동일한 출력값을 가진다.
  • 로그인한사람만 글쓸수있게 처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<%//1. 한글처리
request.setCharacterEncoding("UTF-8");
%>

//6. 로그인한사람만 글쓸수있게처리
String id = (String) session.getAttribute("id");
if( id == null){
%>
<script type="text/javascript">
alert("로그인 후 이용가능합니다");
history.back();
</script>
<%
}

<!-- 2. 액션태그사용 : 전달된 정보를 저장(bno, name, pw 등등) - 자바빈객체에 저장-->
<jsp:useBean id="bb" class="com.itwillbs.board.BoardBean" />
<!-- 2-1. 파라미터 값 저장 : jsp:setProperty -->
<jsp:setProperty property="*" name="bb"/>
<%//2-2. 전달정보 확인위한 출력 : null인 값들은 별로도 추가해줘야한다.
System.out.println(bb); //bb.toString()과 동일한 동작
//2-3. IP정보를 추가
System.out.println(request.getRemoteAddr());
bb.setIp(request.getRemoteAddr());
System.out.println(bb);
//2-4. date정보

//3. 디비처리작업진행 : boardDAO객체 생성
BoardDAO bdao = new BoardDAO();

//4. 데이터처리 : BoardDAO객체 안의 메서드 중 글스기 기능을 하는 메서드 호출
bdao.insertBoard(bb);

// 5. 글목록 페이지로 이동
response.sendRedirect("boardList.jsp");

1-5. BoardBean.java 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//1번규칙만족 : 클래스는 public
public class BoardBean {
//2번규칙만족 : 멤버변수선언 private
private int bno;
private String name;
private String pw;
private String subject;
private String content;
private int readcount;
private int re_ref;
private int re_lev;
private int re_seq;
private Date date;
private String file;
private String ip;

//4번규칙만족 : 기본생성자존재하지만 생략됨
//public BoardBean(){}

//3번규칙만족 : 멤버변수마다 별도의 get/set메소드가 존재해야한다.
public int getBno() {
return bno;
}
public void setBno(int bno) {
this.bno = bno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

//(중략)

public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}

//5. toString()
@Override
public String toString() {
return "BoardBean [bno=" + bno + ", name=" + name + ", pw=" + pw + ",
subject=" + subject + ", content=" + content + ", readcount=" + readcount + ",
re_ref=" + re_ref + ", re_lev=" + re_lev + ", re_seq=" + re_seq + ",
date=" + date + ", file=" + file + ", ip=" + ip + "]";
}

1-6. BoardDAO.java 에서 getCon() DB연결메서드 구현

드라이브로드, DB연결 메서드인 getCon()구현

  • getCon() 작성순서 : 리턴값없이 진행

      1. 라이브러리설치 (WEB-INF, LIB에 추가)
      1. /META-INF/context.xml 파일생성
      1. /WEB-INF/web.xml 파일수정
      1. DAO 처리
  • 예외처리 throws 방법 : 메서드를 호출하는 시점에 예외처리를 함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class BoardDAO {
Connection con = null;
String sql = "";
PreparedStatement pstmt = null;
ResultSet rs = null;

//DB연결메서드 구현
private void getCon() throws Exception{
//Context 객체 생성
//Context인터페이스이기때문에 직접객체생성할 수 없어서 InitialContext클래스를 사용해서 객채생성
//예외처리 : throws사용하는 방법
Context init = new InitialContext(); //업캐스팅
//디비연결정보를 불러오기 ->DataSource 타입으로 저장
// 고정문구"java:comp/env/다른문구context파일의 name값입력"
DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/mysqlDB");
//ds 사용해서 연결
//멤버변수는 static이 아니기때문에 new BoardDAO();객체생성 후에 멤버변수들이 생성된다.
//그리고 getCon()메서드를 하면 멤버변수 con에 데이터(ds.getConnection();)가 담기게 된다.
//따라서 이때 return하지 않고 써도된다.
con = ds.getConnection();
System.out.println("디비연결성공 + con");
}//getCon닫음

//자원해제 메서드 구현
public void closeDB(){
try{
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}//closeDB닫음

}BoardDAO클래스닫음

1-7. BoardDAO.java 에서 insertBoard() 글쓰기 메서드 구현

insertBoard()메서드 구현

  • if(rs.next())가 끝나는 종료되는 순간은?
    • 글이 없으면 null인데 어떻게 조건문이 true가 되어 구현될수있을까?
    • rs가 faluse가 되는 시점은 EOF만나는 순간이다.
    • 즉, NULL이 있어도 진행된다.
  • getInt()사용법 두가지
    • getInt(컬럼명)사용 : num = rs.getInt(“max(bno)”)+1;
    • getInt(idx)사용 : 둘다 동일한 결과. idx사용하면 컬럼명보다 데이터 처리속도도 빠르다- /getInt => 데이터 값을 리턴, 값이 SQL-NULL경우 0리턴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//글쓰기 메서드 구현
public void insertBoard(BoardBean bb){
//글번호를 저장하는 변수 생성
int num = 0;

try {
//1. 디비연결
getCon();
//2. SQL구문작성 & pstmt
//3. 글번호계산 : 지금 있는 글 번호중 가장 큰 번호가 뭔지 확인하기만 하면 되니까
sql = "select max(bno) from itwill_board";
pstmt = con.prepareStatement(sql);
//4. 글번호계산한거 실행
rs = pstmt.executeQuery();

//5. 데이터처리(글번호 계산)
if(rs.next()){
//글이 없으면 null이 어떻게 조건문을 돌수있을까? rs가 faluse가 되는 시점은 EOF만나는 순간이다.
//즉, NULL이 있어도 진행된다.

//getInt(컬럼명)사용 : num = rs.getInt("max(bno)")+1;
//getInt(idx)사용 : 둘다 동일한 결과. idx사용하면 컬럼명보다 데이터 처리속도도 빠르다
//getInt => 데이터 값을 리턴, 값이 SQL-NULL경우 0리턴
num = rs.getInt(1)+1;
}

System.out.println("글번호 : "+num);
//6. 글쓰기(저장) : 실무에서는 물음표가 기본 20개이상이다. 5개씩 잘라서 String연결하면 헷갈리지않는다.
//Date는 now()메서드를 이용한다.
//now() : 자동으로 SQL구문 실행시 시스템시간 정보를 불러옴
sql = "insert into itwill_board value("
+"?,?,?,?,?,"
+"?,?,?,?,now(),"
+"?,?)";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);//bno는 가지고있는게 아니라 계산해서 만든것이므로 num사용
pstmt.setString(2, bb.getName());
pstmt.setString(3, bb.getPw());
pstmt.setString(4, bb.getSubject());
pstmt.setString(5, bb.getContent());
pstmt.setInt(6, 0);//조회수는 글쓰지마자 올라가지않는다. 글쓰는 당시에는 조회수가 0이니까 초기화한다.
pstmt.setInt(7, num);//답변글 그룹번호이므로 일반글번호와 동일하다.
pstmt.setInt(8, 0);//답변글 들여쓰기(처음 작성하는 일반 글의 들여쓰기는 0이므로 초기화한다)
pstmt.setInt(9, 0);//답변글순서(처음 작성하는 일반글이므로 일반글 제일위쪽(0)으로 초기화한다)
pstmt.setString(10, bb.getFile());
pstmt.setString(11, bb.getIp());

//7. 실행
pstmt.executeUpdate();
System.out.println("게시판글쓰기 성공");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("게시판글쓰기 실패");
e.printStackTrace();
} finally {
//자원해제
closeDB();
}
} //insertBoard메서드닫음

2. 예외처리 차이점(try catch와 throws)

  • try catch 방법
  • throws 방법

자바 예외처리(try catch, throws)
try catch는 예외를 직접 처리하기 때문에 메서드를 호출해도 더 이상 예외처리를 할 필요가 없습니다.
하지만 throws같은 경우는 호출하는 쪽에다가 예외처리를 맡겨버리는(?) 느낌?
그래서 호출하는 메소드에 throws가 있으면
호출하는 쪽에서도 예외처리를 다시 해줘야되요!

[ITWILL : JSP]자료구조1 : Collections Framwork(Set계열, List계열)

ITWILL학원 : 26강 JSP기초 BY 정규태강사

https://slidesplayer.org/slide/11290986/

1. 컬렉션 클래스의 제네릭 (Collections.Generic)

  • 컬렉션프레임워크 또는 컬렉션 클래스 또는 컨테이너라고도 부른다.
  • 즉 값을 담는 그릇이라는 의미이다. 그런데 그 값의 성격에 따라서 컨테이너의 성격이 조금씩 달라진다. 자바에서는 다양한 상황에서 사용할 수 있는 다양한 컨테이너를 제공하는데 이것을 컬렉션즈 프래임워크라고 부른다.

https://opentutorials.org/course/1223/6446

참고링크 : 생활코딩 컬렉션즈프레임워크

  • JDK5 버전이후부터 사용가능
  • 자료구조 학문을 구현한 클래스이다.
  • 요소라는 데이터를 가변인자의 객체에 저장하는 형태이다.
  • 컬렉션 클래스들은 Collections 인터페이스의 하위 클래스/인터페이스이다.
  • Collections인터페이스의 상위클래스는 Object클래스(최상위객체)이다.
  • 컬렉션 클래스들은 toString()메서드가 구현되어있다.
  • 공통 장점 :
    • 데이터의 삽입, 삭제, 검색기능이 뛰어남.
  • 주요 종류 :
    • Set
    • List
    • Map(Table포함)
  • 공통메서드 :
    • 변수명.add : 데이터저장
    • 변수명.get(index) : 배열의 index에 위치해 있는 값 출력
    • 변수명.set(idx, 변경값) : 데이터변경
    • 변수명.size() : 길이를 반환
    • iterator()

2. Iterator

  • Iterator는 반복자, 즉 반복문의 동작을 할 수 있는 인터페이스이다.
  • 해당 컬렉션에서 현재위치, 다음단계로의 이동동작을 반복가능하게 한다.
  • 모든 컬렉션클래스들은 슈퍼클래스의 iterator()메서드를 모두 사용가능하다.
  • Iterator 패턴 : 디자인패턴중의 하나로 중급개발자로 가는 길목에 이다. [디자인패턴](https://gmlwj d9405.github.io/2018/07/06/design-pattern.html)은 필수이므로 꼭 따로 학습 해볼것

3. Set계열의 컬렉션 클래스

  • 서로 다른타입의 데이터를 저장가능함. why? Object로 업캐스팅을 할 것이기때문에!
  • 순서를 포함하지 않음
  • 데이터 중복을 허용하지 않음.
  • Set계열은 중복x, 순서정보가 없기때문에 반복문을 사용할 수가 없다 -> 반복문 대신 interator 사용
  • 예 : HashSet 클래스 : Set 인터페이스를 구현한 서브클래스이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public static void main(String[] args) {
// TODO Auto-generated method stub
//Set<E>
//Set set = new Set(); //인터페이스는 객체를 생성할 수 없다
Set set = new HashSet(); //업캐스팅(HashSet -> Set)

System.out.println("요소의 갯수 : "+set.size());

set.add("하나");
set.add("2");
set.add("3.14");
set.add("c");
set.add(5);
set.add(5);
set.add(5);

System.out.println("요소의 갯수 : "+set.size());
System.out.println(set);

System.out.println("ㅡㅡㅡㅡㅡSet계열 반복문사용");
//Set계열은 중복x, 순서정보가 없기때문에 반복문을 사용할 수가 없다
//이때 사용하는 것이 interator이다

Iterator is = set.iterator();
while(is.hasNext()){
System.out.println(is.next());
}
}
//출력값
요소의 갯수 : 0
요소의 갯수 : 5 //중복을 허용하지않는다.
[2, c, 5, 3.14, 하나] //중복을 허용하지않는다. 내가 넣은 순서대로 출력되지않는다.
ㅡㅡㅡㅡㅡSet계열 반복문사용
2
c
5
3.14
하나

4. List계열의 컬렉션 클래스

  • 서로 다른타입의 데이터를 저장가능함. why? Object로 업캐스팅을 할 것이기때문에!
  • 순서가 저장됨 how? 저장할때 요소의 위치(index)값을 사용하기때문에!
    • 요소의 위치는 배열처럼 0부터 접근하면 됨
  • 데이터 중복 허용
  • Set계열보다 List계열을 더 많이 사용함
  • 예 : ArrayList, Vector, Stack, LinkedList

4-1. ArrayList

  • 장점 : 고정길이 배열의 단점을 보완. 저장공간의 크기가 필요에 따라 자동으로 증가함.
    가장 많이 사용한다.
  1. 예시 : ArrayList 데이터 입력 및 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ArrayList list = new ArrayList();

list.add("하나");
list.add("2");
list.add("3.14");
list.add("c");
list.add(5);
list.add(5);
list.add(5);

System.out.println("요소의 갯수 : "+ list.size());
System.out.println(list);
System.out.println(list.get(3));

//출력값
요소의 갯수 : 7
[하나, 2, 3.14, c, 5, 5, 5]
c
  1. 예시 : ArrayList 반복문사용
    순서(index)값이 저장되기때문에 Iterator가 아닌 반복문을 사용할 수 있다.
    전체 데이터를 출력하는 반복문이다.
  • System.out 대신 System.err 입력하면 에러형태(빨간글자)로 콘솔에 출력된다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
System.out.println("ㅡㅡㅡㅡㅡfor문");
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}

System.out.println("ㅡㅡㅡㅡㅡ확장for문");
//확장 for문 for-each
//for(해당 타입의 요소 변수명 : 반복할배열/컬렉션){}

for(Object i : list){
//System.err.println(i); 에러형태(빨간글자)로 콘솔에 출력
System.out.println(i);
}
//출력값
ㅡㅡㅡㅡㅡfor
하나
2
3.14
c
5
5
5
ㅡㅡㅡㅡㅡ확장for
하나
2
3.14
c
5
5
5
  1. 예시 : index활용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
System.out.println("ㅡㅡㅡㅡㅡindexof 사용");
System.out.println(list.indexOf(5));

System.out.println("ㅡㅡㅡㅡㅡindex활용한 add/set");
//기존데이터
System.out.println(list);
//데이터추가
list.add(3, "안녕하세요");
System.out.println(list);
//데이터변경
list.set(3, "하이");
System.out.println(list);

//출력값
ㅡㅡㅡㅡㅡindexof
4
ㅡㅡㅡㅡㅡindex활용한 add
[하나, 2, 3.14, c, 5, 5, 5]
[하나, 2, 3.14, 안녕하세요, c, 5, 5, 5]
[하나, 2, 3.14, 하이, c, 5, 5, 5]
  1. 예시 : 조건에 따른 데이터변경(반복문 사용)
    배열에 “2”가 있는 경우 “two”로 변경해보자
  • 내코드
1
2
3
4
5
6
7
8
9
//내코드
for(int i=0; i<list.size(); i++){
if(list.get(i) == "2"){
list.set(i, "two");
}
}
System.out.println(list);
//출력값
[하나, two, 3.14, 하이, c, 5, 5, 5]
  • 강사님코드
  • indexOf()는 데이터가 존재할 경우 index값을 출력하고 없는 경우 -1을 출력한다.
1
2
3
4
5
6
7
8
9
10
//강사님코드
System.out.println(list.indexOf("2")); //"2"의 index위치찾기
int value = list.indexOf("2");
if(value != -1){ //데이터가 존재할 경우
list.set(value, "two");
}
System.out.println(list);
//출력값
1
[하나, two, 3.14, 하이, c, 5, 5, 5]
  1. 비교 : 조건에 따른 데이터변경(Iterator사용)
  • 다음요소를 가지고있으면 true->반복문실행 없으면 false->반복문종료
1
2
3
4
5
//list객체를 반복할 수 있도록 iterator 객체로 변환
Iterator iter = list.iterator();
while(iter.hasNext()){ //다음요소를 가지고있으면 true->반복문실행 없으면 false->반복문종료
System.out.println(iter.next());
}

4-2. Vector

  • Vector : 자동으로 길이가 늘어나는 가변list

  • ArrayList - 동기화 기능 X : 상대적으로 클라이언트측에서 많이 사용함

  • Vector - 동기화 기능 O : 상대적으로 서버측에서 많이 사용함

  • 거의 대부분이 ArrayList를 쓰는 상황이다. 주니어레벨에서는 잘 모르겠다싶으면 ArrayList를 사용하면 됨.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//1. Vector 생성
// Vector생성시 4칸짜리 배열생성 후 필요시마다 3칸씩 추가됨 -> 효율적사용가능
Vector vec = new Vector(4,3);

//2. Vector 크기체크
System.out.println("백터의 크기 : "+vec.size());


//3 Vector 용량체크
System.out.println("백터의 용량 : "+vec.capacity());

//4.실무에서 더미데이터를 담을때 for문을 주로 사용한다
for(int i=0; i<5; i++){
vec.add(i*10);
}
System.out.println(vec);
System.out.println("백터의 크기 : "+vec.size());
System.out.println("백터의 용량 : "+vec.capacity());
System.out.println("백터첫번째요소 : "+vec.firstElement());
System.out.println("백터두번째요소 : "+vec.get(1));//
System.out.println("백터마지막요소 : "+vec.lastElement());

//출력값
백터의 크기 : 0 => //출력값이 4가 아니라 0인 이유는? size는 요소의 값이다. 요소가 없으면 값은 0이 출력된다.
0
백터의 용량 : 4
[0, 10, 20, 30, 40]
백터의 크기 : 5
백터의 용량 : 7
백터첫번째요소 : 0
백터두번째요소 : 10
백터마지막요소 : 40

4-3. 배열을 생성해보자

  • 내코드
    내코드는 for문을 사용했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
System.out.println("ㅡㅡㅡㅡㅡ 배열생성");
//대괄호안에 인자를 넣으면 에러가 발생함. 대괄호안에 숫자 넣으면 안됨!
//주로 안드로이드에서 아래의 배열생성방식을 사용함.
double[] arr = new double[]{1.1,1.2,1.3,1.4,1.5,1.6,1.7};
Vector vec2 = new Vector(5,5); //백터생성

//내코드
for(int i=0; i<arr.length; i++){
vec2.add(arr[i]);
}
System.out.println(vec2);
//출력값
//[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7]
  • 강사님코드
    강사님은 for-each를 사용한 코드이다.
1
2
3
4
5
6
7
8
9
double[] arr = new double[]{1.1,1.2,1.3,1.4,1.5,1.6,1.7};
Vector vec2 = new Vector(5,5); //백터생성
//강사님코드
for(double d : arr){
vec2.add(d);
}
System.out.println(vec2);
//출력값
//[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7]

4-4. 요소검색

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
System.out.println("ㅡㅡㅡㅡㅡ요소검색");
//[1.5]요소가 있으면 해당요소의 위치출력, 없으면 -1출력
int result = vec2.indexOf(1.5);
if(result != -1){
System.out.println("검색성공 : "+result);
}else{
System.out.println("검색실패 : "+result);
}

System.out.println("ㅡㅡㅡㅡㅡ요소삭제1 : indexOf사용");
//[1.6]요소가 있으면 해당요소를 삭제
int result2 = vec2.indexOf(1.7);
if(result2 != -1){
vec2.remove(result2);
System.out.println("삭제성공 : "+vec2);
}else{
System.out.println("삭제실패 : "+result2);
}

System.out.println("ㅡㅡㅡㅡㅡ요소삭제2 : contains");
double delValue = 45.6;
if(vec2.contains(delValue)){ //괄호한의 delValue가 포함되어 있으면 true
vec2.remove(delValue);
System.out.println("삭제성공 : "+vec2);
}else{
System.out.println("삭제실패 : "+vec2);
}

//출력값
ㅡㅡㅡㅡㅡ요소검색
검색성공 : 4
ㅡㅡㅡㅡㅡ요소삭제1 : indexOf사용
삭제성공 : [1.1, 1.2, 1.3, 1.4, 1.5, 1.6]
ㅡㅡㅡㅡㅡ요소삭제2 : contains
삭제실패 : [1.1, 1.2, 1.3, 1.4, 1.5, 1.6]

[ITWILL : JSP]Wrapper클래스, 오토 박싱과 오토 언박싱, hierarchy확인법

ITWILL학원 : 26강 JSP기초 BY 정규태강사

1. Wrapper클래스

  • 자바에서는 모든 것을 담을 수 있는 Object가 있다. Object로 배열을 만들면 다양한 종류의 객체들을 담을 수 있게된다. 단 기본형은 제외된다. WHY? 기본형데이터타입은 Object를 상속받지 않기때문! 이때 기본형 데이터를 wap해서 객체로 만들어 주는 것이 Wapper클래스이다.
  • 기본형 데이터를 객체로 사용할 수 있도록 만든 클래스
  • 기본형 데이터의 본질은 그대로두고, 해당 인터페이스만 제공하는 클래스이다.
  • 자바는 대소문자를 구분하기때문에 아래 두 형태는 서로 다른 값이다.
  • 기본형데이터타입은 상속이 불가능하다. why? 객체가 아니니까. 상속은 객체간의 관계를 표현하는 것.
기본형데이터타입 Wrapper클래스(참조형데이터타입)
byte Byte
short Short
int Integer
float Float
double Double
boolean Boolean
char Character

2. 오토 박싱과 오토 언박싱

기본적인 박싱과 언박싱이 있던 개념이지만 JDK6이후로 오토박싱과 오토언박싱이 가능해졌음
이건 새로운 개념이며 형변환개념과 다르다.

  • 박싱 : 값 형식의 데이터(기본형데이터타입)를 참조형데이터타입인 Wrapper클래스로 변환하는 것

    • 메모리상에서 stack에 있는 값을 heap에 전달함.
  • 언박싱 : Wrapper클래스를 기본형데이터타입으로 변환하는 것

    • heap에 있는 값을 stack에 전달함.
  • 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int num01 = 100;
int num02; //래퍼런스만 준비

Integer inum01 = new Integer(200); //인티져는 객체이기때문에 생성해줘야함
Integer inum02; //래퍼런스만 준비

//JDK1.6이전
inum02 = new Integer(num01); //박싱 : 직접 객체안에 담아야함
num02 = inum01.intValue(); //언박싱

System.out.printf("박싱 : %d, 언박싱 : %d%n", inum02, num02);

//JDK1.6이후
inum02 = num01; //오토박싱
num02 = inum01; //오토언박싱
System.out.printf("박싱 : %d, 언박싱 : %d%n", inum02, num02);

3. inner 클래스

접근제어자(Access Modifier) public

  • 누구나 접근 가능하다
  • public클래스는 main메서드를 포함하고 있는 클래스이다.
  • 하나의 파일에 하나의 public클래스만 있어야한다.

진짜 딱 하나만 사용가능할까?

  • inner 클래스에서 public클래스 추가 생성이 가능하다
1
2
3
4
5
class a{
public class b{ //이너클래스

}
}

4. 클래스명에서 키보드 f3, f4를 누르면

클래스명에서 아래 키보드를 누르면 상속관계(hierarchy)를 확인할 수 있다.

  • f3 : 어떤 클래스나 인터페이스를 상속받는 지 알수있음.
  • f4 : 계층도를 나타냄.

[ITWILL : JSP]커넥션풀(Connection Pool)

ITWILL학원 : 25강 JSP기초 BY 정규태강사

1. JNDI(Java Naming and Directory Interface)(p444~)

  • 필요한 데이터를 키-값 쌍으로 저장해서 필요시마다 키를 사용하여 값을 가져오는 방법

  • 예시 :

    • 내장객체.setAttribute(“키”, 값);
    • 내장객체.getAttribute(“키”);
    • 컬렉션의 해시맵/해시테이블 (“키”, 값);
    • DNS서버(도메인서버) : 도메인네임에 해당하는 ID정보를 저장해서 사용
  • 사용법

    • 컨테이너(예:톰캣)를 사용하여 Connection Pool생성하여 그 안에 이름에 해당하는 정보를 저장(=키), 해당하는 DB정보를 저장(=값)해서 사용.
  • 그렇다면 커넥션풀이 뭘까?

2. 커넥션풀(Connection Pool)

  • DB연결을 하기위한 객체

  • 효율적인 데이터 처리 가능

  • 도입된 배경 : 빈번한 디비연결/호출로 인해서 메모리낭비(누수)발생을 줄이고자 도입되었다.

  • 사용법 :

    • 미리 연결정보(Connection)를 생성
    • 필요할때마다 빌려주고
    • 다 쓰면 반납하는 방식
  • 작동방식 :

    1. 사용자 요청(Service)에 따른 Connection Pool에 쓸 쑤 있는 connection체크 후 connection 1개씩 할당 -> 있으면 바로 사용, 없으면 대기(반납되기를 기다리기)거나 임시객체를 생성
    2. 커넥션(연결정보)개수를 제한(커넥션풀이 알아서 효율적으로 관리함)
    3. 커넥션 객체를 다 쓰게되면 자원회수

https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/

2-1. 라이브러리 다운로드

커넥션풀을 사용하기 위해선 라이브러리를 다운받아야 한다.

  1. 라이브러리 다운로드 주소 : Apache Commons

  2. zip파일 다운로드 3가지

    • collections
    • dbcp
    • pool

위의 세가지를 차례대로 다운받으면 된다.
먼저 collections zip파일다운로드

그다음 dbcp zip파일다운로드

마지막 pool zip파일다운로드


  1. 압축 푼 뒤 D:\workspace_jsp7\JSP7\WebContent\WEB-INF\lib경로에 아래 세가지 파일을 복붙
    • commons-collections4-4.4.jar
    • commons-dbcp2-2.7.0.jar
    • commons-pool2-2.8.0.jar

2-2. 라이브러리를 서버에 연결

  1. META-INF폴더에 Context.xml 생성
  • DB연결에 필요한 정보를 저장할 수 있다.
  1. 속성작성
  • name : 외부에서 해당정보에 접근할 수 있도록하는 이름값(필요에 따라 변경가능)
  • auth : 자원관리자를 지정(Container/Application 고정)
  • type : 웹에서 사용될때(name속성으로 호출할때) 표시되는 객체 타입(고정)
  • driverClassName : JDBC드라이버주소(필요에 따라 변경가능)
    • mysql쓴다면 : com.mysql.jdbc.Driver
    • 오라클쓴다면 : oracle.jdbc.driver.OracleDriver
  • url : DB가 존재하는 위치 = 디비서버의 주소(필요에 따라 변경가능)
    • mysql쓴다면 : jdbc:mysql://localhost:3306/jspdb
    • 오라클쓴다면 : jdbc:oracle:thin:@localhost:1521:orcl
  • username/password : DB접속 계정 정보
  • maxWait : 커넥션풀에 사용가능한 커넥션이 없을 경우 커넥션의 회수를 기다리는 시간 지정(단위: 밀리초)
1
2
3
4
5
6
7
8
9
10
11
<Context>
<Resource
name="jdbc/mysqlDB"
auth="Container"
type="javax.sql.DataSource" //DataSource라는 객체가 DB정보를 저장
driverClassName="com.mysql.jdbc.Driver" //DataSource객체에 들어있는 정보
url="jdbc:mysql://localhost:3306/jspdb" //DataSource객체에 들어있는 정보
username="root" //DataSource객체에 들어있는 정보
password="1234" //DataSource객체에 들어있는 정보
/>
</Context>

2-3. JNDI 리소스 설정

  • web.xml파일에서 아래 코드 작성
    • description : 설명작성(의미없음, 원하는대로 작성하면됨)
    • 나머지정보들은 Context.xml파일에서 해당 설정값을 그대로 복붙할 것!
1
2
3
4
5
6
<resource-ref>
<description>ConnectDB</description>
<res-ref-name>jdbc/mysqlDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
  • 작동방식 : 서버를 실행하면 web.xml 먼저 접속 후 resource-ref코드를 보고 Context.xml을 읽어서 DB를 연결한다.

2-4. getCon()메서드 작성 : 커넥션풀 사용

memberDAO.java파일로 이동해서 getCon()메서드를 커넥션풀을 사용한 아래 코드로 변경해준다.

  • InitialContext클래스는 Context클래스를 재구현한 클래스이고 Object를 상속받았다

    1
    2
    3
    public class InitialContext
    extends Object
    implements Context
  • DataSource ds = (DataSource) init.lookup(“java:comp/env/jdbc/context파일의 name값그대로 입력”);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//드라이버로드 디비연결 : 커넥션 풀 사용
private Connection getCon(){

//Context 객체 생성
try {
Context init = new InitialContext(); //업캐스팅

//디비연결정보를 불러오기 ->DataSource 타입으로 저장
// 고정문구"java:comp/env/jdbc/다른문구context파일의 name값입력"
DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/mysqlDB");

//ds 사용해서 연결
con = ds.getConnection();
System.out.println("연결성공" + con);
} catch (SQLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
return con;
}

[ITWILL : JSP]Javabean 5 : 관리자만 확인할 수 있는 회원목록페이지만들기

ITWILL학원 : 25강 JSP기초 BY 정규태강사

1. main.jsp에 버튼추가

관리자만 확인할 수 있는 회원목록페이지만들어보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%//1.한글처리, 파라미터 
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//objectstring으로 다운캐스팅
String name = request.getParameter("name");
//1-1. id없이는 진입불가, id없는 경우 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
%>
<h2><%=id %>님 환영합니다.</h2>
<%=name %><br>

<input type="button" value="회원정보조회" onclick="location.href='memberinfo.jsp'">
<input type="button" value="회원정보수정" onclick="location.href='updateForm.jsp'">
<input type="button" value="로그아웃" onclick="location.href='logout.jsp'">
<input type="button" value="회원탈퇴" onclick="location.href='deleteForm.jsp'">

<!-- 관리자일때만 메뉴확인가능 -->
<% if(id != null){
if(id.equals("admin")){ %>
<input type="button" value="회원전체목록(관리자용)" onclick="location.href='memberList.jsp'">
<%
}
}
%>

이때 관리자메뉴확인 if조건문을 아래 한줄짜리 코드로 바꿔보자

  • 잘 실행될까?
1
2
3
4
5
6
7
8
<!-- 관리자일때만 메뉴확인가능 -->
<%
if(id.equals("admin") && id != null){
%>
<input type="button" value="회원전체목록(관리자용)" onclick="location.href='memberList.jsp'">
<%
}
%>
  • NOPE : 코드는 왼쪽에서부터 순서대로 실행되기때문

  • 아래코드처럼 순서만 바꾼다면 잘 실행될까?

1
2
3
4
5
6
7
8
<!-- 관리자일때만 메뉴확인가능 -->
<%
if(id != null && id.equals("admin")){
%>
<input type="button" value="회원전체목록(관리자용)" onclick="location.href='memberList.jsp'">
<%
}
%>
  • YES! 이제 잘 실행된다

2. 회원전체페이지 출력하는 memberList.jsp 생성

DB에서 모든 회원의 정보를 가져와서 페이지에 출력한다
이때, 관리자는 목록에 제외되어야한다.

순서

  1. 로그인세션제어(관리자는 제외)
  2. DAO객체생성
  3. 회원목록을 가져오는 메서드 사용
    • ArrayList는 가변배열이므로 length가 없고 size가 존재한다.
    • size()메서드는 배열의 요소의 갯수를 리턴한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<%
//1. 로그인세션제어(관리자는 제외)
String id = (String) session.getAttribute("id");//다운캐스팅
if(id == null || !id.equals("admin")){ //순서바뀌면 에러발생하므로 항상 null 먼저 비교할 것
response.sendRedirect("loginForm.jsp");
}
//2. DAO객체생성
MemberDAO mdao = new MemberDAO();

//3. 회원목록을 가져오는 메서드 사용
mdao.getMemberList();//아래 4번에서 DAO객체에 만들 메서드
ArrayList memberList = mdao.getMemberList();
%>

<h2>마이페이지</h2>
<table border="1">
<tr>
<td>아이디</td>
<td>비밀번호</td>
<td>이름</td>
<td>나이</td>
<td>성별</td>
<td>이메일</td>
<td>회원가입일</td>
</tr>

<%//반복문
//ArrayList는 가변배열이므로 length가 없고 size가 존재한다.
//size()메서드는 배열의 요소의 갯수를 리턴
for(int i=0;i<memberList.size(); i++){
MemberBean mb = (MemberBean) memberList.get(i);
%>
<tr>
<td><%=mb.getId() %></td>
<td><%=mb.getPw() %></td>
<td><%=mb.getName() %></td>
<td><%=mb.getAge() %></td>
<td><%=mb.getGender() %></td>
<td><%=mb.getEmail() %></td>
<td><%=mb.getReg_date() %></td>
</tr>
<%
}
%>
</table>
%>

3. DAO객체에 getMemberList()메서드 생성

  1. DB연결메서드 불러오기
  2. SQL & pstmt 생성
  3. 실행 -> rs저장
  4. 데이터처리 :
    • 4-1. 회원이 몇명인지 알지 못하므로 가변길이 배열을 생성 : 배열안에 자바빈을 넣어서 가져 갈 예정이다. 근데 데이터갯수를 몰라서 배열을 못만든다. 따라서 데이터형태 ArrayList로 가져갈거다.
      • ArrayList<E> 여기서 e를 제네릭타입이라고 칭함
      • ArrayList<> 다이아몬드 오퍼레이터라고 칭함
      • mb는 MemberBean데이터타입인데 add(Object)가 들어가야한다 따라서 업캐스팅 (MemberBean -> Object)해서 넣어야한다.
      • add(mb)를 빼서 쓸때는 다운캐스팅을 해야지 사용할 수 있다.
    • 4-2. DB테이블 결과 1행의 정보 모두를 MemberBean데이터타입으로 저장
    • 4-3. 1행정보를 배열 한칸에 저장
  5. finally 로 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public ArrayList getMemberList(){

//가변길이 배열 생성
ArrayList memberList = new ArrayList();

try {
//8-1. DB연결메서드 불러오기
con = getCon();
//8-2. SQL & pstmt 생성
sql = "select * from itwill_member";
pstmt = con.prepareStatement(sql);
//8-3. 실행 -> rs저장
rs = pstmt.executeQuery();
//8-4. 데이터처리 :
//8-4-1. DB테이블 결과 1행의 정보 모두를 MemberBean데이터타입으로 저장
//8-4-2. 1행정보를 배열 한칸에 저장
while(rs.next()){
MemberBean mb = new MemberBean();//1.MemberBean객체생성
mb.setAge(rs.getInt("age"));
mb.setEmail(rs.getString("email"));
mb.setId(rs.getString("id"));
mb.setName(rs.getString("name"));
mb.setPw(rs.getString("pw"));
mb.setReg_date(rs.getTimestamp("reg_date"));
//여기까지가 한 행의 데이터를 변수mb에 저장한 것임. while로 모든 행을 반복해서 변수mb에 저장

//가변배열(ArrayList)에 위의 데이터mb를 저장
//즉 배열 한 칸에 회원 1명의 정보를 저장함.
memberList.add(mb); //업캐스팅 (MemberBean -> Object)
//System.out.println(memberList); 배열한 칸에 잘 들어갔는지 콘솔로 확인
}

System.out.println("정보검색완료");
//System.out.println(memberList);

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeDB();
}
return memberList;
}

[ITWILL : JSP]Javabean 4 : web.xml, 회원정보삭제페이지

ITWILL학원 : 25강 JSP기초 BY 정규태강사

1. web.xml

  • 배포서술자 : 프로젝트 실행시 가장 먼저 실행되는 파일.
  • 프로그램에 필요한 전반적인 설정을 지정함.
  • 에러코드별 데이터 처리필요 : 프로그램배포시 꼭 필요한 페이지.
  • 위치 : WEBCONTENT하위의 WEB-INF폴더안에 위치함.

https://slidesplayer.org/slide/15757128/

1-1. 404에러 예시

  • 만약 404에러가 뜨면 location 아래로 이동해서 처리하겠다는 의미
  • webcontent하위에 error폴더 생성 후 그 안에 404code.jsp생성
  1. web.xml파일에 </web-app>태그 위에 아래 코드를 입력한다.
1
2
3
4
5
6
<error-page>
<error-code>404</error-code>
<location>
/error/404code.jsp
</location>
</error-page>
  1. ‘error’폴더를 따로 생성한 뒤 404code.jsp를 만든다.
1
2
3
4
<h1>404code</h1>
<h2>페이지를 찾을 수 없습니다.</h2>
<h2>관리자에게 문의하세요.</h2>
<input type="button" value="로그인페이지로 이동" onclick="location.href='loginForm.jsp'">

1-2. 500에러 예시

  • 만약 500에러가 뜨면 location 아래로 이동해서 처리하겠다는 의미
  • webcontent하위에 error폴더 생성 후 그 안에 500code.jsp생성
  • 위와 동일한 방법에 코드만 404에서 500으로 변경해주면 된다
1
2
3
4
5
6
<error-page>
<error-code>500</error-code>
<location>
/error/500code.jsp
</location>
</error-page>
1
2
3
4
<h1>500code</h1>
<h2>페이지를 찾을 수 없습니다.</h2>
<h2>관리자에게 문의하세요.</h2>
<input type="button" value="로그인페이지로 이동" onclick="location.href='loginForm.jsp'">

2. 회원정보삭제페이지

2-1. 메인페이지 main.jsp에서 회원정보삭제버튼 추가

메인페이지에 회원정보삭제 버튼을 만든다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%//1.한글처리, 파라미터 (세션생성)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//object를 string으로 다운캐스팅
String name = request.getParameter("name");
//1-1. id없이는 진입불가, id없는 경우 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
%>
<h2><%=id %>님 환영합니다.</h2>

<input type="button" value="회원정보조회" onclick="location.href='memberinfo.jsp'">
<input type="button" value="회원정보수정" onclick="location.href='updateForm.jsp'">
<input type="button" value="로그아웃" onclick="location.href='logout.jsp'">
<input type="button" value="회원탈퇴" onclick="location.href='deleteForm.jsp'">

2-2. 회원정보삭제폼페이지 deleteForm.jsp 생성

사용자로부터 비밀번호 받는 폼페이지 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%
//1. 로그인 처리 -> 로그인 x (로그인페이지 이동)
String id = (String) session.getAttribute("id");
if( id == null ){
response.sendRedirect("loginForm.jsp");
}
//2.회원 비밀번호만 입력받아서 deletePro.jsp페이지 이동후 삭제
%>
<fieldset>
<legend>회원탈퇴</legend>
<form action="deletePro.jsp" method="post">
<!-- input타입중 hidden은 화면에 있는 해당 input태그를 숨겨서 정보 전달 -->
아이디 : <input type="hidden" name="id" value="<%=id %>" readonly><br>
비밀번호 : <input type="password" name="pw"><br>
<input type="submit" value="탈퇴하기">
<input type="button" value="뒤로가기" onclick="location.href='main.jsp'">
</form>
</fieldset>

2-3. 회원정보삭페이지 deletePro.jsp 생성

순서

  1. 한글처리 & 로그인여부체크 ->로그인페이지이동
  2. 삭제할 비밀번호 가져오기 : 파라미터이용
  3. MeberDAO객체 생성 -> deleteMember()메서드 호출
  4. 데이터처리 : 1-삭제완료, 0-비번오류, -1-아이디없음
    • 삭제 후 session 초기화 까먹으면 안된다! 세션 꼭 없앨 것!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<%//1.한글처리 & 로그인확인 
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");
if(id == null){
response.sendRedirect("loginForm.jsp");
}

//2. 삭제할 비밀번호 가져오기
String pw = request.getParameter("pw");
%>

<%
//3.DAO객체생성 -> 결과를 리턴(1=정상처리 2=비번오류 -1=아이디가없음)
MemberDAO mdao = new MemberDAO();
int result = mdao.deleteMember(id, pw); //2-4에서 만든 메서드 호출

//4.데이터처리 -> 삭제후 login페이지로 이동
if(result == 1){
session.invalidate(); //초기화 필수! 까먹지마!
%>
<script type="text/javascript">
alert("회원정보삭제 성공");
location.href="loginForm.jsp";
</script>
<%
}else if(result == 0){
%>
<script type="text/javascript">
alert("비밀번호오류로 회원정보삭제실패");
history.back();
</script>
<%
}else{
%>
<script type="text/javascript">
alert("존재하지않는 아이디입니다.");
history.back();
</script>
<%
}
%>

2-4. DAO에서 deleteMember()메서드만들기

순서

  1. DB연결메서드 불러오기
  2. SQL & pstmt 생성 : 사용자가 입력한 비밀번호가 DB비번과 일치하는 지 확인
  3. 실행 -> rs저장
  4. 데이터처리 : DB에 있는 비번일치하면 정보삭제 작업, 아닌 경우 에러
    • 4-1. DB에 있는 회원 -> 비번체크 : 비번일치(->수정) 비번불일치(->에러)
      • 비번일치하는 경우 : SQL 구문작성 & pstmt 생성 -> 실행
    • 4-2. DB에 없는 회원 -> 에러
  5. 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public int deleteMember(String id, String pw){
int result = -1;
try {
//7-1. DB연결메서드 불러오기
con = getCon();

//7-2. SQL & pstmt 생성
sql = "select pw from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);

//7-3. 실행 -> rs저장
rs = pstmt.executeQuery();

//7-4. 데이터처리 : DB에 있는 회원인 경우 삭제, 아닌 경우 에러
if(rs.next()){
if(pw.equals(rs.getString("pw"))){

//7-4-1. SQL 구문작성 & pstmt 생성
sql = "delete from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.executeUpdate();
result = 1;
System.out.println("회원삭제성공-아디일치,비번일치");
}else{
result = 0;
System.out.println("회원삭제실패-아디일치,비번불일치");
}
}else{
result = -1;
System.out.println("회원삭제실패-아이디불일치");
}
} catch (SQLException e) {
e.printStackTrace();
//7-5. 자원해제
} finally {
closeDB();
}
return result;
}//delete닫힘

[ITWILL : JSP]Javabean 3 : 회원정보조회/수정 페이지만들기

ITWILL학원 : 24강 JSP기초 BY 정규태강사

자바빈 프로젝트 1 : 회원가입페이지만들기
자바빈 프로젝트 2 : 로그인 및 로그아웃페이지만들기
자바빈 프로젝트 3 : 회원정보조회 및 수정페이지만들기

1. 메인페이지 main.jsp에서 버튼 추가

메인페이지에 회원정보조회 버튼을 만든다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%//1.한글처리, 파라미터 (세션생성)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//objectstring으로 다운캐스팅
String name = request.getParameter("name");
//1-1. id없이는 진입불가, id없는 경우 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
%>
<h2><%=id %>님 환영합니다.</h2>

<input type="button" value="회원정보조회" onclick="location.href='memberinfo.jsp'">
<input type="button" value="회원정보수정" onclick="location.href='updateForm.jsp'">
<input type="button" value="로그아웃" onclick="location.href='logout.jsp'">
<input type="button" value="회원탈퇴" onclick="location.href='deleteForm.jsp'">

2. 회원정보조회페이지 memberinfo.jsp 생성

회원정보를 DB에서 가져와서 출력하는 memberinfo.jsp를 만든다

순서

  1. 한글설정 & 변수생성

    • 1-1. id값확인 -없으면 로그인페이지로 이동
  2. MemberDAO객체 생성 -> 회원정보 가져오는 메서드생성

    • MemberBean import하기
    • MemberBean 데이터타입 mb변수로 메서드정보 담아오기
  3. 데이터처리 : 테이블에 담기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//1. 한글설정 & 변수생성
String id = (String) session.getAttribute("id");//object이기에 형변환필수
//1-1.id값확인 -없으면 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
//2. 멤버DAO객체 생성 -> 회원정보 가져오는 메서드생성
MemberDAO mdao = new MemberDAO();
MemberBean mb = mdao.getMember(id);

//3. 데이터처리 : 테이블로 표현
if(mb != null){
%>
<h2>마이페이지</h2>
<table border="1">
<tr>
<td>아이디</td>
<td><%=mb.getId() %></td>
</tr>
<tr>
<td>비밀번호</td>
<td><%=mb.getPw() %></td>
</tr>
<tr>
<td>이름</td>
<td><%=mb.getName() %></td>
</tr>
<tr>
<td>나이</td>
<td><%=mb.getAge() %></td>
</tr>
<tr>
<td>성별</td>
<td><%=mb.getGender() %></td>
</tr>
<tr>
<td>이메일</td>
<td><%=mb.getEmail() %></td>
</tr>
<tr>
<td>회원가입일</td>
<td><%=mb.getReg_date() %></td>
</tr>
</table>
<%
}
%>
<hr>
<input type="button" value="뒤로가기" onclick="location.href='main.jsp'">

3. DAO에서 getMember()메서드만들기

회원정보 가져오는 메서드 getMember()로 회원정보 전부 리턴 -> 테이블에 추가해야한다.

순서

  1. 드라이브로드 & 디비연결
  2. SQL 구문 작성 & pstmt 생성
  3. 실행 -> rs저장
  4. 데이터처리 : DB에 있는 회원정보 저장 후 memberinfo페이지로 전달
    • 4-1. MemberBean mb = null; //객체 레퍼런스 생성
    • 4-2. rs.next() : DB의 컬럼명과 일치해야함!
  5. 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public MemberBean getMember(String id){
MemberBean mb = null; //객체 레퍼런스 생성
//왜 null인가? 정보가 생성되는 시점은 rs에 있을때이다.
//따라서 rs가 없을땐 굳이 만들필요가 없다.

try{
//5-1. 드라이브로드 디비연결
con = getCon();
//5-2. SQL & pstmt 생성
sql = "select * from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
//5-3. 실행 -> rs저장
rs = pstmt.executeQuery();
//5-4. 데이터처리 : DB에 있는 회원정보 저장 후 memberinfo페이지로 전달
//5-4-1. MemberBean mb = null; //객체 레퍼런스 생성
//DB의컬럼명을 입력할 것
if(rs.next()){
mb = new MemberBean();
mb.setId(rs.getString("id"));
mb.setPw(rs.getString("pw"));
mb.setName(rs.getString("name"));
mb.setAge(rs.getInt("age"));
mb.setEmail(rs.getString("email"));
mb.setGender(rs.getString("gender"));
mb.setReg_date(rs.getTimestamp("reg_date"));

System.out.println("회원정보저장완료");
}
System.out.println("sql구문실행완료");
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally { //5-5. 자원해제
closeDB();
}
return mb;
}

4. 회원정보수정페이지 updateForm.jsp 생성

순서

  1. 한글처리 & 세션변수
    • 1-1. 로그인여부체크 (로그인x->로그인페이지로이동) //object->string 형변환필수
  2. 드라이브로드 & 디비연결 = 멤버DAO객체 생성 -> getMember()메서드호출
    • 로그인한 사용자의 정보를 가져오기
    • getMember()를 이용해서 id에 해당하는 회원정보 가져오기
  3. 데이터처리 : 테이블형식으로 출력
  4. 비밀번호를 입력받은 뒤 수정하기 ->updatePro.jsp에서 진행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%//1.로그인여부체크 (로그인x->로그인페이지로이동)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//object이기에 형변환필수
if(id == null){
response.sendRedirect("loginForm.jsp");
}
//2. 드라이브로드 & 디비연결 : 로그인한 사용자의 정보를 가져오기
MemberDAO mdao = new MemberDAO();
MemberBean mb = mdao.getMember(id);

//3. 데이터처리 : 테이블형식으로 출력
//4. 비밀번호를 입력받은 뒤 수정하기 ->updatePro.jsp에서 진행
%>
<fieldset>
<legend>회원정보수정</legend>
<form action="updatePro.jsp" method="post" name="fr">
아이디 <input type="text" name="id" value="<%=mb.getId() %>" readonly><br>
비밀번호 <input type="password" name="pw" placeholder="비밀번호를 입력하세요" required><br>
이름 <input type="text" name="name" value="<%=mb.getName() %>"><br>
나이 <input type="text" name="age" value="<%=mb.getAge() %>"><br>
성별
<input type="radio" name="gender" value="여"
<% if(mb.getGender().equals("여")){ %>
checked
<%}%>
> 여성
<input type="radio" name="gender" value="남"
<% if(mb.getGender().equals("남")){ %>
checked
<%}%>
> 남성<br>
이메일 <input type="text" name="email" value="<%=mb.getEmail() %>"><br>
<input type="submit" value="회원정보수정하기">
</form>
</fieldset>

<button onclick="location.href='main.jsp'">뒤로가기</button>

5. 회원정보수정페이지 updatePro.jsp 생성

순서

  1. 로그인여부체크 ->로그인페이지이동
  2. 액션태그사용 : 전달된 정보를 저장(아이디,비번,이름,나이,성별,이멜) = jsp:useBean
    2-1. 파라미터 값 저장 = jsp:setProperty
  3. MeberDAO객체 생성 -> updateMember()메서드 호출
  4. 데이터처리 : 1-수정완료, 0-비번오류, -1-아이디없음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<%
//1. 한글처리 & 로그인여부체크 ->로그인페이지이동
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");
if (id == null) {
response.sendRedirect("loginForm.jsp");
}

%>
<!-- 2. 액션태그사용 : 전달된 정보를 저장(아이디,비번,이름,나이,성별,이멜) -->
<jsp:useBean id="mb" class="com.itwillbs.member.MemberBean" />
<!-- 2-1. 파라미터 값 저장 -->
<jsp:setProperty property="*" name="mb"/>

<%//3. MeberDAO객체 생성
MemberDAO mdao = new MemberDAO();

//4. 데이터처리 : 1-수정완료, 0-비번오류, -1-아이디없음
int result = mdao.updateMember(mb);

if(result == 1){
%>
<script type="text/javascript">
alert("회원정보수정 성공");
</script>
<%
System.out.println("회원정보수정성공");
response.sendRedirect("main.jsp");
}else if(result == 0){
%>
<script type="text/javascript">
alert("비밀번호오류로 회원정보수정실패");
history.back();
</script>
<%
}else{
%>
<script type="text/javascript">
alert("존재하지않는 아이디입니다.");
history.back();
</script>
<%
}
%>

6. DAO에서 updateMember()메서드만들기

회원정보 수정 메서드

순서

  1. 드라이브로드 & 디비연결
  2. SQL 구문 작성 & pstmt 생성
    • 2-1. select 사용해서 id가 있는지 체크
  3. 실행 -> rs저장
  4. 데이터처리 : DB에 있는 회원인 경우
    • 4-1. DB에 있는 회원 -> 비번체크 : 비번일치(->수정) 비번불일치(->에러)
      • 비번일치하는 경우 : SQL 구문작성 & pstmt 생성 -> 실행
    • 4-2. DB에 없는 회원 -> 에러
  5. 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public int updateMember(MemberBean mb){
int result = -1;

try {
//6-1. 드라이브로드 디비연결
con = getCon();
//6-2. SQL 구문작성 & pstmt 생성
sql = "select pw from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, mb.getId());
//6-3. 실행 -> rs저장
rs = pstmt.executeQuery();
//6-4. 데이터처리 : DB에 있는 회원인 경우 수정 아닌 경우 에러
if(rs.next()){//DB에 있는 회원
if(mb.getPw().equals(rs.getString("pw"))){//비번일치
//6-5. 비번일치하면 정보수정 작업
//6-5-1. SQL 구문작성 & pstmt 생성
sql = "update itwill_member set name=?, age=?, gender=?, email=? "
+ "where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, mb.getId());
//6-5-2. 실행
pstmt.executeUpdate();
System.out.println("회원정보수정성공");
result = 1;
}else{
result = 0;
System.out.println("아디일치,비번불일치 - 회원정보수정실패");
}
}else{ //DB에 없는 회원
result = -1;
System.out.println("존재하지않는아이디 - 회원정보수정실패");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
closeDB();
}
return result;
}//updateMember닫힘

[ITWILL : JSP]Javabean 2 : 로그인,로그아웃페이지만들기

ITWILL학원 : 24강 JSP기초 BY 정규태강사

자바빈 프로젝트 1 : 회원가입페이지만들기
자바빈 프로젝트 2 : 로그인 및 로그아웃페이지만들기
자바빈 프로젝트 3 : 회원정보조회 및 수정페이지만들기

1. 로그인폼페이지 작성

1
2
3
4
5
6
7
8
9
<fieldset>
<legend>로그인</legend>
<form action="loginPro.jsp" method="post" name="fr">
아이디 <input type="text" name="id" required ><br>
비밀번호 <input type="password" name="pw"><br>
<input type="submit" value="로그인하기">
<input type="button" value="회원가입하기" onclick="location.href='insertForm.jsp'">
</form>
</fieldset>

2. 로그인프로페이지 작성

파라미터를 저장할 때 세가지 방법이 있다.

  1. 파라미터 사용 : getParameter()
  2. 자바빈객체사용 : Javabean jb = new Javabean(), jb.set변수()
  3. 액션태그 사용 : useBean(), setProperty()

자세히 : 자바빈기초

  • getParameter() : 주소줄과 폼태그에 작성한 INPUT은 getParameter로 가져온다.
  • getAttribute() : 세션, 페이지에서 저장한 값들은 getAttribute로 가져온다.

이 중 로그인 페이지에선 파라미터를 사용할 예정이다.

로그인페이지 작성 순서

  1. 한글처리 & 파라미터저장
    • 1-1. 파라미터저장 -> 파라미터사용
    • 1-2. 파라미터저장 -> 액션태그사용
  2. 로그인처리 -> DAO에서 처리
    • why? DB와 관련된 모든 사항은 DAO에서 처리하니까.
    • 로그인 메서드는 DB에서 해당 값이 있는지 체크하고 결과를 리턴
    • 리턴값은 정수형 데이터값 사용(1-로그인처리, 0-비번오류, (-1)-아이디없음)
  3. 결과(result가 -1,0,1)에 따른 페이지 이동처리
    • result = 1 : 아이디정보를 세션값으로 저장(키값, 저장할 데이터이름), main.jsp로 이동
    • result = 0 : 비번불일치 알림창, history.back()
    • result = -1 : 없는아이디 알림창, history.back()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%//1. 한글처리
request.setCharacterEncoding("UTF-8");
//1-1. 파라미터사용 : 전달된 파라미터값 저장(아이디,비번)
String id = request.getParameter("id");
String pw = request.getParameter("pw");
%>
<!--1-2.액션태그사용 : 전달된 파라미터값 저장(아이디,비번)
`useBean`객체생성(id값 아무거나 작성해도 됨) -> `setProperty`로 파라미터저장
<jsp:useBean id="mb" class="com.itwillbs.member.MemberBean" />
<jsp:setProperty property="*" name="mb"/>
-->

<% //2. 로그인처리 -> DAO에서 처리 따라서 객체만 생성
MemberDAO mdao = new MemberDAO();
mdao.idCheack(id, pw);

//3. 결과(result가 -1,0,1)에 따른 페이지 이동처리
if(result == 1){
//3-1. 아이디정보를 세션값으로 저장(키값, 저장할 데이터이름)
session.setAttribute("id", id); //object자리에 string을 담았기에 업캐스팅발생
response.sendRedirect("main.jsp");
}else if(result == 0){
%>
<script type="text/javascript">
alert("비밀번호가 일치하지 않습니다");
history.back();
</script>
<%
}else{
%>
<script type="text/javascript">
alert("없는 아이디입니다");
history.back();
</script>
<%
}
%>

3. DAO페이지 작성

기존에 만들었던 MemberDAO를 그대로 가져온 뒤 idCheck()메서드만 생성하면 된다.

기존 MemberDAO 태그

순서

  1. 드라이브로드 디비연결
  2. SQL & pstmt 생성
  3. 실행 -> rs저장
  4. 데이터 처리
    • 왜 while이 아닌 if인가? where절에서 id는 pk조건을 가지고 있으므로 중복이 없기때문.
  5. 세션정보를 만들 수 있을까?
    • session.setAttribute();
    • 만들 수 없다. why? session은 jsp내장객체이다.
    • java에서 사용할 수 없지만 추후 서블릿을 통해 사용할 수 있다.
    • 그래서 지금은 main.jsp페이지에서 세션만들거임.
  6. 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public int idCheack(String id, String pw){
int result = -1;
try {
//4-1. 드라이브로드 디비연결
con = getCon();
//4-2. SQL & pstmt 생성
sql = "select pw from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
//4-3. 실행 -> rs저장
rs = pstmt.executeQuery();
//4-4. 데이터 처리
//왜 while이 아닌 if인가? where절에서 id는 pk조건을 가지고 있으므로 중복이 없기때문
if(rs.next()){
if(pw.equals(rs.getString("pw"))){
result = 1;
System.out.println("아이디,비번일치 = 로그인성공(1)");
//4-5. 세션정보를 만들 수 있을까? 만들 수 없다.
}else{
result = 0;
System.out.println("아이디있지만 비번다름 (0)");
}
}else{
result = -1;
System.out.println("아이디,비번없음 (-1)");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally { //4-6. 자원해제
closeDB();
}
return result;
}//idCheck닫힘

4. main 페이지작성 후 로그아웃 페이지 연결하기.

순서

  1. 메인페이지, 한글처리 파라미터 저장
  2. 세션생성
  3. 메인페이지에 로그아웃버튼을 만들고 로그아웃페이지에 연결한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%//1.한글처리, 파라미터 (세션생성)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//object를 string으로 다운캐스팅
//1-1. id없이는 진입불가, id없는 경우 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
%>

<h2><%=id %>님 환영합니다.</h2>

//2. 버튼생성
<input type="button" value="회원정보조회" onclick="location.href='memberinfo.jsp'">
<input type="button" value="회원정보수정" onclick="location.href='updateForm.jsp'">
<input type="button" value="로그아웃" onclick="location.href='logout.jsp'">
<input type="button" value="회원탈퇴" onclick="location.href='deleteForm.jsp'">

4-1. 로그아웃페이지작성

메인페이지 연결한 로그아웃페이지를 만든다.

1
2
3
4
5
6
7
8
<%
session.invalidate();
System.out.println("로그아웃성공");
%>
<script type="text/javascript">
alert("정상적으로 로그아웃 되었습니다");
location.href="loginForm.jsp";
</script>

[ITWILL : JSP] try catch구문

ITWILL학원 : 23강 JSP기초 BY 정규태강사

try catch구문

  • 예외처리라고도 부른다.

  • 개발자가 예측하기 어려운 에러들을 예외라고 한다.

  • 이러한 예외를 java 컴파일러가 객체로 만들어서 처리해준다.

  • 우리는 try catch를 만들기만 하면 컴파일러가 알아서 한다.

  • 실무에서 가장 많이 사용하는 방식은 아래 방식이다
    ClassNotFoundException과 SQLException은 여러 Exception종류 중에 임의로 작성한 것이고 제외한 나머지 코드들은 통으로 함께 쓰이는 코드이다.
    생각할 수 있는 구체적인 Exception을 찾아서 작성한 뒤 그 외에 발생할 수있는 예외를 대비해 catch(Exception e)로 추가 예외처리를 해준다.

  • catch(Exception e)로 한번에 다 예외처리가 가능한데 왜 따로따로(ClassNotFoundException와 SQLException등등) 먼저 예외처리를 할까?
    예외마다 처리방법이 각기 다르다.
    따라서 각각 예외처리를 해주고 혹시 모를 또다른 예외를 위해 catch(Exception e)구문으로 예외처리를 해주는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
try{

예외가 발생할 수도 있는 코드를 작성

} catch(ClassNotFoundException e){ //class예외만 처리
예외정보를 출력
예외처리

}catch(SQLException e) { //SQL예외만처리
예외정보를 출력
예외처리

}catch(Exception e) { //모든 예외를 처리할 수 있음.
예외정보를 출력
예외처리

}finally{
예외 발생 유무와 상관없이 반드시 실행되는 코드
//ex)보통 자원해제로 메모리효율성을 높인다.
//ex)
if(pstmt != null) pstmt.close();
if(con != null) con.close();
}