[ITWILL : JSP]Javabean 1 : 회원가입페이지만들기

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

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

자바빈(JavaBean)을 이용한 회원가입 폼 작성(p261~)

1. 자바빈 클래스 생성 : MemberBean.java 클래스 생성

  • 자바빈클래스를 만들때는 자바빈설계규약을 꼭 지켜야한다
  • toString()을 하는 이유는 MemberBean클래스의 데이터 전체를 가져다 쓰고 싶기 때문이다.
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
//자바빈 -> 회원정보를 저장해서 이동시키기 위한 객체
//DTO(데이터 전송 객체)로도 불린다.

//1. 클래스는 public
public class MemberBean {


//2. DB의 테이블의 컬럼을 자바빈의 private 멤버 변수로 생성
private String id;
private String pw;
private String name;
private int age;
private String gender;
private String email;
private Timestamp reg_date; //import필수


//4. 디폴트생성자 public MemberBean(){} 생략

//3. getter 와 setter생성 : alt+shift+s에서 getter and setter 클릭 -> 자동생성
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
(이하 생략)

//5. toString생성 : alt+shift+s에서 toString클릭 -> 자동생성
@Override
public String toString() {
return "멤버 [id=" + id + ", pw=" + pw + ", name=" + name + ", age=" + age + ", gender=" + gender + ", email="
+ email + ", reg_date=" + reg_date + "]";
}

}

2. insertForm.jsp만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<fieldset>
<legend>회원가입</legend>
<form action="insertProM.jsp" method="post" name="fr">
아이디 <input type="text" name="id" required><br>
비밀번호 <input type="password" name="pw"><br>
이름 <input type="text" name="name"><br>
나이 <input type="text" name="age"><br>
성별
<input type="radio" name="gender" value="여"> 여성
<input type="radio" name="gender" value="남"> 남성<br>
이메일 <input type="text" name="email"><br>
<input type="submit" value="회원가입하기">
</form>
</fieldset>

3. insertProM.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
<%
//1. 한글처리
request.setCharacterEncoding("UTF-8");
%>

<!-- 2. 액션태그 이용 : 전달되는 파라미터 정보저장
2-1. 자바빈 객체 생성
-->
<jsp:useBean id="mb" class="com.itwillbs.member.MemberBean" />

<!-- 2-2. 파라미터 값 저장 , 가입일자는 별도로 직접 저장-->
<jsp:setProperty property="*" name="mb"/>
<%
System.out.println(mb);
mb.setReg_date(new Timestamp(System.currentTimeMillis()));
System.out.println(mb);

//3. DB로 값 전달해서 회원가입 처리
//3-1. MeberDAO객체 생성
MemberDAO mdao = new MemberDAO();

//3-2. 회원가입메서드호출
mdao.insertMember(mb);

//4. 성공시 -> login페이지로 이동
%>
<script type="text/javascript">
alert("회원가입성공!")
location.href="loginForm.jsp"
</script>

4. MemberDAO.java 페이지 만들기

  • DAO (데이터 처리 객체) -> DB처리 모든 것은 이 페이지에서 한다
  • DB 데이터 생성, 조회, 수정은 여기서 진행 / 다른페이지는 출력만 함
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
60
61
62
63
64
65
66
67
68
69
70
71
72
public class MemberDAO {
//1. DB변수 생성 : 일부러 멤버변수로 선언함. 메서드에서 멤버변수 호출해서 사용할 예정
Connection con = null;
String sql = "";
PreparedStatement pstmt = null;
ResultSet rs = null;

//2. DB연결 메서드 생성: 리턴해도되고 안해도 됨
private Connection getCon(){
//2-1. 드라이브로드 & DB연결
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

//2-2. Class.forName(DRIVER);면 에러메세지가 뜨는데 거기서 try catch구문의 해결방법을 누른다
try {
Class.forName(DRIVER);
System.out.println("드라이버 로드 성공!");
con = DriverManager.getConnection(DBURL, DBID, DBPW);
//getConnection() 에러메세지가 뜨는데 거기서 try catch구문의 해결방법을 누른다
System.out.println("DB 연결 성공!" + con);
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로드 실패!");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("DB 연결 실패!");
e.printStackTrace();
}
return con;
}

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

//3. 회원가입처리 (외부에서 접근가능해야하니까 public)
public void insertMember(MemberBean mb){ //파라미터로 정보를 받아서 DB에 저장
try {
//3-1. DB연결메서드 불러오기
con = getCon();
//3-2. SQL & pstmt 생성 & 실행
sql = "insert into itwill_member value(?,?,?,?,?,?,?)";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, mb.getId());
pstmt.setString(2, mb.getPw());
pstmt.setString(3, mb.getName());
pstmt.setInt(4, mb.getAge());
pstmt.setString(5, mb.getGender());
pstmt.setString(6, mb.getEmail());
pstmt.setTimestamp(7, mb.getReg_date());
//insertForm에는 reg_date를 입력하는 란이 없기에 mb에 따로 넣어줘야한다.
//즉, 파라미터로 전달되지 않는 정보는 insertForm에서 직접생성
pstmt.executeUpdate();
System.out.println("회원가입성공");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("회원가입실패");
e.printStackTrace();
} finally {
//자원해제로 DB 효율성을 높일수있다.
closeDB();
}
}
}

[ITWILL : JSP]Javabean : 기초

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

1. 자바빈(JavaBean) (p245~)

  • 디자인부분과 비즈니스로직부분을 분리하기 위해서 자바빈을 사용한다.
  • DTO(Data Transfer Object)로 불리기도 함

2. 자바빈 설계규약

https://m.blog.naver.com/PostView.nhn?blogId=rbamtori&logNo=220760147541&proxyReferer=https:%2F%2Fwww.google.com%2F

정리하자면

  1. 클래스는 public
  2. 멤버변수는 private
  3. 멤버변수마다 별도의 get/set메소드가 존재해야한다
  4. 기본생성자 있어야함 (public)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//1번규칙만족 : 클래스는 public
public class Javabean1 {
//2번규칙만족 : 멤버변수선언 private
private String id;

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

//3번규칙만족 : 멤버변수마다 별도의 get/set메소드가 존재해야한다.
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

3. 자바빈사용방법

  1. 자바빈 객체를 사용하는 방법
  2. 자바빈 액션태그를 사용하는 방법

예시

파라미터값으로 가져오는 방법과 위의 자바빈사용방법 두가지 총 3가지를 비교해보자.
공통적으로 사용할 페이지는 form.jsp페이지이다

먼저 form페이지이다.
사용자가 id와 pw, 좋아하는 숫자를 입력할 수 있는 페이지 코드이다.

1
2
3
4
5
6
7
8
9
<fieldset>
<legend>사용자 정보입력</legend>
<form action="beanPro2.jsp" method="post">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pw"><br>
좋아하는 숫자 : <input type="text" name="num"><br>
<input type="submit" value="확인">
</form>
</fieldset>

3-1. 자바빈이 아닌 파라미터값을 가져와서 사용하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
int num = Integer.parseInt(request.getParameter("num"));
%>
<%-- 파라미터값으로 출력 => 아이디 : <%=id %>, 비밀번호 : <%=pw %> 좋아하는 숫자 : <%=num %> --%>
<table border="1" style="text-align: center">
<tr>
<td>출력방식 </td>
<td>아이디</td>
<td>비밀번호</td>
<td>좋아하는 숫자</td>
</tr>
<tr>
<td>파라미터 이용</td>
<td><%=id %></td>
<td><%=pw %></td>
<td><%=num %></td>
</tr>
<table>

3-2. 자바빈 클래스 생성

데이터를 한번에 들고 다니기 위해 Javabean.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
//1번규칙만족 : 클래스는 public
public class Javabean2 {
//2번규칙만족 : 멤버변수선언 private
private String id;
private String pw;
int num;

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

//3번규칙만족 : 멤버변수마다 별도의 get/set메소드가 존재해야한다.
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 int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}

//전체데이터를 효율적으로 한번에 표시하기위해 toString은 필수다
//toString은 자동 단축키로 만들어서 쓰는 거임 : alt+shift+s에서 `Generate toString()`클릭
@Override
public String toString() {
return "Javabean2 [id=" + id + ", pw=" + pw + ", num=" + num + "]";
}
}

3-3. 자바빈 객체 사용

자바빈 객체를 사용하여 Form페이지에서 입력받은 값을 화면에 출력하는 코드이다.

  1. javabean타입의 객체생성 -> import생성
  2. 변수 Jb는 private이므로 get메서드와 set메서드로 접근해야함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//1. javabean타입의 객체생성 -> import생성
Javabean2 jb = new Javabean2();

//2. 값 가져오기 : private이므로 get/set메서드로 접근.
jb.setId(request.getParameter("id"));
jb.setPw(request.getParameter("pw"));
jb.setNum(Integer.parseInt(request.getParameter("num")));

//3. 값 출력
<table border="1" style="text-align: center">
<tr>
<td>자바빈 객체 이용</td>
<td><%=jb.getId() %></td>
<td><%=jb.getPw() %></td>
<td><%=jb.getNum() %></td>
</tr>
</table>

3-4. 자바빈 액션태그 사용

  • 액션태그방식은 html문법이며 공통으로 사용되는 메뉴들을(주로 페이지) 특정 공간에 추가한다.

  • 해당 페이지가 java파일(서블릿)으로 컴파일 된 후에 include한다. 따라서 컴파일을 두번하게된다.

  • 액션태그방식은 jsp가 java파일이 되고 거기에 include를 하고 class파일이 된다.

  • jsp:useBean태그의 속성중 하나인 scope를 이용하면 더욱 효과적이다.

    • scope 속성에 page, request, session, application값을 설정하면 해당 영역에 지정해서 저장가능하다.
    • scope 속성의 설정값이 없으면 기본 page에 저장된다.

3-4-1. jsp:useBean 태그

id =객체참조변수 class=사용할 클래스파일 경로(객체의 경로)

1
2
<jsp:useBean id=객체참조변수 class=사용할 클래스파일 경로(객체의 경로) />
// 객체아래 코드는 Javabean1 jb = new Javabean1();

3-4-2. jsp:setProperty 태그

3가지 속성이 있다.

  1. property속성 : 자바빈 객체의 멤버변수(저장공간)
  2. name속성 : 자바빈 객체의 레퍼런스( = jsp:useBean의 id값)
  3. param속성 : 전달되는 파라미터값
1
2
3
jsp:setProperty property=변수명 name=객체생성 id와 동일한 값 param=파라미터값
//예시
<jsp:setProperty property="id" name="bean" param="id"/>
  • 만약 setProperty에서 파라미터 가져올때 파라미터가 2개 이상인 경우는?
    property값과 param값이 동일하면 param값 생략가능하다.
1
2
3
4
5
6
<jsp:useBean id="bean" class="com.itwillbs.bean.Javabean1"/>
<jsp:setProperty property="*" name="bean" param="*"/>

<! -- 여기서 property값과 param값이 동일하면 아래처럼 param값 생략가능 -->

<jsp:setProperty property="*" name="bean"/>

3-4-3. jsp:getProperty 태그

1
2
3
4
5
6
7
8
9
<jsp:getProperty property="set했던변수와 동일한 변수명" name="객체생성 id와 동일한 값"/><br>

//예시
<jsp:getProperty property="id" name="bean"/><br>

<!-- 스크립틀릿을 통한 출력 -->
<%
out.println("자바빈 액션태그객체를 자바코드로 출력 : " + bean.getId());
%>

3-4-4. 액션태그 전체 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//1. 액션태그만드는 객체
<jsp:useBean id="bean" class="com.itwillbs.bean.Javabean2"/>

//2. 파라미터값 저장(파라미터 모든 값을 저장하려면 * 아니면 각각 입력)
<jsp:setProperty property="*" name="bean"/>

//3. 파라미터값 출력
<jsp:getProperty property="id" name="bean"/>
<jsp:getProperty property="pw" name="bean"/>
<jsp:getProperty property="num" name="bean"/>

//4. 데이터 처리 : 테이블사용
<table border="1" style="text-align: center">
<tr>
<td>자바빈 액션태그 이용</td>
<td><%=bean.getId() %></td>
<td><%=bean.getPw() %></td>
<td><%=bean.getNum() %></td>
<td><%=bean.toString() %></td>
</tr>
</table>

[ITWILL : JSP]JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

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

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

1. 회원목록출력하는데 관리자는 빼고 출력하기

이는 두가지 방법이 있다.

  1. DB에서 전체 데이터를 불러오고 출력만 관리자빼고하기
  2. DB에서부터 관리자빼고 가져온 뒤 출력하기
  • 어느 방법이 더 좋을까?
    2번째 방법!
    WHY?
    DB에서 데이터를 많이 가져올수록 시간이 오래 걸리므로 2번이 서비스측면에서 효율적이다.

1-1. DB에서 전체 데이터를 불러오고 출력만 관리자빼고하기

조건문으로 한줄이면 끝난다!

if(rs.getString("id").equals("admin")) continue; 짜잔!

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
//4. sql구문 & pstmt
String sql = "select * from itwill_member";
PreparedStatement pstmt = con.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

//5. 실행 ->rs저장 ->데이터처리
//가져온 최원 정보 모두를 테이블을 사용해서 출력
//관리자는 목록에서 빼기
%>
<table border="1">
<tr>
<td>아이디</td>
<td>비밀번호</td>
<td>이름</td>
<td>나이</td>
<td>성별</td>
<td>이메일</td>
<td>가입일시</td>
</tr>
<%
while(rs.next()){
if(rs.getString("id").equals("admin")) continue;

%>
<tr>
<td><%=rs.getString("id") %></td>
<td><%=rs.getString("pw") %></td>
<td><%=rs.getString("name") %></td>
<td><%=rs.getInt("age") %></td>
<td><%=rs.getString("gender") %></td>
<td><%=rs.getString("email") %></td>
<td><%=rs.getString("reg_date") %></td>
</tr>
<%
}
%>
</table>

1-2. DB에서부터 관리자빼고 가져온 뒤 출력하기

위의 코드에서 if구문을 없애고 sql구문만 변경해주면 된다.

1
String sql = "select * from itwill_member where id not in('admin')";

2. 자바 에러 두종류(JAVA ERROR)

  1. 컴파일에러 = Error
  2. 예외발생 = Exception

[ITWILL : JSP]JDBC활용 - 회원정보수정페이지만들기

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

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

사용자가 로그인한 뒤 자신의 정보를 수정할 수 있는 마이페이지를 만들어보자.

회원정보를 수정할 수 있는 전제는 로그인이다.
로그인이 되어있지않다면 로그인페이지로 이동시켜야한다.
로그인이 되어있는 사용자는 사용자정보를 DB에서 불러와서 화면에 각 요소를 출력한다 -> 원하는 정보를 수정한 뒤 다시 DB에 업데이트해야한다.

1. 회원정보수정폼 페이지만들기

로그인한 사용자에 한하여 DB에 저장되어있는 해당 회원정보를 FORM형식으로 나타내주는 updateForm.jsp 페이지를 만들어보자.

다음은 회원정보수정폼 작성 순서이다.

1-1. 로그인여부를 먼저 체크. & 한글처리 & 변수로딩

  • 로그인이 되어있지않다면 로그인페이지로 이동
  • id값을 가져올 수 있는 방법이 여기서는 두가지이다,
    1. 기본 방식은 파라미터로 가져오거나 = request.getParameter(“id”)
    2. session을 이용했기에 세션활용. 세션값은 object이기에 String으로 형변환필수 = (String) session.getAttribute(“id”)

1-2.드라이브로드 & DB를 연결.

DB에 저장된 회원정보를 사용해야함으로 드라이브로드 & DB를 연결해야한다.

1-3. SQL 구문작성 & pstmt

  • select구문으로 해당 id에 관한 모든 정보를 DB에서 불러온다
  • 많은 컬럼중에 왜 하필 id일까? => id가 primary key이기 때문이다. primary key를 기준으로 where조건문을 걸어 DB에서 데이터를 select하면 된다.
  • select쿼리이므로 executeQuery()와 executeUpdate()중 executeQuery()를 사용하면 된다.
  • select쿼리이므로 pstmt는 int형 변수에 저장해서 사용하면 된다.

1-4. 실행 -> rs에 결과저장 -> 데이터처리

  • 지역변수에 데이터를 넣어서 사용할 수 있다.
  • 지역변수는 멤버변수처럼 자동으로 초기화되지 않는다. 따라서 직접해줘야한다
  • 지역변수의 초기화값은 데이터타입에 따라 다르다. 초기화값은 보통 0이나 null임. 실무에선 String 초기화시 null보단 “”로 사용한다.
데이터타입 초기화값
int 0
String “”(공백)
배열 0
참조형(Timestamp등) null

1-5. 비밀번호를 입력받은 뒤 사용자가 입력한대로 데이터수정하기 -> 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<%//1. 로그인여부체크 (로그인x->로그인페이지로이동)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id"); //object이기에 형변환필수

if(id == null){
//로그인페이지이동
response.sendRedirect("loginForm.jsp");
}

//2. 드라이브로드 & 디비연결 : 로그인한 사용자의 정보를 가져오기
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

Class.forName(DRIVER);
Connection con = DriverManager.getConnection(DBURL, DBID, DBPW);
System.out.println("드라이브로드와 디비연결성공");

//3. SQL & PSTMT & 실행
String sql = "select * from itwill_member where id=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);

//4. 실행-> rs에 결과저장 -> 데이터처리
ResultSet rs = pstmt.executeQuery();

//지역변수초기화-자동으로 안됨.

String name = "";
int age = 0;
String gender = "";
String email = "";
Timestamp reg_date = null; // Timestamp의 초기값은 null임

if(rs.next()){
//id=rs.getString("id"); 세션으로 가져와서 필요없음
name = rs.getString("name");
age = rs.getInt("age");
gender = rs.getString("gender");
email = rs.getString("email");
reg_date = rs.getTimestamp("reg_date");
}

//4. gender를 입력안하고 회원가입한경우
if(gender == null){
gender="여";
}

//5. 비밀번호를 입력받은 뒤 수정하기 ->updatePro.jsp에서 진행
%>
<fieldset>
<legend>회원정보수정</legend>
<form action="updatePro.jsp" method="post" name="fr">
아이디 <input type="text" name="id" value="<%=id %>" readonly><br>
비밀번호 <input type="password" name="pw"><br>
이름 <input type="text" name="name" value="<%=name %>"><br>
나이 <input type="text" name="age" value="<%=age %>"><br>
성별
<input type="radio" name="gender" value="여"
<% if(gender.equals("여")){ %>
checked
<%}%>
> 여성
<input type="radio" name="gender" value="남"
<% if(gender.equals("남")){ %>
checked
<%}%>
> 남성<br>
이메일 <input type="text" name="email" value="<%=email %>"><br>
<input type="submit" value="회원정보수정하기">
</form>
</fieldset>

2. 회원정보수정페이지의 데이터처리페이지만들기

아래는 회원정보폼에 수정을 하면 update구문을 실행하는 updatePro.jsp 코드이다.

2-1. 로그인여부를 먼저 체크

  • 로그인이 되어있지않다면 로그인페이지로 이동
  • id값을 가져올 수 있는 방법이 여기서는 두가지이다,
    1. 기본 방식은 파라미터로 가져오거나 = request.getParameter(“id”)
    2. session을 이용했기에 세션활용. 세션값은 object이기에 String으로 형변환필수 = (String) session.getAttribute(“id”)

2-2. 한글처리 & 변수가져오기

변수에 전달된 정보를 저장(아이디,비번,이름,나이,성별,이멜)한다

2-3. 드라이브로드 & DB를 연결.

2-4. SQL 구문작성 & pstmt

수정하고자하는 id정보가 DB에 있는지 select구문으로 판단

2-5. 실행 -> rs에 결과저장 -> 데이터처리

  • 아이디,비번 동일한 경우 => 입력받은 데이터를 DB에 update.
  • 비밀번호오류 => 에러메세지
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
60
61
62
63
64
65
66
67
68
69
<%//1.로그인여부체크 ->로그인페이지이동
String id = (String) session.getAttribute("id");
if (id == null) {
response.sendRedirect("loginForm.jsp");
}

//2. 한글처리 & 변수 : 전달된 정보를 저장(아이디,비번,이름,나이,성별,이멜)
request.setCharacterEncoding("UTF-8");
//String id = request.getParameter("id"); 세션으로 이미가져왔음
String pw = request.getParameter("pw");
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String email = request.getParameter("email");
String gender = request.getParameter("gender");

//3. 드라이버로드 & DB연결
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

Class.forName(DRIVER);
Connection con = DriverManager.getConnection(DBURL, DBID, DBPW);
System.out.println("updatePro : 드라이브로드와 디비연결성공");

//4. SQL구문 & pstmt실행 & 실행->rs저장
// 4-1 sql구문 : 수정하고자하는 사람의 정보가 있는지 판단 후 select
String sql = "select pw from itwill_member where id=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);

//5. 데이터처리
// 아이디,비번 동일한 경우 => 수정
// 비밀번호오류 => 에러메세지

ResultSet rs = pstmt.executeQuery();

if(rs.next()){ //아이디있는 경우
if(pw.equals(rs.getString("pw"))){// 비밀번호 일치하는 경우
sql = "update itwill_member set name=?,age=?,gender=?,email=?"
+"where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setInt(2, age);
pstmt.setString(3, gender);
pstmt.setString(4, email);
pstmt.setString(5, id);
pstmt.executeUpdate();
System.out.println("회원정보수정완료");
response.sendRedirect("main.jsp");
}else{ // 비밀번호 불일치하는 경우
%>
<script type="text/javascript">
alert("비밀번호오류로 수정불가")
history.back(); //뒤로가기.
</script>
<%
System.out.println("비밀번호오류로 수정불가");
}
}else{ //아이디없는 경우
%>
<script type="text/javascript">
alert("비회원입니다")
history.back(); //뒤로가기.
</script>
<%
System.out.println("아이디오류");
}
%>

[ITWILL : JSP]JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기

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

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

DB저장되어있는 모든 회원정보를 출력하는 코드를 작성해보자.

1. recordset과 resultset

  • recordset = select 구문의 결과. BOF부터 EOF(End Of File)까지의 총 덩어리를 의미.

https://www.xylos.com/en/learning/blog/tip-5-save-time-processing-data-excel-vba-recordset

  • resultset = 테이블을 의미. ex)테이블A, 테이블B, 테이블C 각각이 다 resultset이다.

  • rs.next() = 커서객체를 다음(next)로 넘기는 메서드. row에 데이터가 있으며 true이고 없으면 다음 row로 내려간다. 데이터에 행이 없으면 False가 되고 while문이 종료된다.

  • getString(columnIndex)는 columnIndex안에 테이블의 열번호를 넣으면 된다.

    • 가독성이 떨어지고 모든 열이 어떤 데이터인지 알고있을때 사용할 수있다.
    • 따라서 index값을 사용하는 경우 주석을 적어 무엇을 나타내는 데이터인지 알려주는 것이 좋다.

2. DB에서 고객정보를 불러와서 테이블에 담기.

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
<table border="1">
<tr>
<td>인덱스</td>
<td>이름</td>
<td>성별</td>
<td>나이</td>
<td>주민번호</td>
</tr>
<%//1.변수설정
%>
<% //2. 드라이버 로드와 DB연결
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

Class.forName(DRIVER);
Connection con = DriverManager.getConnection(DBURL, DBID, DBPW);

//3.쿼리작성
String sql = "select * from itwill_member";
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();

//3-1.일반출력
/* while(rs.next()){
System.out.println("이름 : " + rs.getString("name") //이름만 출력
+ ", 성별 : " + rs.getString("gender")
+ ", 나이 : " + rs.getInt("age")
+ ", 주민번호 : " + rs.getString("jumin"));
//이름, 나이, 성별, 주민번호 -> 콘솔로 출력하기 -> html 테이블생성해서 출력하기
}*/

2-1. 테이블에 출력

가져온 데이터를 테이블형태로 출력해보는데 2가지 방법이 있다.

  1. 변수지정없이 바로 while반복문실행
    SQL구문작성시 select * from itwill_member이라서 while반복문을 사용했다.
    만약 SQL구문이 select * from itwill_member where id=?로 where조건절을 추가하면 반복문이 아닌 if문으로 사용가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//3.쿼리작성
String sql = "select * from itwill_member";
PreparedStatement pstmt = con.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

while(rs.next()){
%>
<tr>
<td><%=rs.getString(1) %></td> //인덱스
<td><%=rs.getString("name") %></td>
<td><%=rs.getString("gender") %></td>
<td><%=rs.getInt("age") %></td>
<td><%=rs.getString("jumin") %></td>
</tr>
<%
}
%>

</table>
  1. 변수에 저장해서 반복문없이 table에 바로 태그집어넣기
    rs에서 가져온 값을 변수로 저장해서 html table태그에 바로 표현식으로 집어넣을 수 있다.
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
//3.쿼리작성
String sql = "select * from itwill_member where id=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);

ResultSet rs = pstmt.executeQuery();

String name = "";
int age = 0;
String gender = "";
String email = "";
Timestamp reg_date = null; //null이 초기값임

if(rs.next()){
//id=rs.getString("id"); 세션으로 가져와서 필요없음
name = rs.getString("name");
age = rs.getInt("age");
gender = rs.getString("gender");
email = rs.getString("email");
reg_date = rs.getTimestamp("reg_date");
}
%>
<table border=1>
<tr>
<td>아이디</td>
<td>이름</td>
<td>나이</td>
<td>성별</td>
<td>이메일</td>
<td>가입일자</td>
</tr>
<tr>
<td><%=id %></td>
<td><%=name %></td>
<td><%=age %></td>
<td><%=gender %></td>
<td><%=email %></td>
<td><%=reg_date %></td>
</tr>
</table>

[ITWILL : JSP]JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리

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

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

1. MySQL Workbench에서 Timestamp 추가시 주의점

MySQL Workbench에서 row추가시 Timestamp 데이터타입을 쓰고싶다면 TIMESTAMP라고 직접 작성하거나 드롭다운리스트에서 TIMESTAMP()을 찾은 뒤 꼭 괄호를 삭제하고 TIMESTAMP로 apply해야 에러가 발생하지 않는다.

타임스탬프는 사용자가 입력하는 데이터가 아니라 컴퓨터시간에서 가져오는 데이터이다.
따라서 JDBC의 3단계인 sql구문 & DB저장에서 객체생성을 통해 진행할 수 있다.

아래 코드는 JDBC에서 itwill_member테이블에 사용자가 입력한 id, pw와 컴퓨터현재시간을 차례대로 sql구문에 넣는 코드이다.

1
2
3
4
5
6
//3. sql구문 & DB저장 진행시 
String sql = "insert into itwill_member value(?,?,?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pw);
pstmt.setTimestamp(3, new Timestamp(System.currentTimeMillis()));

2. JDBC에서 데이터처리

JDBC 3단계인 SQL작성 & pstmt 객체생성 & 데이터처리를 중점으로 로그인페이지를 작성해보자.

  • 아이디 일치 + 비번일치 => 로그인, main페이지이동, id값 세션객체 생성
  • 아이디 일치 + 비번불일치 => 에러(“비밀번호오류”), 뒤로가기
  • 아이디 불일치 => 에러(“비회원입니다”), 뒤로가기
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
//3-3. 데이터처리
if(rs.next()){ //true라는 건 id가 있다는 소리임 즉, 회원인 경우가 됨
if(pw.equals(rs.getString("pw"))){ //비번일치
//세션ID값생성
session.setAttribute("id", id);
response.sendRedirect("main.jsp"); //js코드보다 java코드가 좋다
System.out.println(id+"로그인성공");
%>
<!-- <script type="text/javascript">
location.href="main.jsp"
</script> js코드보다 java코드가 더 좋다 -->
<%
}else{
System.out.println("비밀번호오류"); //비번불일치
%>
<script type="text/javascript">
alert("비밀번호가 일치하지 않습니다")
//페이지이동 3가지의 차이점
history.back(); //=>작성한 아이디나 데이터가 살아있다
//location.href="loginForm.jsp" //=>작성한 아이디나 데이터가 없다
//location.reload();//=>새로고침으로 alert창이 반복된다
</script>
<%
}
}else{ //false이므로 id가 없다는 소리임. 즉, 비회원인 경우.
System.out.println("아이디오류-비회원입니다");
%>
<script type="text/javascript">
let tmp = confirm("비회원입니다. 회원가입하시겠습니까?")
if(tmp){
location.href="insertForm.jsp";
}else{
history.back();
}

</script>
<%
}
%>

2-1. 페이지이동시 js코드보다 java코드가 좋은 이유

다른 페이지로 이동시 왜 js코드보다 java코드가 더 좋을까?
해당파일의 확장자는 jsp이다. jsp파일이라서 자바코드의 처리가 우선순위에 있다.
js코드인 경우, java로 된 코드가 다 실행되고 난 뒤에 실행이 된다.
이때 이후에 나오는 java코드에 문제가 생기면 js코드가 실행안될 수 있기때문에 아예 java코드를 쓰는것이
실행순서상 좋다.

  1. js코드를 이용한 페이지이동
1
2
3
<script type="text/javascript">
location.href="main.jsp"
</script> -->
  1. java코드를 이용한 페이지이동
1
response.sendRedirect("main.jsp");

2-2. 페이지새로고침 3가지의 차이점.

  • history.back(); : 작성한 아이디나 데이터가 살아있다
  • location.href="loginForm.jsp"; : 작성한 아이디나 데이터가 없다
  • location.reload(); : 새로고침으로 alert창이 반복된다

[ITWILL : JSP]JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법

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

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

1. import는 언제, 왜 쓸까?

어떤 건 import를 쓰고 어떤 건 import하지않고도 사용가능하다.

왜그럴까?

  1. import가 필요없는 경우 : 기본적으로 사용 가능한 클래스인 경우이다.

    • 직접구현해서 접근가능한 범위에서 만들어 놓은 클래스들
    • java 활용도가 높은 클래스를 패키지 추가 없이 사용가능하도록 만들어 놓은 클래스들
      • 예 ) java.lang.*은 자바에서 제공하는 기본패키지로 import없이 사용가능하다. 대표적으로 String 객체는 java.lang.*에 속해있다.
  2. import를 써야하는 경우 : 기본제공되는 클래스가 아닌 경우 클래스가 있는 패키지를 추가(import)해야함

2. form페이지로 받은 데이터를 DB에 insert하는 방법

form페이지를 만들어서 이름과 성별, 나이, 주민번호를 사용자로부터 받은 뒤 그 데이터들을 insertPro.jsp파일에서 불어와서 MySQL DB에 넣어보는 코드이다.

아래 코드는 form페이지는 생략하고 insertPro.jsp만 나타낸 코드이다.

총 3단계로 이루어진다.

  1. form페이지에서 입력한 데이터를 변수로 불러오기
  2. DB연결하기
  3. SQL구문작성 후 stmt객체생성하기 : SQL구문작성시에는 작은 따음표와 큰 따옴표를 잘 입력해야한다.
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
//import 아래 3가지 추가됨
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>

<%
//1. 변수로 가져오서 데이터출력

//1-1. 파라미터값 한글처리
request.setCharacterEncoding("UTF-8");

//1-2. form태그에서 받은 모든 데이터는 string타입으로 전달되므로 -> int는 형변환필수
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String gender = request.getParameter("gender");
String jumin1 = request.getParameter("jumin1");
String jumin2 = request.getParameter("jumin2");
String jumin = jumin1 + "-" + jumin2;
%>

<!--1-3. 데이터출력 -->
이름 : <%=name %><br>
나이 : <%=age %><br>
성별 : <%=gender %><br>
주민번호 : <%=jumin %><br>

<%
//2. DB에 담기
//2-1. 필요한 변수들 상수로 정리
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

//2-2. 드라이버로드
Class.forName(DRIVER);
System.out.println("드라이버로드성공");

//2-3. DB연결
Connection con = DriverManager.getConnection(DBURL, DBID, DBPW);
System.out.println("드라이버연결");

//3. SQL구문작성, stmt 객체생성
//3-1. SQL구문작성 : 작은따옴표와 큰따옴표 주의하기
String sql= "insert into itwill_member values(null,'"+name+"','"+gender+"',"
+age+",'"+jumin+"')";

//3-2. stmt 객체생성(java.sql하위의 statement사용) : sql구문을 실행하는 역할.
Statement stmt = con.createStatement(); //statement객체생성완료

//3-3. stmt 실행
stmt.executeUpdate(sql);
System.out.println("DB저장완료");
%>

MySQL가서 select * from 테이블명 명령어를 입력하면 row가 추가된 것을 확인할 수 있다.

3. PreparedStatement 객체생성

위의 sql구문작성을 보면 변수, 작은따옴표, 큰따옴표혼재되어있어서 적기에 매우 불편하다
이를 해소하기위한 객체PreparedStatement를 이용하면된다.

기존 Statement보다 처리속도도 빠르고 보안도 좋은 PreparedStatement를 사용해야한다.

아래 두 코드를 비교해보자.

3-1. Statement사용

1
2
3
4
5
6
7
8
9
10
11
<%@page import="java.sql.Statement"%>

//1.SQL구문작성
String sql= "insert into itwill_member values(null,'"+name+"','"+gender+"',"
+age+",'"+jumin+"')";

//2. stmt 객체생성(java.sql하위의 statement사용) : sql구문을 실행하는 역할.
Statement stmt = con.createStatement();

//3. stmt 실행
stmt.executeUpdate(sql);

3-2. PreparedStatement사용

3단계 stmt 실행시 기능에 따라 쿼리구문을 두가지로 구분할수있다.

  1. pstmt.executeUpdate() : insert, update, delete에 사용

    • DB조작하는 구문.
  2. pstmt.executeQuery() : select에 사용

    • DB조작없이 값만 사용하는 구문.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@page import="java.sql.PreparedStatement"%>

//1. SQL구문작성
String sql= "insert into itwill_member values(null,?,?,?,?)";

//2. pstmt 객체생성(java.sql하위의 prepareStatement사용) : sql구문을 실행하는 역할.
PreparedStatement pstmt = con.prepareStatement(sql);

//물음표 값채우기 pstmt.set테이블데이터타입(물음표위치, 값)
//항상 물음표 갯수와 쿼리구문갯수가 동일해야한다.
pstmt.setString(1, name);
pstmt.setString(2, gender);
pstmt.setInt(3, age);
pstmt.setString(4, jumin);

//3. pstmt 실행 : 업데이트 또는 쿼리
pstmt.executeUpdate();
//pstmt.executeQuery();

[ITWILL : JSP]JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법

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

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

JAVA에서 DB 정보 지우기

이름과 주민번호의 입력값이 DB데이터와 일치하면 회원탈퇴를 진행하는 코드를 만들어보자.

1. 사용자가 작성할 form페이지만들기

먼저 이름과 주민번호를 사용자로부터 입력받을 수 있는 deleteForm.jsp파일을 만든다

1
2
3
4
5
6
7
8
9
10
<fieldset>
<legend>회원정보수정</legend>
<form action="deletePro.jsp" method="post" name="fr">
<h3>본인확인정보</h3>
이름 <input type="text" name="name"><br>
주민번호 <input type="text" name="jumin1"> - <input type="password" name="jumin2"><br>
<p></p>
<input type="submit" value="탈퇴하기"><br>
</form>
</fieldset>

2. 사용자가 작성한 데이터를 불러와서 DB에 연결하기

  • deletePro.jsp에서 사용자데이터를 불러와서 DB데이터와 확인 후 탈퇴를 처리하는 코드를 작성하면 아래와 같다.

  • 순서는 아래와 같다

    1. 사용할 변수를 먼저 가져오기
    2. DB연결하기
    3. SQL쿼리작성하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%//1. 변수가져오기
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String jumin = request.getParameter("jumin1")+"-"+request.getParameter("jumin2");
%>

<%
//2.DB연결
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

Class.forName(DRIVER);
Connection con = DriverManager.getConnection(DBURL, DBID, DBPW);
%>

3. sql작성 & pstmt객체생성

이때 두가지 방법이 있다.

3-1. 바로 delete하기

  • pstmt.executeUpdate();는 return값이 int이므로 int형 변수에 넣은 뒤 if조건문을 통해 진행여부를 html페이지에서 보여줄 수 있다.

  • 사용자입력값이 DB데이터와 일치하면

    • 이클립스 console창에 실행완료(수정완료) : 1 출력
    • html파일에서는 이름과 함께 정상적으로 탈퇴되었습니다라는 문구 출력된다.
  • 사용자입력값이 DB데이터와 불일치하면

    • 이클립스 console창에 실행완료(수정실패) : 0 출력
    • html파일에서는 탈퇴실패 문구 출력된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%
//3. sql작성 & pstmt객체생성
String sql = "delete from itwill_member where name=? && jumin=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, jumin);

int val = pstmt.executeUpdate();
if(val > 0){
System.out.println("실행완료(수정완료) : "+ val);
%><%=name %>님, 정상적으로 탈퇴되었습니다.<%
}else{
System.out.println("실행완료(수정실패) : "+ val);
%>탈퇴실패<%
}
%>

3-2. select 후 delete하기

  • pstmt.executeUpdate();는 return값이 int이므로 int형 변수에 넣은 뒤 if조건문을 통해 진행여부를 html페이지에서 보여줄 수 있다.

  • 사용자입력값이 DB데이터와 일치하는지 select로 확인후 일치하면

    • delete구문으로 데이터 삭제
  • 사용자입력값이 DB데이터와 일치하는지 select로 확인후 불일치하면

    • 삭제동작없이 이전페이지로 이동

DB에서 delete은 매우 신중한 작업이다.
따라서 정확한 데이터를 찾아 정확하게 처리해야하기때문에 전자보단 후자를 사용해야한다.

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
<% //3. sql작성 & pstmt객체생성
String sql = "select name jumin from itwill_member where name=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);

ResultSet rs = pstmt.executeQuery();
if(rs.next()){ //레코드셋에서 커서를 옮겨서 데이터가 있을 때 실행하겠다.
//이름과 주민번호가 있는 회원의 정보가 존재한다 =>삭제
if(jumin.equals(rs.getString("jumin"))){
sql = "delete from itwill_member where name=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.execute();
System.out.println("회원삭제완료");
}else{ //이름은 있지만 주민번호가 다른 경우 =>삭제동작없이 이전페이지로 이동
%>
<script type="text/javascript">
alert("주민번호 오류")
history.back(); //뒤로가기.
</script>
<%
}
}else{
//이름에 해당하는 주민번호가 존재하지않음 => 즉,비회원이므로 삭제동작없이 이전페이지로 이동
%>
<script type="text/javascript">
alert("이름 오류")
history.back(); //뒤로가기.
</script>
<%
}
%>

[ITWILL : JSP]쿠키(Cookie)

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

  • 클라이언트쪽에서 저장되어 관리되는 정보.

    • 이름, 값, 유효기간 도메인(주소), 경로 … 등등 포함하고 있다.
  • ㅋ쿠기의 이름은 알파벳, 숫자조합으로 생성됨

    • 공백, 괄호, 등호, 콤마, 세미콜론 등등은 인코딩작업 후 쿠키로 사용할 수 있다.
  • 브라우저가 종료되어도 상관없이 지정된 생존기간까지 사용가능.(클라이언트의 HDD하드디스크에 저장되기때문에 브라우저 종료되어도 계속 데이터를 유지할수있다.)

  • 쿠키생성하면서 값을 입력하였다고 쿠키가 메모리 또는 하드디스크에 저장된 것이 아니다. 쿠키를 생성하였으면 생성한 쿠키를 클라이언트로 전송해줘야한다.

  • 단점 : 클라이언트에서 관리되기 때문에 보안에 취약(하드디스크에 있는 쿠키파일 수정할수있기때문)

  • 반대개념은 세션(Session) : 서버쪽에서 저장되어 관리되는 정보, 서버종료되면 사용불가

https://tansfil.tistory.com/58

1-1. 왜 쿠키가 필요할까?

  • 서버는 클라이언트의 1건의 요청에 응답 후 연결을 끊는다.
    WHY?
    서버가 요청오는 모든 클라이언트와 계속 연결이 되어있으면 서버쪽에 부담이 되기때문에!
  • 이때 요청에 응답하면서 쿠키를 함께 보낸다.
    WHY?
    아 옛날에 그 클라이언트구나?! 하면서
    클라이언트를 구분해서 인지할수있고 빠른 응답이 가능하기때문에!

1-2. 쿠키사용방법

  1. 쿠키 생성하기
  • 서버
    1. 서버는 쿠키 객체를 생성
    2. 서버는 쿠키에 필요한 설정을 지정(유효기간, 설명, 도메인, … 등등)
    3. 서버가 생성된 쿠키를 HDD에 저장 후 클라이언트에 쿠키를 전달
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<h1>쿠키테스트(서버 역할)</h1>
<%
//1.쿠키객체생성 : 기본생성자이면 에러가 뜨니 기본값을 직접 입력해주거나 꼭 파라미터를 작성할 것
//아래처럼 직접 입력시 공백있으면 에러남 ex)"Cookie Val!" =>에러발생
Cookie ck = new Cookie("cName", "CookieValue!");

//2.쿠키에 필요한 설정 : 시간설정(사용할 수 있는 시간을 지정)
ck.setMaxAge(600); //초단위, 600초 = 10분(60초*10)

//3.쿠키정보를 저장해서 응답
response.addCookie(ck);
%>

<script type="text/javascript">
alert("쿠키값생성 후 저장됨");
location.href="cookieTest.jsp";
</script>
  1. 쿠키 사용하기
  • 브라우저(클라이언트)
    1. 브라우저에서 요청시 쿠키정보를 가져옴
    2. 쿠키값은 (이름, 값)쌍으로 만들어진 배열.
    3. 쿠키값의 이름을 사용해서 쿠키 객체를 사용.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<h1>쿠키테스트(클라이언트 역할)</h1>
<%
//1. 쿠키정보가져오기
Cookie[] cks = request.getCookies();
String cName="";
String cValue="";

if(cks != null){
for(int i=0; i < cks.length; i++){
if(cks[i].getName().equals("cName")){
//2. 저장된 쿠키 이름을 가져온다
cName = cks[i].getName();
//3. 쿠키값을 가져온다
cValue = cks[i].getValue();
}
}
}
%>

<h2> 쿠키이름 : <%=cName %> </h2>
<h2> 쿠키값 : <%=cValue %> </h2>
<input type="button" value="쿠키값 저장" onclick="location.href='cookieSet.jsp'">
<input type="button" value="쿠키값 삭제" onclick="location.href='cookieDel.jsp'">
  1. 특정 쿠키 삭제하기
  • 쿠키값이 있을때만 삭제진행
  • 쿠키 배열의 처음부터 끝까지 비교하여 쿠키이름이 “cName”인 대상을 찾아서 삭제 -> 변경된 쿠키 정보를 클라이언트에 전달
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%
//1.쿠키 가져오기 : 지울 쿠키가 있는지부터 체크
Cookie[] cookies = request.getCookies();
String cName="";
String cValue="";

//2. 쿠키값이 있을때만 삭제동작 진행
if(cookies != null){
for(int i=0; i < cookies.length; i++){
// 3. 쿠키이름이 "name"인 대상을 찾아서 삭제 = 쿠키의 유효시간을 0으로 설정하여 만료시킨다
if(cookies[i].getName().equals("cName")){
cookies[i].setMaxAge(0);
// 4. 변경된 쿠기 정보를 다시 클라이언트에 전달
response.addCookie(cookies[i]);
}
}
}
%>
<script type="text/javascript">
alert("쿠키값 삭제 성공")
location.href="cookieTest.jsp"
</script>
  1. 전체 쿠키 삭제
  • 쿠키값이 있을때만 삭제진행
  • 쿠키 배열의 전체를 찾아서 삭제 -> 변경된 쿠키 정보를 클라이언트에 전달
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%
//1.쿠키 가져오기 : 지울 쿠키가 있는지부터 체크
Cookie[] cookies = request.getCookies();
String cName="";
String cValue="";

//2. 쿠키값이 있을때만 삭제동작 진행
if(cookies != null){
for(int i=0; i < cookies.length; i++){
// 3. 쿠키 전체의 유효시간을 0으로 설정하여 만료시킨다
cookies[i].setMaxAge(0);
// 4. 변경된 쿠기 정보를 다시 클라이언트에 전달
response.addCookie(cookies[i]);
}
}
}
%>
<script type="text/javascript">
alert("쿠키값 삭제 성공")
location.href="cookieTest.jsp"
</script>

1-3. 크롬 개발자도구로 쿠키 확인하기

쿠키를 확인하는 방법은

  1. 크롬 개발자도구를 오픈
  2. NETWORK 탭에서 NAME카테고리에서 내가 만든 jsp파일클릭
  3. Cookies 탭클릭
  4. 세션아이디(jsessionid)위에 쿠기가 생성된 것을 확인할 수 있다.

1-4. 쿠키예시

  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
    <h1>쿠키form</h1>

    <!-- 폼태그 언어값에 따라서 달라지는 출력값 구현 -->
    <%
    //1.쿠키정보가져오기

    Cookie[] ck = request.getCookies();
    String lang = "";

    if(ck != null){
    for(int i=0; i<ck.length; i++){
    if(ck[i].getName().equals("lang")){
    lang = ck[i].getValue();
    }
    }
    }

    %>

    <form action="cookiePro.jsp" method="post" name="fr">
    <input type="radio" name="language" value="kor"
    <% if(lang.equals("kor")){ %>
    checked
    <%} %>
    >한국어
    <input type="radio" name="language" value="eng"
    <% if(lang.equals("eng")){ %>
    checked
    <%} %>
    >영어(미국)
    <input type="submit" value="언어설정">
    </form>

    <%
    if(lang.equals("kor")){
    out.print("안녕하세요, 쿠키연습!");
    }else if(lang.equals("eng")){
    out.print("Hello, Cookie Test!");
    }else{ //설정값없을때
    out.print("");
    }
    %>
  2. 쿠키프로페이지 생성하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <h1>쿠키pro</h1>

    <%
    System.out.println("라디오버튼 결과값 : "+ request.getParameter("language"));

    //1.쿠키객체생성 : 기본생성자이면 에러가 뜨니 기본값을 직접 입력해주거나 꼭 파라미터를 작성할 것 , 직접입력시 공백있으면에러남
    Cookie ck = new Cookie("lang", request.getParameter("language"));
    //두번째방법 : 첫번째 방법도 쓸수있어야한다(짧은 코드)
    //String lang = request.getParameter("language");
    //Cookie ck = new Cookie("lang", lang);

    //2.쿠키에 필요한 설정 : 시간설정(사용할 수 있는 시간을 지정)
    ck.setMaxAge(120); //초단위, 600초 = 10분(60초*10)
    //3.쿠키정보를 저장해서 응답
    response.addCookie(ck);
    //response.sendRedirect("location href='cookieForm.jsp'");
    %>

    <script type="text/javascript">
    alert("언어설정완료!");
    location.href="cookieForm.jsp";
    </script>