MVC1 DB 연결 및 Insert

안병욱·2022년 5월 9일
0

이 글에서는 MVC1 패턴으로 DB연결 및 DB로 데이터 Create,Read 에 대해서 알아보자!
먼저 Oracle을 연결에 대한 예제이다.
dbconn1_oracle.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import = "java.sql.*" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	Connection conn = null;   // DB를 연결하는 객체
	String driver = "oracle.jdbc.driver.OracleDriver";   //Oracle Driver에 접속
	String url = "jdbc:oracle:thin:@localhost:1521:XE";

	Class.forName(driver);  // 오라클 드라이버 로드함.
	conn = DriverManager.getConnection(url,"hr","hr");  // url주소,계정,비밀번호

%>


</body>
</html>

우리는 인코딩 방식을 UTF-8 로 진행을 하기 때문에 모든 코드 charset 을 UTF-8 로 지정을 해주겠습니다.

<%@ page import = "java.sql.*" %>을 작성을 해주어야 하는데, java.sql 안에는
여러가지 메서드가 존재 한다. 이제 하나씩 알아보자!

Interface Connection

Connection 클래스는 Interface 클래스인데, 우리가 기존 자바에서 배웠던 것을 생각하면 된다.
Interface는 메서드의 구현부가 존재하지 않는 클래스를 의미한다.

createStatement()

createStatement 메서드는 데이터베이스에 SQL statements를 보내기 위한 개체를 생성하는 메서드를 의미한다.

DriverManager


DriverManager 클래스의 getConnection(String url, String user, String password)
메서드는 데이터베이스의 URL과 USER, Password를 입력을 해서 지정된 데이터베이스 URL에 연결을 시도 해주는 메서드이다.

Statement

  1. Statement
    -기본 객체
  • 텍트스 SQL 호출
  1. PreparedStatement
  • 1번의 기능 향상
  • 인자와 관련된 작업이 특화(매개변수)
  • 코드 안정성 높음, 가독성 높음.
  • 코드량이 증가( ; ; )
  • 텍스트 SQL 호출
  1. CallableStatement
  • 2번 베이스
  • 프로시저 호출 전용

우리는 sql 내부에 있는 메서드를 사용하기 위해 import를 해준다.
코드 하나씩 풀어서 설명을 해보자면, 먼저 Connection conn = null; 이 코드는 커넥션 변수를 선언하기는 했는데 해당 타입을 null로 초기화 한것이다. 이건 코드 컨벤션에 대한 개념인데, 사용할 변수는 상단에 미리 선언을 하고 아래에서는 위에서 선언된 변수를 가져다 사용하는 개념이다.

코딩 컨벤션이란? 코딩 컨벤션은 읽고, 관리하기 쉬운 코드를 작성하기 위한 코딩 스타일 규약이라고 생각하면 된다. 이러한 규약들을 지키는 이유는 여러 개발자가 협업해야하는 상황에서 일종의 규약이 있다면, 유지보수 및 가독성이 좋아져, 협업이 쉬워진다.

String driver = "oracle.jdbc.driver.OracleDriver";   //Oracle Driver에 접속
String url = "jdbc:oracle:thin:@localhost:1521:XE";

위의 코드는 driver는 경로를 따라가보면 OracleDriver 라는 class를 담고 있는 것이고,
Oracle Driver에 접속하기 위해 dirver라는 변수에 담아둔다.
url은 오라클과의 연결정보를 알려준다고 생각하면된다.

이클립스 환경에서 JDBC를 이용하여 자바와 오라클(oracle) 데이터베이스를 연결하는 방법이다.
JDBC는 데이터베이스(oracle,mysql 등)를 자바를 이용하여 조작하기 위한 자바 라이브러리이다.
기본적으로 오라클을 설치하면 JDBC 파일이 저장 되어있는데, 나의 경우에는
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 여기에 저장이 되어있다.

여기서 ojdbc6.jar 파일을 어디에 넣어주면 되느냐면 src > webapp > WEB-INF > lib 파일에 넣어주면 된다.

다음은 드라이버를 드라이버 매니져에 등록하는 방법인데, 먼저 드라이버 매니져가 무엇인지
알아보자!!

드라이버 매니져(DriverManager)

  • JDBC 드라이버들의 집합을 관리하는 기본적인 작업을 수행
  • 데이터베이스 드라이버들을 로딩하고, 데이터베이스에 연결에 관해 책임지는 클래스.
  • 사용할 드라이버는 드라이버 매니져가 드라이버를 구동하기 전에 등록되어 있어야 함.
  1. Class 클래스의 forName() 메서드 호출 -> SQL 드라이버를 로드
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); // MS-SQL 드라이버 등록
Class.forName(“postgresql.Driver”); // PostgreSQL 드라이버 등록
Class.forName(“oracle.jdbc.driver.OracleDriver”); // Oracle 드라이버 등록
  1. 해당 SQL Connect 하기
conn = DriverManager.getConnection(url,"hr","hr");  // url주소,계정,비밀번호

insert01.jsp 파일 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Employee</title>
</head>
<body>
	<form method = "post" action="insert01_process.jsp">
		<label>
			사원번호 : <input type ="text" name ="eno" >
		</label>
		<br>
		<label>
			사원명 : <input type ="text" name ="ename" >
		</label>
		<br>
		<label>
			직무 : <input type ="text" name ="job" >
		</label>
		<br>
		<label>
			직속상사 : <input type ="text" name ="manager" >
		</label>
		<br>
		<label>
			입사일자 : <input type ="date" name ="hiredate" >
		</label>
		<br>
		<label>
			급여 : <input type ="text" name ="salary" >
		</label>
		<br>
		<label>
			보너스 : <input type ="text" name ="commission" >
		</label>
		<br>
		<label>
			부서번호 : <input type ="text" name ="dno" >
		</label>
		<br>
		<input type = "submit" values="전송">
		
	</form>




</body>
</html>

해당 코드는 쉽게 생각 하면 form으로 데이터를 전송한다고 생각 하면 된다.
우리는 form에서 method 에서 "GET방식과 POST방식"에 대해 선택을 해야 하는데
그 부분에 대해서는 https://velog.io/@quddnr005/Form-%ED%83%9C%EA%B7%B8-GET-%EA%B3%BC-POST 여기를 참조하자!!

다음으로 action 은 폼 내부에 데이터를 보내는 목적지 url을 지정한다.
즉 input 값마다 name이 있는데, 값을 입력하고 밑에 submit 버튼을 누르게 되면, form action으로 지정 되어 있는 insert01_process.jsp 파일로 데이터가 넘어 간다고 생각 하면 된다. 이 데이터를 어떻게 사용하는지에 대해서는 바로 아래 insert01_process.jsp 파일에서 알아보겠다.


insert01_process.jsp 파일 생성

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

<%@ page import = "java.sql.*" %>    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%@ include file = "dbconn1_oracle.jsp" %>

<%
	request.setCharacterEncoding("UTF-8");

	int eno = Integer.parseInt(request.getParameter("eno"));  
	String ename = request.getParameter("ename");
	String job = request.getParameter("job");
	int manager = Integer.parseInt(request.getParameter("manager"));
	String hiredate = request.getParameter("hiredate");
	int salary = Integer.parseInt(request.getParameter("salary"));
	int commission = Integer.parseInt(request.getParameter("commission"));
	int dno = Integer.parseInt(request.getParameter("dno"));
	
	Statement stmt = null;
	
	try {
		String sql = "INSERT INTO emp_copy (eno, ename, job, manager, hiredate, salary, commission, dno) Values ('"+eno +"','"+ ename + "','" + job + "','" + manager + "','" +hiredate + "','" + salary + "','" + commission + "','" + dno + "')";
		stmt = conn.createStatement();
		stmt.executeUpdate(sql);
	}catch (Exception ex) {
		out.println("emp_copy 테이블 삽입을 실패 했습니다.");
		out.println(ex.getMessage());
	}finally {
		if(stmt != null) {
			stmt.close();			
		}
		if(conn != null) {
			conn.close();
		}
	}
%>
					<%= eno %>
					<%= ename %>
					<%= job %>
					<%= manager %>
					<%= hiredate %>
					<%= salary %>
					<%= commission %>
					<%= dno %>

</body>
</html>

위에서부터 코드를 하나씩 살펴보자!!

<%@ page import = "java.sql.*" %>    

해당 코드는 java의 sql패키지를 import 하여 데이터 소스에 저장된 데이터에 접급하고 제어할 수있게 해주는 역할을 한다. 쉽게 가져다쓰기 위해 import 했다고 생각하자!

다음 코드는 include 이다.

<%@ include file = "dbconn1_oracle.jsp" %>

include 지시어는 다른 JSP의 소스 코드를 해당 JSP에 그대로 포함시킨다고 생각하면 된다.
그러면 dbconn1_oracle.jsp 에서 생성한 conn이라는 객체를 사용할 수 있게 된다.
conn이라는 객체에는 우리가 이전에 DriverManager.getConnection 메서드를 활용하여 oracle url과 계정 비밀번호를 등록해주었다.

request.setCharacterEncoding("UTF-8");

해당 코드는 UTF-8 로 인코딩 해주는 코드이다.
우리가 어떤.jsp 파일아니 .html파일에서 폼 태그에 입력한 값을 전송한다고 가정할때, 폼 태그에서는 GET,POST 방식으로 나뉘는데 POST방식으로 보내는 값이 '한글'일 경우 깨지지 않게 전달하기 위해 사용하는 것이 request.setCharacterEncoding("UTF-8"); 이다.

GET방식으로 보내진 한글은 톰캣이 기본적으로 UTF-8 문자코드가 적용이 되어 있어서 자동으로 한글처리를 해주기 때문에 한글이 깨지지 않지만, 프로젝트를 해나가면 2개의 방식을 모두 사용하기 때문에 request.setCharacterEncoding("UTF-8"); 꼭 필요하다...

다음 코드는 쿼리스트링에 있는 key의 value 값을 변수에 담기

int eno = Integer.parseInt(request.getParameter("eno"));  
	String ename = request.getParameter("ename");
	String job = request.getParameter("job");
	int manager = Integer.parseInt(request.getParameter("manager"));
	String hiredate = request.getParameter("hiredate");
	int salary = Integer.parseInt(request.getParameter("salary"));
	int commission = Integer.parseInt(request.getParameter("commission"));
	int dno = Integer.parseInt(request.getParameter("dno"));

이 코드는 우리가 Form 태그에서 받아온 쿼리스트링의 값을 저장하는 작업이다. 쿼리스트링 안에 있는 key 와 value 가 있는데 getParameter는 해당 key의 값을 변수에 담아둔다고 생각 하면 된다.

데이터 넣어주기

String sql = "INSERT INTO emp_copy (eno, ename, job, manager, hiredate, salary, commission, dno) Values ('"+eno +"','"+ ename + "','" + job + "','" + manager + "','" +hiredate + "','" + salary + "','" + commission + "','" + dno + "')";

sql문에서 insert into values.. 를 이용하여 데이터를 변수에 담아준다.
우리가 쿼리스트링에서 받아온 값을 잘게 쪼개 변수에 담은것을 insert into 구문을 활용하여 안에 각각의 값을 다 넣어주는 작업이다.

statement 란

stmt = conn.createStatement();
stmt.executeUpdate(sql);

우리는 이전에 connection 이라는 객체를 dbconn_oracle.jsp 에 생성 해주었고,
해당 파일의 위쪽에 <%@ include file ="파일이름" %> 을 적어주어 해당 객체를 사용할 수 있게 되었다. 자바 프로그램과 DB 사이에 연결이 되었다면 이 연결을 통해 자바프로그램은 DB쪽으로 SQL 문을 전송하고, DB는 처리된 결과를 다시 자바프로그램 쪽으로 전달해야 하는데, 이 역할을 하는 객체가 Statement이다.

Statement 객체를 생성하려면 Connection 객체가 제공하는 createStatement() 메소드를 사용해야 한다.

stmt = conn.createStatement();

DB로 SQL문을 요청하기 위해 생성하는 객체는 Statement 외에도 PreparedStatement 객체도 있는데, 이 글에서는 다루지 않기 때문에 추후 다루게 될떄 내용을 정리하겠다.

stmt.executeUpdate(sql);

executeUpdate 메서드는 데이터베이스에서 데이터를 추가(Insert), 삭제(Delete),수정(Update)하는 SQL문을 실행 한다. 메서드의 반환 값은 해당 SQL문 실행에 영향을 받는 행 수를 반환한다.

자원누수 막기

finally {
		if(stmt != null) {
			stmt.close();			
		}
		if(conn != null) {
			conn.close();
		}
	}

해당 코드는 이제 값을 정상적으로 create,delete,update를 하고 난뒤 마지막으로 실행해주는 문구 인데 JDBC API 사용시 흔히 하는 개발자의 실수 인데, 그 실수란 close()메소드를 사용해주지 않는것이다. 만약 statement를 닫지 않을 경우, 생성된 Statement의 개수가 증가하여 더 이상 Statement를 생성할 수 없게 되고, close()하지 않으므로 불필요한 자원(네트워크 및 메모리)을 낭비하게 된다.

0개의 댓글