Don't Panic
in Back

[Backend] JSTL, EL Session, Cookie

20210331_094631

Statement랑 온라인시간에 한 PreparedStatement랑 용도가 같은가요?

statement 메서드 실행하고 리턴 타입 뭐지? executeQuery는 리턴타입이 resultSet인데 executeUpdate 하면 리턴타입은 int.

preparedStatement 자주쓰나? = O

20210331_103526

	String query = "insert into customer values(?,?,?)";

이건 insert문 해도 ?는 값이 들어가는 부분인데 저 부분을 제외하면 다 똑같다. 바뀌는 부분만 물음표로 해둔다.

그냥 statement는 빈 그릇.

20210331_104412

preparedStatement는 그릇은 그릇인데 쿼리의 일부분을 미리 준비해둠. 나중에 정말 실행할 떄는 ?로 미정상태로 물음표 상태인 곳만 실행시키면 아까 만들었던거보다 실행속도가 훨씬 빠름

쿼리문의 성능이 pstat이 더 좋다. 일부를 띄워논 상태에서 아ㅏㄲ 오면 메모리에 남겨눴던 값만 실행. 컴파일은 1번만 일어나는게 prepared고 selected는 실행할때마다 컴파일이 걸림.

20210331_110308

20210331_110403

20210331_110504

20210331_110534

20210331_110654 레코드 넣기 성공!

그리고 아까 java 코드 실행하자.

20210331_110724 쿼리문의 일부분은 맨날 똑같은데 값이 매번 다르게 들어감.(? 부분) 아래 delete 처럼도 가능.

그리고 얘 말고 CallableStatement라는 애가 하나 더 있다 성능은 아래쪽으로 내려갈 수록 더 좋다.

20210331_110822

CallableStatement는 호출할수 있는 이고 실행시킬 커리가 이미 데이터베이스 안에 있음. 자바쪽에서 쿼리를 보내고 자시고 할 필요도 없음.

CallableStatement는 사용자가 사용할 쿼리가 다 준비 되어있어야 한다. 우리는 preparedStatement까지.


서블릿 하나 만들자.

덤으로 몰랐는데 System.out은 콘솔에 찍히고 브라우저에 안찍힌다. out.println을 써야 브라우저에 찍힌다.

20210331_113103

서블릿(자바를) jsp로 바꿔보자

자바 코드는 식이 중간에 출력하게 해주고 아무튼 그럼


DBServlet.java을 jsp로 바꿔보자.(서블릿을jsp로 바꿔보자)


package com.hello;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

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

@WebServlet("/DBServlet")
public class DBServlet extends HttpServlet {


	String driver = "com.mysql.cj.jdbc.Driver";

	//jdbc url
	//jdbc:protocol name, mysql:db이름. localhost:db server 주소. 3306:port, scott:schema 이름
	String url = "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&characterEncoding=UTF-8";
	//"jdbc:mysql://localhost:3306/(여기가 쓰는 디비)?serverTimezone=UTC&characterEncoding=UTF-8";	?쿼리스트링 뒤는 옵션사항.

	String user = "root";
	String password = "mysql";

	//이 3가지가 디비 접속하기 위한 정보들 얘들이 있어야 커넥션 가능

	String query = "select * from customer where address='seoul'";
	public void init(ServletConfig config) throws ServletException {

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

		//서버에서 클라이언트로 보내는 컨텐트 타입 지정
		response.setContentType("text/html;charset=utf-8");	//mime 타입 charset은 한글처리 위해 작성.
		//클라이언트로 보낼 컨텐트 출력을 위한 처리
		PrintWriter out = response.getWriter();


//		String query = "select * \r\n" +
//				"from customer \r\n" +
//				"where address='seoul'"
//		String query = "select empid, fname, phone from emp";

		//1.Driver 등록(사용할 db에 맞춰서 등록)
		try {
		Class.forName(driver);
//		Class.forName("com.hello.Car");	//객체를 생성. 'com.hello안에 있는 Car라는 객체를 생성해주세요라는 뜻.
//		이전엔 객체 생성할 떄 new라는 객체 썼었는데 (Car c = new Car()) 이 c는 무조건 car타입이 들어오는데
//		패키지.클래스 주면서 객체 생성할 수도 있는데 Class.forName(xx)같은 변수로 오고 그걸 컴파일 하게 되면 xx안의 변수에 뭐가 들어있느닞 모르면 생성하는 타입의 객체 생성 못함.
//		xx의 변수에 실행할 때 마다 다른 값을 줄 수 있어서 융통성이 있어지고 생성하는 객체가 매번 달라질 수 있다.

		//2. Connection 생성 - network 연결
		Connection con = DriverManager.getConnection(url, user, password);

		//3.Statement  생성
		Statement stat = con.createStatement();
		//그릇이 만들어지고 그 만들어진 그릇으로 4번에서 실행

		//4.Query  실행
		ResultSet rs = stat.executeQuery(query);
		//실행하는 쿼리가 셀렉트가 아닌 경우 insert update delete는

		out.print("<table border =1>");
		out.print("<tr><th>번호</th><th>이름</th><th>주소</th></tr>");
		//5. 결과 처리
		while(rs.next()) {	//한행 한행 처리
			String num = rs.getString(1);
			String name = rs.getString(2);
			String address = rs.getString(3);

//			System.out.println(num + "--" + name + "--" + address);
			out.println("<tr><td>"+ num+"</td><td>"+name+"</td><td>" + address +"</td></tr>");

			//System.out은 콘솔에 찍히고 브라우저에 안찍힌다. out.println을 써야 브라우저에 찍힌다.
		}

		//6. 마무리
		rs.close();
		stat.close();
		con.close();

	}catch(Exception e) {
			e.printStackTrace();
		}
	}
}


이걸 jsp 로 바꿔보자

DBjsp.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*"%>

<%!
	String driver = "com.mysql.cj.jdbc.Driver";
	String url = "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&characterEncoding=UTF-8";

	String user = "root";
	String password = "mysql";

	String query = "select * from customer ";
/*
	public void init(ServletConfig config) throws ServletException {
	} */
%>


<%
		//1.Driver 등록(사용할 db에 맞춰서 등록)

		Class.forName(driver);
%>
<%
		//2. Connection 생성 - network 연결
		Connection con = DriverManager.getConnection(url, user, password);
%>
<%
		//3.Statement  생성
		Statement stat = con.createStatement();
		//그릇이 만들어지고 그 만들어진 그릇으로 4번에서 실행
%>
<%
		//4.Query  실행
		ResultSet rs = stat.executeQuery(query);
%>
		<table border =1>
		<tr><th>번호</th><th>이름</th><th>주소</th></tr>
<%
		//5. 결과 처리
		while(rs.next()) {	//한행 한행 처리
			String num = rs.getString(1);
			String name = rs.getString(2);
			String address = rs.getString(3);
%>		

			<tr>
				<td><%= num %></td>
				<td><%= name %></td>
				<td> <%= address %> </td>
			</tr>
<%		}%>

<%
		//6. 마무리
		rs.close();
		stat.close();
		con.close();
%>
	}
}


20210331_131756

자바코드는 스크립트렛에 실행하는데 이걸 태그로 해결 하겠다는 뜻. 우리가 만든 jsp가 자바로 변환 될때 사이즈가 늘어나는 부작용을 막을 수 있음.

20210331_131850

jsp 에서 앞에 붙은게 접두 html 태그와 겹칠수 있어서 구분자 붙이는 거.

20210331_132344


20210331_132955

20210331_133900

20210331_135544

20210331_134642

forward하면 리퀘스트를 같은 걸 쓴다.!

jsp에선 포워드 태그로 하는거고 java에선 코드로 하는거(서블릿)


20210331_141234

모델은 데이터를 tv는 뷰

jsp 안에 디비 연동하는 코드가 있으면 잘못 된 거.

20210331_141519

20210331_141540

클라이언트가 요청 보내면 서블릿(컨트롤러)이 제일 먼저 요청을 받는다. 모델은 로직, 데이터를 담당. 작업한 결과를 다시 컨트롤러에 준다. 그럼 컨트롤러가 작업한 결과를 받아서 뷰한테 준다.

컨트롤러가 모델 부려먹음

20210331_141825

20210331_142107

젤 먼저 들어오면 컨트롤러가 받고 모델에 일을 시키고 모델이 컨트롤러에게 결과 주고 컨트롤러는 뷰에게 전달하면 그 데이터를 화면에 완성시키고 그 완성된 jsp가 나감.

20210331_143343

20210331_143939

20210331_144007

DAO가 진짜로 일하는 거 (실제적으로 일하는 애 예를 들면 db작업) 클라이언트 요청에 대한 실제 처리를 함.

DAO는 메서드 한개가 db관련작업 1개만 수행(단위작업) select면 select, create면 create. 이런식.


컨트롤러는 나중에 프레임 워크에서 제공해줘서 컨트롤러만 만들면 된다.

업무를 분담시켜둔다는 개념이 있다.

실행법은 브라우저 열고 http://localhost:port/mvc/list.bod(초기화면)

이런식으로 초기 요청화면을 집어넣어야 한다. 그 다음은 링크 버튼누르면 넘어가는데 초기에는 저렇게 해줘야한다.

20210331_150015