복습

데이터베이스와 JAVA 연동, 자바에서 SQL문 사용 본문

서버프로그램

데이터베이스와 JAVA 연동, 자바에서 SQL문 사용

ykm1256 2020. 6. 15. 16:08

JNDI(Java Naming and Directory Interface)

 

JNDI디렉터리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고(lookup)하기 위한 자바 API. 쉽게 말하면 외부에 있는 객체를 가져오기 위한 기술이다. Tomcat와 같은 WAS를 보면 특정 폴더에 필요한 데이터 소스(라이브러리)가 있는데 그것을 우리가 사용하기 위해 JNDI를 이용해서 가져오는 것이다.

 

DBCP(Database Connection Pool)

 

데이터베이스와 연결된 커넥션을 미리 만들어서 저장해두고 있다가 필요할 때 저장된 공간(pool)에서 가져다 쓰고 반환하는 기법을 말한다. 커넥션 풀을 이용하면 커넥션을 미리 만들어두고 사용하기 때문에 매번 사용자가 요청할 경우 드라이버를 로드하고, 커넥션 객체를 생성해 연결하고 종료하는 비효율적인 작업을 하지 않아도 된다.  즉 데이터베이스의 부하를 줄일 수 있고 자원을 효율적으로 관리할 수 있다.

 

JAVA와 DB 연동하기

1. 오라클 jdbc 라이브러리 설치

왼쪽경로(오라클 설치폴더)에 있는 파일 중 하나를 오른쪽 경로(자바 설치폴더)에 옮기거나 이클립스 workspace에 있는 WEB-INF/lib 폴더에 옮긴다.

 

2. DBCP 설정(context.xml)

이클립스에서 왼쪽 사진의 경로에 있는 context.xml 파일을 복사하여 오른쪽 사진의 META_INF 폴더에 복사한 후

<Resource name="jdbc/jsp" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:xe"	// 사용할 sql 계정의 정보(포트,SID)
    username="scott" password="1234"			// 계정 이름, 비밀번호
    maxTotal="20" maxIdle="10"
    maxWaitMillis="-1"
    />

제일 아래의 </context>위에 위의 코드를 넣어준다.

 

3. connection 객체의 getConnection() 함수 구현

sql문을 사용할 파일에서 아래의 코드를 입력한다.

private Connection getConnection() throws Exception { // 자바sql 임포트
		Context initCtx = new InitialContext();
		Context envCtx = (Context) initCtx.lookup("java:comp/env");
        //lookup메서드를 이용해서 "java:comp/env" 에 해당하는 객체를 찾아서 evnCtx에 삽입
		DataSource ds = (DataSource)envCtx.lookup("jdbc/jsp");
        //lookup메서드를 이용해서 "jdbc/jsp" 에 해당하는 객체를 찾아서 ds에 삽입
		return ds.getConnection();
	}

sql문 사용 준비 완료!

 

JAVA에서 sql문을 사용하여 DB에 데이터 추가 후 불러오기

1. 데이터 입력창에서 받아온 데이터를 AddressDAO.jsp의 함수에 대입

<jsp:useBean id="ad" class="com.address.Address"></jsp:useBean>
<jsp:setProperty property="*" name="ad"/>
//useBean을 이용하여 클래스 선언 후 데이터 입력창에서 받아온 데이터를 모두 저장
<%
	AddressDAO dao = AddressDAO.getInstance();	
    //AddressDAO형 객체를 만듦 getInstance()는 싱글톤패턴으로 하나의 인스턴스를 공유하여 쓰는 것
	dao.addrInsert(ad);	
    //AddressDAO객체에 있는 addrInsert()메서드 호출, 받아온 데이터 대입
    response.sendRedirect("list.jsp");
    // 이페이지는 빈페이지 이므로 list.jsp 페이지 출력
%>

 

2. sql문으로 받아온 데이터를 DB에 저장하는 함수 구현

 - Statement : SQL문을 실행하여 결과를 돌려주는 오브젝트

 - Preparedstatement : statement보다 기능이 향상된 오브젝트(Statement를 상속받음)

 - execute() : 반환값은 Boolean타입이며 모든 sql구문에서 사용한다. (반환값이 resultset타입이면 true 반환)

 - executeUpdate() : Int 타입의 값을 반환하며 SELECT 구문을 제외한 다른 구문을 수행할 때 사용

public void addrInsert(Address ad) {
		Connection con = null;	// Connection 객체 생성
		PreparedStatement ps = null; 
        // ps 객체 생성 Statement 보다 향상된 기능을 가지고 있음(여기서는 매개변수 사용)
		try {
			con = getConnection();	//getConnection()함수 호출하여 연동
			String sql = "insert into address values(address_seq.nextval,?,?,?,?)";
            // 사용할 sql문 입력
			ps = con.prepareStatement(sql);
            // ps에 sql문 대입
			ps.setString(1, ad.getName());	
			ps.setString(2, ad.getZipcode());
			ps.setString(3, ad.getAddr());
			ps.setString(4, ad.getTel());
            // 각각의 위치에 받아온 데이터를 입력
			
//			sql 실행 메소드
			ps.executeUpdate();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeConnection(ps,con);
            // Connection 종료
		}
	}

 

3. DB에 저장된 데이터 불러오기

createStatement() : 데이터베이스로 SQL 문을 보내기 위한 SQLServerStatement 개체를 만듭니다.

executeQuery : ResultSet 객체의 값을 반환하며 SELECT 구문을 수행할 때 사용

public ArrayList<Address> addrList() {	// 데이터 갯수를 모르기 때문에 ArrayList사용
		Connection con = null;
		Statement st = null;	// ?를 쓰지않으므로  Statement 사용
		ResultSet rs = null;	// sql 결과값을 받아오는 객체 생성
		ArrayList<Address> arr = new ArrayList<Address>(); // 배열 생성
		
		try {
			con=getConnection();
			String sql="select * from address order by num asc";
            // sql문 입력(모든데이터 불러와서 num으로 오름차순 정렬)
			st = con.createStatement();
			rs = st.executeQuery(sql);		
            // sql문을 실행하여 값을 받아옴(resultset형)
			while(rs.next()) {
				Address ad = new Address();		// Address 객체 생성
				ad.setNum(rs.getInt("num"));
				ad.setName(rs.getString("name"));
				ad.setZipcode(rs.getString("zipcode"));
				ad.setAddr(rs.getString("addr"));				
				ad.setTel(rs.getString("tel"));
                //rs에 받아온 값들을 Address 객체에 저장
				arr.add(ad);
                // 저장한 값을 배열에 저장
				
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			closeConnection(st,con,rs);
		}
		return arr;
        //값이 저장된 배열 반환
	}

 

4. 불러온 데이터 출력하기

<%
	AddressDAO dao = AddressDAO.getInstance();
	ArrayList<Address> arr = dao.addrList();	// db의 데이터를 함수로 받아와서 배열에 저장
%>

<%
	for(int i=0; i<arr.size();i++){	//for문을 이용하여 배열의 값 출력
		%>
		<tr>
			<td><%=arr.get(i).getNum()%></td>
            
			<td>
            		<a href="detail.jsp?num=<%=arr.get(i).getNum()%>">
            		<%=arr.get(i).getName()%>
            		</a>
            		</td>
			<!-- detail 페이지로 이동하는데 사용자의 num에 맞게 이동 -->
            
			<td><%=arr.get(i).getZipcode()%></td>
			<td><%=arr.get(i).getAddr()%></td>
			<td><%=arr.get(i).getTel()%></td>		
            <!-- 받아온 값이 Address형이므로 getNum()등의 함수를 사용해서 값을 받아온다. -->
		</tr>
	<% }%>

스크립틀릿과 html을 알맞게 사용하여 코드 구현

 

※ <a href=detail.jsp?num=<%=arr.get(i).getNum()%>"> 에서 ?(물음표)의 의미

detail.jsp로 이동하는데 ?뒤의 num값을 매개변수로해서 넘겨준다. 여러 값을 넘겨주려면 &사용