onnnzeoz

스레드처럼 connection 연결하고 다 사용하면 close도 해줌

 

데이터소스로부터 커넥션 얻어와서 넣는 작

 

 statement 한번만 쓰는거

prestatement 재사용하는

 

테이블을 만든다는것은 몇개의 데이터를 고친다는건지 머넞 확인해보기

executequery는 셀렉트문 그외는 execute update

 

디ㅏ비의 모든 내용은 커넥션으로 부터 나온

 

create table은 아무런 영향도 주지 않음 

 

근데 statement 잘 안씀 여기 단계에서

 

resultset 결과값을 set형태로 담아 온

 

beans라고도 하지만 dto라고도 \

 

 

 

java.sql.SQLException: Cannot load JDBC driver class 'org.mariadb.jdbc.Driver'

이거 뜨는거면 라이브러리가 없다는 뜻 -> lib에 라이브러리 넣어줘 

 

상세보기, 삭제 모두 하나 콕 찝어서 한니까 ? 필요하고

상세보기는 select지만 삭제는 delete라 상세보기는 executequery 삭제는 executeupdate

 

crud : create read update delete

로그인 select prestatement

회원가입 insert statement

 

 

순서

db접속부터 먼저해야함

      try {
         Context ctx = new InitialContext();
         DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MariaDB");
         conn = ds.getConnection();
      } catch (Exception e) {
         e.printStackTrace();
      }

해줘야해

 

 

membercontroller로 코드리뷰

 


- controller

@WebServlet(urlPatterns = {"/login","/join"})
public class MemberController extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
		String uri = req.getRequestURI();
		String ctx = req.getContextPath(); // 프로젝트 명 
		String addr = uri.substring(ctx.length());	 //ctx길이부터 끝까지 가져온다
		req.setCharacterEncoding("UTF-8");
		MemberModel model = new MemberModel();		
		String msg = "";
		
		if(addr.equals("/join")) {
			HashMap<String, String> param = new HashMap<String, String>();
			param.put("id", req.getParameter("id"));
			param.put("pw", req.getParameter("pw"));
			param.put("name", req.getParameter("name"));
			param.put("age", req.getParameter("age"));
			param.put("gender", req.getParameter("gender"));
			param.put("email", req.getParameter("email"));
			System.out.println(param);
			msg = model.join(param);
		}
		if(addr.equals("/login")) {
			String id = req.getParameter("id");
			String pw = req.getParameter("pw");
			System.out.println(id+"/"+pw);
			boolean success = model.login(id, pw);
			if(success) {
				msg = "로그인에 성공했습니다.";
				HttpSession session = req.getSession();
				session.setAttribute("loginId", id);
			}else {
				msg = "로그인에 실패했습니다.";
			}
		}
		
		req.setAttribute("msg", msg);
		RequestDispatcher dis = req.getRequestDispatcher("index.jsp");
		dis.forward(req, resp);

	}

join과 같다면  getParameter을 통해서 값을 가져오는데 이렇게 가져온 값은 param.put을 통해param에 담아줍니다

hashmap을 객체화해서 거기에 담아준다. id라는 이름으로 id값을 가져온 것. 이후 syso를 통해 확인하고 model클래스의 join메서드에 param값을 담아서 실행한다. 그리고 반환값을 msg에 담아주고 이후 setattribute 등을 통해 index.jsp로 보낸다.

- model

public class MemberModel {
	
	// 회원 정보를 회원아이디.dat 형태로 저장한다.
	
	public String join(HashMap<String, String> params) {
		MemberDAO dao = new MemberDAO(); //db에서 해야할 일이므로 DAO를 객체화해줌
		String msg = "이미 존재하는 아이디입니다.";
		
		//1.해당 아이디를 가지고 있는 사용자가 있는지 db에 물어본다
		boolean overlay = dao.overlay(params.get("id"));
		System.out.println ("중복 아이디 여부 : "  + overlay);
		if(!overlay) {
			//2. 중복아이디가 아니라면 가져온 파라메터를 이용해 db에 insert한다
			if(dao.join(params) == 1) { //pk가 설정되어있어서 어차피 1까지 밖에 못넣음 
				msg = "회원가입이 완료되었습니다.";
			}else {
				msg = "회원가입에 실패했습니다.";
			}
		}
		return msg;
		
	}
	
	public boolean login(String id, String pw) {
		MemberDAO dao = new MemberDAO();
		return dao.login(id,pw);
	}

}

param값을 인자값으로 받는 join메서드를 보면

db에서 해야할일이니까 DAO 클래스 객체화해주고 msg 초기값 설정해주고

먼저 중복되는 id있는지 db에 확인하기 위해 overlay라는 메서드 하나 생성해줌 인자값으로는 사용자가 입력한 값인 params.get("id")를 넣어줬음, 중복된 값이 있으면 true 없으면 false로 반환하기 위해 boolean 타입으로 선언해줌

만약 true가 아니라면 즉 중복된 값이 없다면 dao의 join객체에서 반환된 값이 1이라면 회원가입이 완료되었다는 msg 반환함

- DAO

public class MemberDAO {
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;

	public MemberDAO() {
		

		try {
			Context ctx = new InitialContext();
			DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MariaDB");
			conn = ds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	


	public boolean overlay(String id) {
		// 1. 쿼리문
		String sql = "SELECT id FROM member_table WHERE id = ?";
		boolean overlay = true;
		
		try {
			ps = conn.prepareStatement(sql); // sql 작성
			ps.setString(1, id); // 3.?
			rs = ps.executeQuery(); // 4. executeQuery
			overlay = rs.next(); //5. 테이블 읽고 값 반환
			//5. close
			rs.close();
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return overlay;
	}

 

db에 접속하기 위해서 context.xml을 객체화해줌 (자바에서 사용하기 위해) 근데 context는 인터페이스여서(인터페이스는 객체화 못함) InitialContext 를 사용해줌. 이 ctx에서 lookup을 사용해서 자바 컴파일러의 jdbc/MariaDB를 찾음 Datasource라는 데이터 타입을 사용해서 ds에 넣어주고 여기서 getconnection을 해줌

아이디 중복 확인을 위해 overlay를 실행하면 인자값으로는 id를 가져오고

쿼리문 준비, prepareStatement 작성, setString을 사용해 id값을 첫번째 물음표에 넣어주고\

쿼리문 실행하기 위해 executeQuery사용해줌 (select 문이기때문에 이거 사용함) 해서 반환값 resultset의 변수인 rs에 넣어주고

next()를 확인해서 다음값을 확인해주고 자원 반납해줌

리턴값으로는 true or false를 반환

- 다시 model로 돌아가서 

if(!overlay) {
			//2. 중복아이디가 아니라면 가져온 파라메터를 이용해 db에 insert한다
			if(dao.join(params) == 1) { //pk가 설정되어있어서 어차피 1까지 밖에 못넣음 
				msg = "회원가입이 완료되었습니다.";
			}else {
				msg = "회원가입에 실패했습니다.";
			}
		}
		return msg;
		
	}

만약 overlay가 false라면 밑에 if문 실행

public int join(HashMap<String, String> params) {
		int row = 0; //초기값
		//1. 쿼리문 준비
		String sql = "INSERT INTO member_table(id,pw,name,age,gender,email)VALUES(?,?,?,?,?,?)";
		try {
			//2. 재사용할거니까 (회원가입은 계속하니까) prepareStatement 로 미리 작성 
			ps = conn.prepareStatement(sql);
			ps.setString(1, params.get("id"));
			ps.setString(2, params.get("pw"));
			ps.setString(3, params.get("name"));
			ps.setInt(4, Integer.parseInt(params.get("age")));
			ps.setString(5, params.get("gender"));
			ps.setString(6, params.get("email"));
			
			row = ps.executeUpdate(); //값이 반환되기 때문에 update 사용 ->그리고 몇개 반환되느지 알려줌
			//close()
			ps.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return row;
	}

join메서드를 보면 row의 초기값 설정, 쿼리문 준비 insert문 통해서 회원가입 정보 넣어주기 

profile

onnnzeoz

@onnnzeoz

비전공자의 개발 공부 일지입니다 💦 국비 풀스택 과정 수강중