티스토리 뷰
HW4 solution
1. 오라클 DB 넣기
JDBC library 추가 > C : oraclexe > app > oracle > product > 11.2.0 > server > jdbc > lib > ojdbc6.jar
2. 쿼리 만들기(DBConnection)
- 로그인 기능 : 사이드프로젝트에서 썼던 거 그대로 쿼리 가져오기
insert ,
select_all ,
select_by_userid ,
update ,
delete ,
sql_select_by_userid_password
insert(등록)
select_all(전체 조회)
select_by_userid(아이디로 전체 조회)
update(수정)
delete(삭제)
sql_select_by_userid_password( 사용자 아이디와 비밀번호를 이용하여 데이터베이스에서 해당 사용자의 ID를 찾기 )
** 한 번에 해결할 수 있는 건 쿼리에서 , 그게 안되는 건 자바에서 처리하도록 하기!
url 호출은 get 방식(server)
3. DAO에서 기능 다 만들기
4. DAOImple 오버라이드해서 메소드 채우기
@Override
public MemberVO select(String userid) {
MemberVO vo =null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
DriverManager.registerDriver(new OracleDriver());
conn = DriverManager.getConnection(URL,USER,PASSWORD);
System.out.println("오라클 연결 성공");
pstmt = conn.prepareStatement(SQL_SELECT_BY_USERID);
pstmt.setString(1, userid); // ?로 표시된 첫 번째 매개변수 위치에 userid 값을 넣겠다
rs = pstmt.executeQuery(); // 설정된 쿼리를 실행하고 그 결과를 ResultSet 객체에 저장
if(rs.next()) {
// userid = rs.getString(COL_USERID);
String password = rs.getString(COL_PASSWORD);
String email = rs.getString(COL_EMAIL);
String emailAgree = rs.getString(COL_EMAIL_AGREE);
String[] interest = rs.getString(COL_INTEREST).split(",");
String phone = rs.getString(COL_PHONE);
String introduce = rs.getString(COL_INTEREST);
vo = new MemberVO(userid, password, email, emailAgree, interest, phone, introduce); // 조회된 정보를 vo(객체)에 담는 것
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeResource(conn, pstmt, rs);
}
return vo;
}
@Override
public int update(MemberVO vo) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
DriverManager.registerDriver(new OracleDriver());
conn = DriverManager.getConnection(URL, USER, PASSWORD);
pstmt = conn.prepareStatement(SQL_UPDATE);
pstmt.setString(1, vo.getPassword()); // ?로 표시된 매개변수 위치에 vo에서 pw 값을 읽어서 넣겠다
pstmt.setString(2, vo.getEmail());
pstmt.setString(3, vo.getEmailAgree());
pstmt.setString(4, vo.getInterestJoin());
pstmt.setString(5, vo.getPhone());
pstmt.setString(6, vo.getIntroduce());
pstmt.setString(7, vo.getUserid());
result = pstmt.executeUpdate(); // 설정된 쿼리를 실행하고 그 결과를 ResultSet 객체에 저장
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeResource(conn, pstmt);
}
return result;
}
@Override
public int delete(String userid) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
DriverManager.registerDriver(new OracleDriver());
conn = DriverManager.getConnection(URL, USER, PASSWORD);
pstmt = conn.prepareStatement(SQL_DELETE);
pstmt.setString(1, userid);
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeResource(conn, pstmt);
}
return result;
}
5. RegisterServlet.java 오기
- memberRegister.jsp 에서 전송된 데이터를 DB에 저장
doPost() :
HTTP POST 요청 발생 시 호출
member 로그 찍기
꼭 찍어야 하는 로그 (택배가 오면 잘 왔는지 확인)
- DB 저장에 성공하면 login.jsp 페이지로 이동
원래 코드는
insert가 성공하면 result 가 1이 나오니깐
if문으로 response.sendRedirect() 로 login.jsp로 보내는 거였음
+ 추가 과제로
alert로 등록 성공을 띄우는 처리를 할 때가 아래 코드
PrintWriter out = response.getWriter(); 는
ServletResponse의 메서드 중 하나이며, 클라이언트로 응답을 보낼 때 사용된다.
이걸 통해서 servlet은 자바안에 HTML을 넣을 수 있다!
여기서 response.sendRedirect() 는 순서와 상관없이 바로 페이지로 이동시켜서
alert() 가 안뜬다.ㅎ그래서 location.href='login.jsp'를 쓰는 것
6. login.jsp
TODO : <a> 태그를 이용하여 memberRegister.jsp 이동 링크 생성
TODO : 로그인 form 생성. action="loginAuth.do" method="post"
form에 입력한 id,pw를 싸서 " post "
Loginservlet 으로 보낸다!
7. LoginServlet
TODO : login.jsp에서 입력받은 아이디, 패스워드를 DB의 데이터와 비교해서
DB 값과 비교 하려면 DB를 가져와야하니깐 dao 가져오고
데이터가 일치하면 - 로그인 세션 생성 및 로그인 성공(loginResult.jsp)로 이동
(아이디 값에 대한 세션 생성. 세션 만료 시간 60초)
데이터가 일치하지 않으면 - login.jsp로 이동(심심하면 실패 alert 띄우기)
doPost()에서
jsp에서 id,pw 받아와야하니깐
request.getParameter() 써서 가져오고
* request.getParameter() 로 꺼내는 이유?
- jsp에서 form 형태로 보내면 servlet에서
parameter로 꺼낸다
cilent -> server (request.getParameter()메서드를 사용하기) *
DB에 있는 아이디 ,비번과 일치해야하니깐 select( 사용자 아이디와 비밀번호를 이용하여 데이터베이스에서 해당 사용자의 ID를 찾기 ) 메소드를 이용해서
입력받은 아이디와 비밀번호가 일치하면
해당 아이디를 confirmUserid에 저장한다.
이렇게 받아오는 과정이 있으면 확인차 로그를 찍어준다!
세션을 가져오고
cofirmUserid 가 있으면 ( confirmUserid != null )
아이디 값에 대한 session을 생성하고
세션 만료 시간을 60초로 둔다.
데이터가 일치하지 않으면( else ) , login.jsp로 이동.
여기서 response.sendRedirect() 는 순서와 상관없이 바로 페이지로 이동시켜서
alert() 가 안뜨므로,
location.href='login.jsp'를 쓰는 것
위 코드에서 location.href 썼잖아.
일반적으로
브라우저에서 JavaScript의 location.href를 사용하여 URL을 변경할 때는
해당 URL로 GET 요청이 전송되며,
Servlet에서 요청을 처리하기 위해
doGet() 메서드를 사용하고,
클라이언트에게 다른 페이지로 리다이렉트를 하려면 response.sendRedirect() 메서드를 사용한다.
이 메서드는 클라이언트에게 다른 URL로 이동하도록 요청하며,
이때 클라이언트는 해당 URL로 GET 요청을 보낸다.
또한 GET 요청을 사용하여 서버 -> JSP로 데이터를 전달 할 수 있다.
7. loginResult.jsp
회원정보 보기 / 로그아웃 페이지
location.href로 이동하면 servlet에서 doGet()을 호출
ㄴ GET방식으로 동작
* doGet :
서버에 데이터를 보낼때 (servlet -> jsp)
* doPost :
개발자용. 감싸서 보는 것
jsp에서 데이터를 꺼내거나 수정할때(client -> server) (jsp -> servlet)
이 코드는 session에서 "userid"라는 이름의 속성(attribute)을 가져와서
해당 사용자의 ID를 가져오는 것이다.
따라서 이 속성은 클라이언트가 로그인을 한 후 세션에 저장된 것으로, GET 요청에 직접적으로 온 것이 아니다.
" location.href로 이동하면 servlet에서 doGet()을 호출 "이라는 말은
client에서 아래 코드의 location.href를 통해 URL을 이동할 때,
일반적으로 브라우저는 해당 URL(select.do & logout.do)에 GET 요청을 보내게 된다.
따라서 해당 URL로 이동하면
해당 서블릿( SelectServlet & LogoutServlet )의 doGet() 메서드가 호출되어 처리를 하게 된다.
<button onclick="location.href='select.do'">회원정보</button>를 사용하면
클라이언트(jsp) 측에서 JavaScript의 onclick 이벤트를 통해 버튼을 클릭했을 때 지정된 URL('select.do')로 이동하게 됩니다.
8. SelectServlet
이제는 회원 정보 서버로 넘어왔는데
위에서 본 것처럼 doGet() 메서드가 호출됨.
TODO : loginResult.jsp에서 이동
로그인된 사용자의 정보를 DB에서 select
select된 MemberVO 데이터를 memberResult.jsp로 전송
사용자 정보를 가져와야하니깐 DB 연결
doGet() 메서드
로그인을 한 후, session에 저장됐으니깐
session 불러오고
사용자 아이디 가져와서
해당 아이디가 있다면(not null)
daoImple의 select(String userid)에
해당 아이디를 담아서
vo 객체에 저장
forword(포워딩) 은 jsp 경로가 안나온다.
포워딩을 통해 JSP로 전환되더라도 클라이언트에게는 그것이 어떤 페이지인지에 대한 정보는 전달되지 않는다.
클라이언트는 오직 서버로부터 받은 최종 응답만을 확인할 수 있다.
포워딩은 서버 내부에서만 이루어지며, 클라이언트는 이 과정을 알지 못한다.
// 이 부분 더 공부가 필요한
9. memberResult.jsp
TODO : 회원 정보 출력
TODO : 회원 수정 버튼 생성(경로 : memberUpdate.jsp)
TODO : 회원 탈퇴 버튼 생성(경로 : delete.do)
SelectServlet에서 memberResult.jsp로 포워딩할 때
RequestDispatcher.forward()를 사용했기 때문에,
memberResult.jsp에서는
request.getAttribute()를 통해 데이터를 전달받을 수 있다!
request.getAttribute() 메서드는 Object 타입을 반환하므로,
받아온 데이터를 원하는 타입(MemberVO)으로 형변환!
location.href 를 사용했으므로
delete.do로 이동할때
doGet() 방식으로 갈것
먼저 memberUpdate.jsp 로 이동ㄱㄱ
10. MemberUpdate.jsp
TODO : 로그인된 사용자 아이디를 저장
TODO : form action="update.do" method="post" 생성
TODO : userid를 제외한 모든 정보 수정 가능하도록 input 태그 생성
userid는 읽기만 가능하도록 input 태그 생성
로그인을 한 후, session에 저장됐으니깐
getAttribute()로 userid 를 가져옴
해당 폼을 사용하여 사용자의 입력 데이터를 update.do 서블릿으로 POST 방식으로 전송할 수 있다.
userid를 제외한 모든 정보 수정 가능하도록 input 태그 생성
userid는 읽기만 가능하도록 input 태그 생성
실행 화면
11. UpdateServlet
TODO : memberUpdate.jsp에서 전송된 데이터로 DB 회원 정보 수정
회원 정보 수정에 성공하면 memberResult.jsp에 MemberVO 데이터 전송하여 출력
DB 정보 불러오고
RegisterServlet 처럼
update 데이터 불러오고
로그 찍기
update() 하고
DB에 등록이 된다면
dispatcher로
클라이언트는 오직 서버로부터 받은 최종 응답만을 확인할 수 있어서
보안상의 이유는 아님 (doPost() 자체가 보안이 되기 때문에)
** 강의 영상보고 보충하기
12. DeleteServlet
TODO : memberResult.jsp에서 이동
로그인된 사용자 아이디를 가져와서 DB에 회원 정보 삭제
삭제 성공 후에 login.jsp 페이지로 이동
DB 가져오기
로그인을 한 후, session에 저장됐으니깐
getAttribute()로 userid 를 가져옴
삭제 성공 후에 login.jsp 페이지로 이동
sendRedirect() 는 먼저 실행하면 remove가 안되서
마지막에 배치한다
로그아웃 시에는 세션에서
사용자 정보를 제거하는 것이 좋다.
이렇게 함으로써 사용자의 세션을 종료하지 않더라도
사용자의 인증 정보를 삭제할 수 있다.
'백엔드 교육과정 > 4월' 카테고리의 다른 글
2024.04.09 _ SSR & CSR , JQuery_Ajax, 퀴즈 (0) | 2024.04.09 |
---|---|
2024.04.08 _ JSP Servlet ( form형태 get/post 데이터 처리 방식 ) , JSON, JSTL, AJAX (0) | 2024.04.08 |
2024.04.04 _ HW4(회원가입 및 로그인 홈페이지 만들기) 제출 (문제점 찾기) (0) | 2024.04.04 |
2024.04.03_ HW3 과제, Filter , 회원가입 및 로그인 홈페이지 만들기(HW4) (0) | 2024.04.03 |
2024.04.02_ Cookie 과제 , Session , cookie와 session의 차이점 , 실습 (0) | 2024.04.02 |