티스토리 뷰

세세한것은 아직 다 모르지만 MVC2구조가 어떻게 작성되서 사용되는지 전체적인 흐름을 잘 이해하고 가자.

MVC2 구조와 흐름 사진

 

많은 작업을 했지만 2가지정도만 기록함.

User controller 작업은 끝남.

User controller.java 화면

package com.example.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.example.user.model.UserVO;
import com.example.user.service.UserService;
import com.example.user.service.UserServiceImpl;

@WebServlet("*.user")
public class UserController extends HttpServlet {
   private static final long serialVersionUID = 1L;


   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doAction(request, response);
   }

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doAction(request, response);
   }

   //get, post 하나로 묶음
   protected void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      //한글처리
      request.setCharacterEncoding("UTF-8");

      //요청분기
      String uri = request.getRequestURI();
      String path = request.getContextPath();

      String command = uri.substring(path.length());

      System.out.println("요청경로:" + command);

      //서비스 영역
      UserService service = new UserServiceImpl();
      
      switch (command) {
      case "/user/user_join.user": {

         request.getRequestDispatcher("user_join.jsp").forward(request, response);

         break;
      }
      case "/user/joinForm.user": {//회원가입기능

         int result = service.join(request, response);

         if(result >= 1) {//아이디 중복
            //메시지
            request.setAttribute("msg", "아이디 or email이 중복입니다");
            request.getRequestDispatcher("user_join.jsp").forward(request, response);
         } else {//가입성공
            //MVC2에서 리다이렉트는 다시 컨트롤러를 태우는 요청
            response.sendRedirect("user_login.user");
            break;
         }
      }
      case "/user/user_login.user": {//로그인페이지
         request.getRequestDispatcher("user_login.jsp").forward(request, response);
         break;
      }
      case "/user/loginForm.user": {//로그인요청
         
         UserVO vo = service.login(request, response);
         
         if(vo == null) {//로그인실패
            request.setAttribute("msg", "아이디 비밀번호를 확인하세요");
            request.getRequestDispatcher("user_login.jsp").forward(request,response);
            
         } else {//로그인성공
            //세션에 아이디, 이름을 저장
            HttpSession session = request.getSession(); //자바에서 현재 세션 얻는 방법
            session.setAttribute("user_id", vo.getId());
            session.setAttribute("user_name", vo.getName());
            
            //마이페이지
            response.sendRedirect("user_mypage.user");
         }
         
         break;
         
      }
      case "/user/user_mypage.user": {//마이페이지
         
         request.getRequestDispatcher("user_mypage.jsp").forward(request,response);
         
         break;
         
      }
      case "/user/user_logout.user": {//로그아웃
         
         HttpSession session = request.getSession();
         session.invalidate(); //세션무효화
         
         //response.sendRedirect("/JSPWep/index.main");//메인으로
         response.sendRedirect(path + "/index.main");
         
         break;
         
      }
      case "/user/user_modify.user":{//정보수정화면
         /* *****회원데이터를 가지고 나오는 작업.****
          * service와 dao에 getInfo() 메서드를 선언합니다.
          * service에서는 세션에서 아이디를 얻습니다.
          * dao에서는 id를 전달받아 회원 데이터를 조회하여 vo에 저장합니다.
          * controller에서는 조회한 vo를 저장하고 화면으로 가지고 나갑니다.
          * 화면에서는 input태그에 값을 출력해주세요.
          */
         
         UserVO vo2 = service.getInfo(request,response);
         request.setAttribute("vo", vo2);//키, 값
         request.getRequestDispatcher("user_modify.jsp").forward(request, response);
         
         break;
      }
      case "/user/updateForm.user" :{
         
         /*
          * ****회원정보를 업데이트 하는 작업****
          * service와 dao에 update() 메서드를 생성
          * service의 필요한 파라미터 값을 받습니다 (pw,name,gender) 조건절 (id)
          * dao에서 데이터를 전달받아서 업데이트를 실행
          * 업데이트 이후에는 컨트롤러를 태워서 mypage로 리다이렉트
          */
         
         int result2 = service.update(request, response);
         if(result2 == 1) {//업데이트 성공
            //response.sendRedirect("user_mypage.user");
            
            //out객체를 이용해서 화면에 스크립트를 작성해서 보냄
            response.setContentType("text/html; charset=utf-8");
            PrintWriter out = response.getWriter();
            out.println("<script>");
            out.println("alert('정보가 수정되었습니다.')");
            out.println("location.href='user_mypage.user';");
            out.println("</script>");
            
         } else {//업데이트 실패
            response.sendRedirect("user_modify.user");
         }
         
         break;
      }
      
      case "/user/user_delete.user":{
         
         int result3 = service.delete(request, response);
         
         if(result3 == 1) {//삭제(회원탈퇴)성공
            response.sendRedirect(path+"/index.main"); //메인화면
         } else {
            response.sendRedirect("user_mypage.user"); //마이페이지
         }
         
         
         break;
      }
      
      default: {
         break;
      }

      }

   }
}

 

 

 

<User controller 작업>

#회원 정보를 업데이트 하는 작업

로그인 창-> 정보수정 클릭
회원정보 수정 창

회원정보를 변경해서 테이블에 기존의 데이터 행에 변경사항을 적용해줄 것임.( 쿼리문 update set 이용)

 

-User 컨트롤러 창에서 시작.

컨트롤러에서 필요한 기능 내용

 

컨트롤러의 기능을 구현하기 위해서 서비스 영역(interface 와 interface의 기능을 구현하는 클래스로 이루어짐)으로 가자.

interface 에 필요로 하는 기능을 수행할 메서드를 선언한다.

package com.example.user.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.user.model.UserVO;

public interface UserService {
	
	public int join(HttpServletRequest request, HttpServletResponse response); //가입처리
	public UserVO login(HttpServletRequest request, HttpServletResponse response); //로그인
	public UserVO getInfo(HttpServletRequest request, HttpServletResponse response);//회원정보조회
	public int update(HttpServletRequest request, HttpServletResponse response);//회원정보 변경 업데이트
	public int delete(HttpServletRequest request, HttpServletResponse response);//회원정보 삭제
}

 

지금 필요로하는 기능은 회원정보 변경 업데이트 이므로 

update 메소드를  이 인터페이스의 기능을 구현하는 클래스인 UserInterfaceImpl 클래스에서 오버라이딩 한다.

package com.example.user.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.example.user.model.UserDAO;
import com.example.user.model.UserVO;

public class UserServiceImpl implements UserService{
	//컨트롤러의 역할을 분담
	//가입처리
	public int join(HttpServletRequest request, HttpServletResponse response) {
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		String gender = request.getParameter("gender");
		
		//아이디 or email중복 검사 -> 가입
		UserDAO dao = UserDAO.getInstance();
		int result = dao.idCheck(id, email);
		
		if(result >= 1) {//중복
			return 1; //중복의 의미반환
		} else {//중복x -> 가입
			UserVO vo = new UserVO(id, pw, name, email, gender);
			dao.join(vo);
			return 0; //성공의 의미 반환
		}
		
	}

	@Override
	public UserVO login(HttpServletRequest request, HttpServletResponse response) {
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		UserDAO dao = UserDAO.getInstance();
		UserVO vo = dao.login(id, pw);
		
		
		return vo;
	}

	// 회원정보 수정 - 세션에서 아이디 얻기.
	public UserVO getInfo(HttpServletRequest request, HttpServletResponse response) {
		
		//세션에서 user_id값을 얻음
		HttpSession session = request.getSession();
		String id = (String)session.getAttribute("user_id");
		
		//dao객체생성
		UserDAO dao = UserDAO.getInstance();
		UserVO vo = dao.getInfo(id);
		
		return vo;
	}

	//변경할 회원정보 업데이트
	public int update(HttpServletRequest request, HttpServletResponse response) {
		//dao클래스의 update()메서드 성공 결과를 담을 int변수
		int result = 0;
		
//		//지금 회원정보변경을 하는 사용자의 아이디를 세션에서 구해옴.
//		HttpSession session = request.getSession();
//		String id = (String)session.getAttribute("user_id");
		
		//필요한 데이터 가져오기.
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
		String id = request.getParameter("id");
		
		//dao객체생성
		UserDAO dao = UserDAO.getInstance();
		//dao객체에 update()메서드 실행하고 결과 담기.
		result = dao.update(pw, name, gender, id);
		System.out.println(result);
		
		if(result == 1) {
			HttpSession session = request.getSession();
			session.setAttribute("user_name", name);
		}
		
		return result;
	}

	@Override
	public int delete(HttpServletRequest request, HttpServletResponse response) {
		
		//id가 필요
		HttpSession session = request.getSession();
		String id = (String)session.getAttribute("user_id");
		
		UserDAO dao = UserDAO.getInstance();
		int result = dao.delete(id);
		
		if(result == 1) {//삭제 성공
			session.invalidate();
		}
		
		return result;
	}
	
}

 

회원정보 변경 페이지에서 <form> 태그로 값이 넘어왔으니 request.getParameter("태그네임") 으로 값을 변수에 저장한다.

이때 기존에 있는 회원 id를 통해서 데이터베이스에 있는 기존 회원의 데이터를 찾아서 내용을 변경할것임.

로그인 시에 session에서 이미 id가 저장되어 있어서 session에서 id 데이터를 가져올 수 있으나. 

이전 페이지인 modify(회원정보 수정) 페이지에서 id 값도 함께 넘어오므로 이번에는 session이 아닌 리퀘스트를 통해 

id 값을 전해 받았다. 

session 에 데이터가 저장될 때 지어진 데이터 변수명 하고 <form> 태그에서 넘어오는 데이터의 name이 다름으로 꼭 둘이 헷갈리지 않게 조심하자. 

 

받은 데이터들을 데이터베이스에 작업해주기 위해 MODEL(vo,dao,데이터베이스) 영역으로 넘어간다.

 

DAO 클래스에 위 데이터 값들을 갖고 작업해주기 위한 update() 메서드를 작성한다.

//회원정보 수정
	public int update(String pw, String name, String gender ,String id) {
		int result = 0; //메서드 기능 성공실패 반환을 저장할 변수
		
		String sql = "update users set pw=? , name=?, gender=? where id = ?";
		
		try {
			conn = DriverManager.getConnection(URL, UID, UPW);
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, pw);
			pstmt.setString(2, name);
			pstmt.setString(3, gender);
			pstmt.setString(4, id);
			
			result = pstmt.executeUpdate(); //성공시 1반환, 실패시 0반환 
			
		} catch(Exception e) {
			e.getStackTrace();
		} finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		
		return result;
		
	}

 

모델에서 데이터베이스에 값을 변경해주는 작업이 끝났으니 

서비스 클래스에서 메서드를 마무리 지어준다.

 

	//변경할 회원정보 업데이트
	public int update(HttpServletRequest request, HttpServletResponse response) {
		//dao클래스의 update()메서드 성공 결과를 담을 int변수
		int result = 0;
		
//		//지금 회원정보변경을 하는 사용자의 아이디를 세션에서 구해옴.
//		HttpSession session = request.getSession();
//		String id = (String)session.getAttribute("user_id");
		
		//필요한 데이터 가져오기.
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
		String id = request.getParameter("id");
		
		//dao객체생성
		UserDAO dao = UserDAO.getInstance();
		//dao객체에 update()메서드 실행하고 결과 담기.
		result = dao.update(pw, name, gender, id);
		System.out.println(result);
		
		if(result == 1) {
			HttpSession session = request.getSession();
			session.setAttribute("user_name", name);
		}
		
		return result;
	}

 

필요로 하는 기능을 수행할 메서드 작성이 서비스 클래스에서 완성이 되었다.

이제 컨트롤러로 돌아와서 기능을 수행해주고 작업이 끝난 후 보여줄 화면으로 페이지를 이동시켜준다.

    case "/user/updateForm.user" :{
         
         /*
          * ****회원정보를 업데이트 하는 작업****
          * service와 dao에 update() 메서드를 생성
          * service의 필요한 파라미터 값을 받습니다 (pw,name,gender) 조건절 (id)
          * dao에서 데이터를 전달받아서 업데이트를 실행
          * 업데이트 이후에는 컨트롤러를 태워서 mypage로 리다이렉트
          */
         
         int result2 = service.update(request, response);
         if(result2 == 1) {//업데이트 성공
            //response.sendRedirect("user_mypage.user");
            
            //out객체를 이용해서 화면에 스크립트를 작성해서 보냄
            response.setContentType("text/html; charset=utf-8");
            PrintWriter out = response.getWriter();
            out.println("<script>");
            out.println("alert('정보가 수정되었습니다.')");
            out.println("location.href='user_mypage.user';");
            out.println("</script>");
            
         } else {//업데이트 실패
            response.sendRedirect("user_modify.user");
         }
         
         break;
      }

회원정보가 수행되고 다음에 보여줄 페이지인 mypage 로  컨트롤러를 타고 페이지가 넘어갈 수 있도록

response.sendRedirect("컨트롤러 경로") 를 통해 페이지 전환을 해줌으로서

하나의 기능에대한 작업이 완료됨.

 

-회원정보 변경 구현-

변경할 정보를 작성해주고 정보수정 버튼을 눌러준다.

 

작업이 끝난 후 마이페이지로 넘어온것을 확인할 수 있다.

끝.

 

 

<board  작업>

#사전 작업

-보여줄 페이지 작성 - board_content, list, modify, write .jsp

-header, footer 부분 나눠서 header,footer파일 작성.

 각각의 페이지 상단 하단부에 include문 이용해서 위에 header, footer 파일의 내용들을 참조.

-그다음  밑에작업 수행-

1.BoardController생성
2.BoardController URL을 나누고, 화면을 띄우는 프로그램코드

 

-BoardController.java 파일

package com.example.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.board.service.BoardService;
import com.example.board.service.BoardServiceImpl;

@WebServlet("*.board")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doAction(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doAction(request, response);
	}

	protected void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//한글처리
		request.setCharacterEncoding("UTF-8");

		//요청분기
		String uri = request.getRequestURI();
		String path = request.getContextPath();
		String command = uri.substring(path.length());

		System.out.println("요청경로:" + command);
		
		
		if(command.equals("/board/board_write.board")) {//등록화면
			
			request.getRequestDispatcher("board_write.jsp").forward(request, response);
			
		} else if(command.equals("/board/board_list.board")) {//목록화면
			
			request.getRequestDispatcher("board_list.jsp").forward(request, response);
			
		} else if(command.equals("/board/board_content.board")) {//상세내용화면
			
			request.getRequestDispatcher("board_content.jsp").forward(request, response);
			
		} else if(command.equals("/board/board_modify.board")) {//수정화면
			
			request.getRequestDispatcher("board_modify.jsp").forward(request, response);
			
		} else if(command.equals("/board/registForm.board")) {//글 등록
			
			/*
			 *  1.service의 regist메서드로 연결
			 *  2.service에서 등록에 필요한 파라미터를 받습니다.
			 *  3.dao의 void regist() 메서드를 생성하고 insert작업
			 *  4.insert이후에 컨트롤러에서 리스트 화면으로 리다이렉트
			 */
			
			BoardService service = new BoardServiceImpl();
			service.regist(request, response);
			
			response.sendRedirect("board_list.board");
			
		}
		
		
	}
	
}

 

#작성한 글 등록하는 기능.

 1.service의 regist메서드로 연결
 2.service에서 등록에 필요한 파라미터를 받습니다.
 3.dao의 void regist() 메서드를 생성하고 insert작업
 4.insert이후에 컨트롤러에서 리스트 화면으로 리다이렉트

 

-BoardService.java 인터페이스에 regist메서드 작성.

regist 메서드는 매개변수로 request 객체랑 response 객체를 받음.

 

package com.example.board.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface BoardService {
	
	public void regist(HttpServletRequest request, HttpServletResponse response); //등록

}

-boardServiceImpl 이라는 boderService 인터페스의 기능을 수행하는 클래스에 regist() 메서드의 구현부 작성

package com.example.board.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.board.model.BoardDAO;

public class BoardServiceImpl implements BoardService{

	//작성한 글 등록 메서드
	public void regist(HttpServletRequest request, HttpServletResponse response) {
		
		String writer = request.getParameter("writer");
		String title = request.getParameter("title");
		String content = request.getParameter("content");
		
		BoardDAO dao = BoardDAO.getInstance();
		dao.regist(writer, title, content);
		
		
	}

}

위에 내용을 자세히 살펴보자.

boardService인터페이스의 regist()메서드를 오버라이딩 한다.

한 페이지에서 등록된 데이터가 form 태그를 통해 넘어와있다.

form태그로 넘어온 데이터는 request.getParameter()를 통해 받는다. 이때 받는 값은 모두 String.

 

받아온 이 데이터들을 모델(VO,DAO, 데이터베이스)과 연동하기 위해 

이제 DAO 클래스로 넘어가야한다.

VO클래스, DAO 클래스 작성.

이후에 DAO 클래스에 현재 regist() 메서드에서 받아온 데이터들을 갖고 데이터베이스 작업을 할 

regist()메서드를 만든다.

 

-BoardDAO.java 파일 

글 작성 페이지로부터 들어온 데이터들을 regist() 메서드의 매개변수로 받아서 쿼리문을 통해

데이터 베이스에 있는 테이블에 값을 저장해준다.

package com.example.board.model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.example.user.model.UserDAO;
import com.example.util.JDBCUtil;

public class BoardDAO {
	
	//BoardDAO는 불필요하게 여러개 만들어질  필요가 없기 때문에
		//한개의 객체만 만들어지도록 Singleton형식으로 설계합니다.
		
		//1. 나자신의 객체를 생성해서 1개로 제한합니다.
		private static BoardDAO instance = new BoardDAO();
		
		//2. 직접 객체를 생성 할 수 없도록 생성자에 private
		private BoardDAO() {
			//드라이버 클래스 로드
			
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
			} catch (Exception e) {
				System.out.println("드라이버클래스 로드에러");
			}
		}
		
		//3.외부에서 객체생성을 요구할 때 getter메서드를 통해 1번의 객체를 반환
		public static BoardDAO getInstance() {
			return instance;
		}
		
		//4.필요한 데이터베이스 변수 선언
		public String URL = "jdbc:oracle:thin:@localhost:1521:xe";
		public String UID = "jsp";
		public String UPW = "jsp";
		
		//원래 이렇게 만들면 안되고 지역변수로 만들어야함. 지금은 편의를 위해 이렇게 함.
		private Connection conn;
		private PreparedStatement pstmt;
		private ResultSet rs;
		
		//작성글 등록
		public void regist(String writer, String title, String content) {
			
			String sql = "insert into board (bno, writer, title, content) values(board_seq.nextval, ?, ?, ?)";
					
			try {
				conn = DriverManager.getConnection(URL, UID, UPW);
				
				pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, writer);
				pstmt.setString(2, title);
				pstmt.setString(3, content);
				
				int result = pstmt.executeUpdate();
				
				
			} catch (Exception e) {
				e.getStackTrace();
			} finally {
				JDBCUtil.close(conn, pstmt, rs);
			}
			
		}

}

 

이어서 다시 BoardServiceImpl 클래스(컨트롤러의 기능을 분담해줄 클래스) 에서 regist() 메소드 마무리.

	//작성한 글 등록 메서드
	public void regist(HttpServletRequest request, HttpServletResponse response) {
		
		String writer = request.getParameter("writer");
		String title = request.getParameter("title");
		String content = request.getParameter("content");
		
		BoardDAO dao = BoardDAO.getInstance();
		dao.regist(writer, title, content);
		
	}

이제 마지막으로 컨트롤러로 다시 돌아온다.

board_controller 화면

		} else if(command.equals("/board/registForm.board")) {//글 등록
			
			/*
			 *  1.service의 regist메서드로 연결
			 *  2.service에서 등록에 필요한 파라미터를 받습니다.
			 *  3.dao의 void regist() 메서드를 생성하고 insert작업
			 *  4.insert이후에 컨트롤러에서 리스트 화면으로 리다이렉트
			 */
			
			BoardService service = new BoardServiceImpl();
			service.regist(request, response);
			
			response.sendRedirect("board_list.board");
			
		}

인터페이스 타입에 인터페이스를 구현한 클래스를 담아주고 

regist() 메서드를 실행. 작성된 글의 내용이 데이터 베이스에 있는 테이블에 등록되었다.

그리고나서 페이지를  boadr_list (글 목록) 페이지로 보내준다.

이때 바로 페이지 주소를 통해 보내주는게 아니라 

mvc2 구조의 규칙을 따라서 컨트롤러를 통해서 페이지가 넘어가도록 경로를 작성해준다.

"board_list.board" 이렇게.

 

<기능 구현 순서>

글작성 후 작성완료.

 

작성완료 후 글 리스트 페이지로 넘어왔음.
작성된 글이 잘 등록되었음을 확인.

 

<기억할내용>
자바클래스에서 내용이 바뀌면 서버를 다시 시작해야함.

request

폼데이터 - getParameter(" ")
저장 - setAttribute(키, 값)
사용 - getAttribute(키)

response

sendRedirect()
addCookie()

session

setAttribute
getAtrribute
removeAttribute
invalidate

application

setAttribute
getAtrribute
removeAttribute
invalidate

request부터 데이터가 조회되기 때문에
requestScope는 생략 가능

댓글