반응형

# MVC01_11 회원 삭제하기(querystring)

## 쿼리 스트링(QueryString)

  • 삭제를 누르게 되면 회원의 특정 정보(보통 PK값)가 넘어갈 수 있도록하여 진행. 
  • 값을 넘기기 위해서는 물음표(?)를 사용한다. 아래와 같이 할 경우 vo.getNum() 값이 넘어가게 된다.
out.println("<th><a href='/MVC01/memberDelete.do?num="+ vo.getNum()+"'>삭제</a></th>");
  • 물음표를 이용해 값이 넘어가는 것은 GET 방식이고, 물음표 부터 뒤쪽 부분을 쿼리 스트링(QeuryString) 이라고 한다.

## MemberDeleteController.java Servlet 생성

  • kr.bit.controller 우 클릭 > New > Servlet 클릭하여 MemberDeleteController 이름 입력 후 Next > URL Mapping을 memberDelete.do로 변경 후 Service만 체크하여 Finish.
  • 아래와 같이 작업 진행.
  • package kr.bit.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 kr.bit.model.MemberDAO; @WebServlet("/memberDelete.do") public class MemberDeleteController extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int num = Integer.parseInt(request.getParameter("num")); MemberDAO dao = new MemberDAO(); int cnt = dao.memberDelete(num); if (cnt > 0) { response.sendRedirect("/MVC01/memberList.do"); } else { throw new ServletException("not delete"); } } }
  • 작업 및 MemberDAO 에 회원 삭제 기능 추가.
// 회원 삭제기능
	public int memberDelete(int num) {
		String SQL = "delete from member where num = ?";
		getConnect();
		int cnt = -1;
		try {
			ps = conn.prepareStatement(SQL);
			ps.setInt(1, num);
			cnt = ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			dbClose();
		}
		
		return cnt;
	}

 

반응형
반응형

# MVC01_9~10 회원리스트 가져오기(묶고(VO)-담고(List)), 회원리스트 보기

## member 테이블 unique key 설정

  • 현재 사용중인 member 테이블은 아래와 같이 생성했다.
create table member (
	num int primary key auto_increment,
	id varchar(20) not null,
	pass varchar(20) not null,
	name varchar(30) not null,
	age int not null,
	email varchar(30) not null,
	phone varchar(30) not null
)
  • 여기서 id에 UNIQUE KEY 설정.
  • PRIMARY KEY 의 경우 중복을 허용하지 않고, NULL도 허용하지 않는 것이다.
create table member (
	num int primary key auto_increment,
	id varchar(20) not null,
	pass varchar(20) not null,
	name varchar(30) not null,
	age int not null,
	email varchar(30) not null,
	phone varchar(30) not null,
	unique key(id)
)
  • 입력값에 대한 유효성 검사는 프론트에서 자바스크립트 또는 제이쿼리를 이용한다.

## MemberListController.java Servlet 생성

  • kr.bit.controller 우클릭 > New > Servlet 클릭
  • Servlet 이름 MemberListController로 설정, URL Mapping의 경우 /memberList.do 로 설정 후 Service만 체크 후 Finish.

### finally

  • try ~ catch 문에서 finally의 경우 에러 존재유무에 관계 없이 실행.
  • 그래서 해당 부분에 db connection을 종료시켜주는 함수를 넣어준다.

### ArrayList 이용한 리스트 작업

  • ArrayList에 회원 데이터를 담기 위해 먼저 rs.next(); 를 통해서 데이터 존재 유무를 파악(rs.next()가 True인 경우) .
  • 아래와 같이 코드 작업 진행.
// 회원(VO) 전체 리스트(ArrayList) 가져오기
	public ArrayList<MemberVO> memberList() {
		String SQL = "select * from member";
		getConnect();
		ArrayList<MemberVO> list = new ArrayList<MemberVO>();
		
		try {
			ps = conn.prepareStatement(SQL);		
			rs = ps.executeQuery();	// rs -> 커서
			
			while (rs.next()) {
				int num = rs.getInt("num");
				String id = rs.getString("id");
				String pass = rs.getString("pass");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				String email = rs.getString("email");
				String phone = rs.getString("phone");
				
				// 묶고
				MemberVO vo = new MemberVO(num, id, pass, name, age, email, phone);
				
				// 담고
				list.add(vo);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			dbClose();
		}
		
		return list;
	}

## Member 테이블의 회원 리스트 보기

  • 아래와 같이 list 가져올 Controller 코드 작업 진행
package kr.bit.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

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 kr.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

@WebServlet("/memberList.do")
public class MemberListController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
							throws ServletException, IOException {
		// 1. 클라이언트 요청 받기 (memberList.do)
		MemberDAO dao = new MemberDAO();
		
		// 2. 회원 전체 리스트 가져오기(Model 연동)
		ArrayList<MemberVO> list = dao.memberList();
		
		// 3. 회원 전체 리스트를 HTML로 만들어서 응답하기
		System.out.println(list);
	}
}

### MIME TYPE 설정

  • 응답되는 데이터안에 한글이 존재하는 경우에는 인코딩 필요.
  • 서버가 클라이언트한테 어떤 타입을 전달할지 알려주는 것.
  • response.setContentType("text/html;charset=utf-8");
  • 아래와 같이 작업하여 결과물 확인 가능.
package kr.bit.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

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 kr.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

@WebServlet("/memberList.do")
public class MemberListController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
							throws ServletException, IOException {
		// 1. 클라이언트 요청 받기 (memberList.do)
		MemberDAO dao = new MemberDAO();
		
		// 2. 회원 전체 리스트 가져오기(Model 연동)
		ArrayList<MemberVO> list = dao.memberList();
		
		// 3. 회원 전체 리스트를 HTML로 만들어서 응답하기
		// 응답되는 데이터 안에 한글이 존재할 경우 -> 인코딩 필요.
		response.setContentType("text/html;charset=utf-8");	// MIME-TYPE		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<meta name='viewport' content='width=device-width, initial-scale=1'>");
		out.println("<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css'>");
		out.println("<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>");
		out.println("<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js'></script>");
		out.println("</head>");
		out.println("<body>");
		out.println("<table border='1' class='table table-bordered'>");
		out.println("<thead>");
		out.println("<tr>");
		out.println("<th>번호</th>");
		out.println("<th>아이디</th>");
		out.println("<th>비밀번호</th>");
		out.println("<th>이름</th>");
		out.println("<th>나이</th>");
		out.println("<th>이메일</th>");
		out.println("<th>전화번호</th>");
		out.println("</tr>");
		out.println("</thead>");
		out.println("<tbody>");
		
		for (MemberVO vo : list) {
			out.println("<tr>");
			out.println("<td>" + vo.getNum()+ "</td>");
			out.println("<td>" + vo.getId()+ "</td>");
			out.println("<td>" + vo.getPass()+ "</td>");
			out.println("<td>" + vo.getName()+ "</td>");
			out.println("<td>" + vo.getAge()+ "</td>");
			out.println("<td>" + vo.getEmail()+ "</td>");
			out.println("<td>" + vo.getPhone()+ "</td>");
			out.println("</tr>");
		}
		
		out.println("</tbody>");
		out.println("<tr>");
		out.println("<td colspan='7' align='right'>");
		out.println("<a href='member/memberRegister.html'>회원가입</a>");
		out.println("</tr>");
		out.println("</td>");
		out.println("</table>");
		out.println("</body>");
		out.println("</html>");
	}
}

## 리다이렉트(sendRedirect)

  • MemberInsertController 의 MemberInsert 성공에 따른 경로 수정.
  • 이렇게 해주면 회원가입 후 회원리스트 목록으로 이동.
package kr.bit.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 kr.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

@WebServlet("/memberInsert.do")
public class MemberInsertController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
							throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		// 1. 파라미터 수집(VO)
		String id = request.getParameter("id");
		String pass = request.getParameter("pass");
		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String email = request.getParameter("email");
		String phone = request.getParameter("phone");
		
		// 파라미터 수집(VO)
		// MemberVO vo = new MemberVO(id, pass, name, age, email, phone);
		MemberVO vo = new MemberVO();		
		vo.setId(id);
		vo.setPass(pass);
		vo.setName(name);
		vo.setAge(age);
		vo.setEmail(email);
		vo.setPhone(phone);
		
		//System.out.println("vo : " + vo);	// vo.toString() 이 생략되어있는 것.
		// Model과 연동하는 부분
		MemberDAO dao = new MemberDAO();
		int cnt = dao.memberInsert(vo);
		PrintWriter out = response.getWriter();
		// 가입 성공
		if ( cnt > 0 ) {
			//out.println("insert success");	
			// 다시 회원 리스트 보기로 가야함.
			response.sendRedirect("/MVC01/memberList.do");
			
		// 가입 실패 -> 예외 객체를 만들어서 WAS에게 던지자.
		} else {
			throw new ServletException("not insert");
			
		}
	}
}
반응형
반응형

# MVC01_8 회원가입 구현

## MemberDAO 구현

  • 회원가입을 위해 쿼리 전송 구현
package kr.bit.model;

import java.sql.*;

// JDBC -> myBatis, JPA
public class MemberDAO {
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	
	// 데이터베이스 연결 객체 생성
	public void getConnect() {
		// 데이터베이스 접속 URL -> 데이터베이스 벤더마다 다름.
		String URL = "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&serverTimeZone=UTC";
		String user = "root";
		String password = "1234";
		
		// MySQL Driver Loading
		try {
			// 동적 로딩. (실행 시점에서 객체를 생성하는 방법)
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(URL, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// 회원 저장 동작
	public int memberInsert(MemberVO vo) {
		String SQL = "inser into member(id, pass, name, age, email, phone) values(?, ?, ?, ?, ?, ?)";	// ?는 파라미터를 의미.
		getConnect();
		
		// SQL 문장을 전송하는 객체 생성
		
		int cnt = -1;
		
		try {
			ps = conn.prepareStatement(SQL);	// 미리 컴파일 시킴(속도 향상)
			ps.setString(1, vo.getId());
			ps.setString(2, vo.getPass());
			ps.setString(3, vo.getName());
			ps.setInt(4, vo.getAge());
			ps.setString(5, vo.getEmail());
			ps.setString(6, vo.getPhone());
			
			// 성공 시 1, 실패 시 0
			cnt = ps.executeUpdate();					// 전송(실행)
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return cnt;
	}
	
	
}

## MemberInsertController 구현

  • Model 과 연동하는 부분 구현 작업.
package kr.bit.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 kr.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

@WebServlet("/memberInsert.do")
public class MemberInsertController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
							throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		// 1. 파라미터 수집(VO)
		String id = request.getParameter("id");
		String pass = request.getParameter("pass");
		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String email = request.getParameter("email");
		String phone = request.getParameter("phone");
		
		// 파라미터 수집(VO)
		// MemberVO vo = new MemberVO(id, pass, name, age, email, phone);
		MemberVO vo = new MemberVO();		
		vo.setId(id);
		vo.setPass(pass);
		vo.setName(name);
		vo.setAge(age);
		vo.setEmail(email);
		vo.setPhone(phone);
		
		//System.out.println("vo : " + vo);	// vo.toString() 이 생략되어있는 것.
		// Model과 연동하는 부분
		MemberDAO dao = new MemberDAO();
		int cnt = dao.memberInsert(vo);
		PrintWriter out = response.getWriter();
		// 가입 성공
		if ( cnt > 0 ) {
			out.println("insert success");
		// 가입 실패 -> 예외 객체를 만들어서 WAS에게 던지자.
		} else {
			throw new ServletException("not insert");
			
		}
	}
}
  • 구현작업 완료 후 MySQL 실행을 위해 cmd에 아래와 같이 입력하여 MySQL 실행
C:\Users\Hyeonho>cd..

C:\Users>cd..

C:\>cd eGovFrame-3.9.0

C:\eGovFrame-3.9.0>cd bin

C:\eGovFrame-3.9.0\bin>cd mysql-5.6.21

C:\eGovFrame-3.9.0\bin\mysql-5.6.21>startup.bat

## 회원가입 테스트

  • 톰캣 실행하여 회원가입 기능이 정상 작동하는지 확인.
  • 발생 할 수 있는 에러 : 쿼리 문법 에러 등.

  • insert 후 확인은 window > show view 에서 SQL Results 오픈하여 기존에 만든 member.sql에 있는 SELECT * FROM 쿼리 실행하여 확인.
  • 이때 아래와 같은 에러 발생 시 이클립스를 닫고, C:\eGovFrame-3.9.0\workspace.edu\.metadata\.plugins\org.eclipse.datatools.sqltools.result 경로의 result 파일을 삭제 후 이클립스 재 실행

  • SELECT 문 실행 시 아래와 같이 정상적으로 insert 된 member 목록을 확인할 수 있다.

반응형
반응형

# MVC01_7 한글처리와 JDBC(DAO)

## 한글깨짐 해결방법

  • 한글은 2byte인데, 입력된 한글을 1byte씩 받아서 깨짐 발생.
  • 이를 해결하기 위해서는 파라미터 수집(VO) 전에 아래와 같이 설정해주면 된다.
request.setCharacterEncoding("utf-8");
  • 적용된 코드는 아래와 같다.
package kr.bit.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 kr.bit.model.MemberVO;

@WebServlet("/memberInsert.do")
public class MemberInsertController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
							throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		// 1. 파라미터 수집(VO)
		String id = request.getParameter("id");
		String pass = request.getParameter("pass");
		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String email = request.getParameter("email");
		String phone = request.getParameter("phone");
		
		// 파라미터 수집(VO)
		//MemberVO vo = new MemberVO(id, pass, name, age, email, phone);
		MemberVO vo = new MemberVO();		
		vo.setId(id);
		vo.setPass(pass);
		vo.setName(name);
		vo.setAge(age);
		vo.setEmail(email);
		vo.setPhone(phone);
		
		System.out.println("vo : " + vo);	// vo.toString() 이 생략되어있는 것.
	}
}

## 데이터베이스 연결객체 생성 (Connection)

  • MemberDAO 에 DB 연결위한 객체 생성
  • 기존에 연결한 MySQL 의 연결 설정을 위해 Data Source Explorer > 기존 MySQL 우클릭 > Properties에서 Driver Properties 클릭 후 여기에 존재하는 URL, User name, password 와 동일하게 MemberDAO에 입력

### 자바 JDBC API (인터페이스)

  • 자바는 모든 데이터베이스에서 사용할 수 있는 JDBC API (인터페이스)를 만들고 해당 API에 구현되어 있는 추상 메서드를 각 데이터베이스 벤더 회사들이 가져가서 구현 클래스 생성. 이 구현 클래스를 Driver 라고 한다.

  • MySQL 연결을 위한 드라이버 클래스 생성 위해 jar 파일 확인. (mysql-connector-java-5.1.31.jar 사용 예정)

mysql-connector-java-5.1.31.jar
0.92MB

  • 위 파일을 프로젝트 > WebContent > WEB-INF > lib 에 복사.

  • Data Source Explorer > 기존에 연결한 MySQL 우클릭 > Properties > Driver Properties > Drivers에서 Edit Driver Definition 클릭 후 Properties 탭 확인
  • Properties 에 있는 Driver Class value를 이용하여 MySQL Driver Loading

  • 실행 시점에서 드라이버를 메모리에 올리는 동적 로딩 활용.
  • 그리고 try ~ catch로 예외처리 하는데, 기존 ClassNotFoundException으로 예외처리하던걸 부모가 예외를 다 잡을 수 있도록 Exception으로 변경.
package kr.bit.model;

import java.sql.*;

// JDBC -> myBatis, JPA
public class MemberDAO {
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	
	// 데이터베이스 연결 객체 생성
	public void getConnect() {
		String URL = "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&serverTimeZone=UTC";
		String user = "root";
		String password = "1234";
		
		// MySQL Driver Loading
		try {
			// 동적 로딩.
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(URL, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
}
반응형

+ Recent posts