안드로이드 폰 오라클 데이터베이스와 연동하기 ( model 1 : jsp ) :: 소림사의 홍반장!

                xml parser 사용
안드로이드 <----------> 컨테이너 ( JSP )
MainActivity                           select.jsp
InsertActivity                           insert.jsp
DeleteActivity                         delete.jsp
EmpDTO                                    |
                                              |
                                              |
                                           EmpDAO - 오라클과 DB 연동 <----------> 오라클
                                           EmpDTO - 데이터 저장        

 

<< 아래 예제 소스 프로젝트 압축파일입니다. 찾으시는 분들이 꽤 계셔서 파일로 올려드려요~ >>

<< 지극히 초보적인 코딩이므로 참고만 하시기 바랍니다. >>

EmpTest_.zip

적용하시는데 워낙 어려워하시는 분들이 많으신 것 같아서 차근차근 스샷으로 설명드립니다.


우선 다운로드 받으신 ZIP 파일을 압축 푸시면 다음과 같은 폴더 2개가 보이실겁니다.


안드로이드 프로젝트 하나와 웹 프로젝트 2개인데요..

35EmpTest - 안드로이드 프로젝트

  : ADT, Android Studio 등의 개발툴에서 import 함

99JSP_myEMP - 웹프로젝트

  : eclipse 등의 개발툴에서 import 함.


웹프로젝트부터 import 하여 정상적으로 작동하는지 살펴봅시다.

대부분 아래처럼 에러화면이 나올듯 한데요.. 이는 jre 버전이 안맞아서 그런것이니 걍 맞춰주면 되지요 ㅎ


프로젝트 우클릭스로 properties > Libraries > JRE System Library Edit...





자 이제 에러표시가 다 사라졌네요 프로젝트이름 옆에 x표시는 걍 냅둬셔유..


그럼 이제 DB 데이터를 select 해 올 수 있는지 테스트 해봐야 겠지요...

일단 저는 로컬에서 테스트 하는거구요 로컬에는 ORACLE이 설치되어 있으므로 오라클 DB 기준으로 설명드립니다.

EmpDAO 클래스 찾아서 보시면 아래처럼 DB정보 입력하는 곳이 있는데요 설치된 정보대로 넣어주시면 됩니다.

※ 현업에서는 보통 was서버에 datasource 등록해 놓고 사용하지요...

    이렇게 직접 소스에 DB 정보를 입력해서 접속하는 경우는 거의 없겠지만 이건 테스트이므로...ㅎ


※ 아참 보통 오라클 설치를 하면 기본적으로 scott 계정이 있을텐데요 저는 11g 버전 설치했는데 계정이 비활성화 되어 있더군요.

이런경우는 아래처럼 활성화 시켜 놓은 상태에서 select을 해야 데이터 조회가 가능하겠죠?

자 이렇게 조회되는것까지 확인했으니 다시 진행해봅시다.ㅎ


사실 이제 웹프로젝트에서는 할 게 없어요.. DB 연결 끝났으니 제대로 select 가 되는지 확인만 해 보면 됩니다.

이클립스 톰캣 서버에 add 하시고 서버 실행하고 조회 페이지로 접속해 봅시다. 데이터가 제대로 나오는지..ㅎ


페이지 형식을 XML 로 안해놔서 데이터가 그냥 다 붙어 나오네요.ㅋㅋ

실제 들어가 있는 데이터를 확인해보면 저렇게 XML 형태로 출력된 모습을 볼 수 있습니다.

저 조회 페이지를 안드로이드에서 호출해서 이 XML 데이터를 파싱해서 가져올겁니다.



자 그럼 이제 2단계! 안드로이드 프로젝트를 import 해 봅시다!

아래 스샷은 android studio에서 import 한 모습인데요. 기존 ADT에서 내보내기한 프로젝트도 이렇게 import 가 가능합니다.

헌데.. gradle 을 이용한 빌드 시스템이 멘붕오게 하더군요...

에뮬레이터에서 실행시키려고 하니까 자꾸 빌드 오류가 나던데... 메모리 설정 관련되서 오류나는 경우가 많다고 합니다.

저는 실행중인 프로그램이랑 불필요한 서비스 다 끄고 다시 켜서 하니까 되던데.. 

암튼 저처럼 non-zero exit value 1 에러 뜨는 분들은 구글 선생에게 좀 더 정확한 답을 얻으시기 바랍니다.


자 암튼 이제 빌드가 완료되고 에뮬레이터에서 작동이 됩니다~!! 두둥두둥~

근데 요런 에러 뜨시는 분들이 참 많으셨죠???

이게 바로 아래처럼 requestURL 을 localhost로 설정하거나 아니면 에뮬레이터(또는 스마트폰)에서 직접 접근을 할 수 없는 URL 로 설정이 되서 그런겁니다.

저 URL로 연결이 안되니까 inputstream을 생성을 못해서 에러가 나는거에요.. 일단 localhost 는 절대 불가함!!!!

자 다시한번 한마디로 정리하자면..

접근 불가능하면 에러납니다!!

고로.. 같은 네트워크 망 안에 있으면 ip 로 접근 가능하다는 거구요.. 

( 에뮬레이터 - PC, 같은 와이파이망 내의 스마트폰 - PC ) 

이런 상황인 경우에는 테스트하신다면 cmd > ipconfig > ipv4 아이피주소를 확인해서 입력해주시구요. 요렇게..

웹프로젝트를 띄워놓은 PC와 접근하려는 안드로이드 기기가 다른 네트워크에 있는경우

( 3G핸드폰 - PC ) 이런 경우 테스트하시는 분들은 보통 외부에서 접근할 수 있는 도메인이나 고정IP로 설정하셔야 합니다.

서버를 보유하고 계시지 않으신 분들은 각 인터넷 단말기의 포트포워딩을 통한 고정 IP 사용 방법을 검색하셔서 세팅 하셔야 합니다.

보통 우리가 흔히 쓰는 브로드밴드, 올레, 유플러스 등등 요런 인터넷은 선 연결 하면 자동으로 ip 주소를 할당해주는 유동 ip거든요..

아무리 ipconfig에서 IP주소 써넣는다고 해도 다른 망에 있는 기기에서는 접근할 수 없겠죠?


암튼 전 모두 로컬 PC에서 테스트구성한거라 포트포워딩 설정까지는 안했구요 그냥 에뮬레이터에서 접근했습니다.

이렇게 나오면 성공입니다!

 


※ 혹시 안드로이드 3.0(허니콤) 이상 쓰시는 분들중에 에러나는 경우에는 아래를 참고하여 주시기 바랍니다.

유현석님의 댓글 중...

저도 같은 에러로 한참 찾아봤는데
http://gochul.tistory.com/3 참고하시면 될거같습니다.

Log.i("xxx", "requestGet start"); 여기 다음줄에...
===================================
if(android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
===================================

추가 하시면 될겁니다.

안드로이드 3.0부터는 android.os.NetworkOnMainThreadException 이라는 에러가 발생한다고 해요


감사합니다!.




* MainActivity 예제 소스
public class EmpMainActivity extends Activity {
	
	Button btn;
	ListView lv;
	
	CustomAdapter adapter;	
	
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        lv = (ListView)findViewById(R.id.listView1);
                
        btn = (Button)findViewById(R.id.button1);
        btn.setOnClickListener(new View.OnClickListener() {
			
	public void onClick(View v) {
				
		Intent intent = new Intent(getApplicationContext(), InsertActivity.class);
		startActivity(intent);
	}
	});//end onClick()
        
    }//end onCreate
    
    public InputStream requestGet(String requestURL) {
    
    	Log.i("xxx", "requestGet start");
    	try {
    		
    	//1.
        	HttpClient client = new DefaultHttpClient();
        	
        	///////////////////////////////////////////
        	
//        	requestURL = requestURL + "?key=aaa&key2=홍길동";
//        	//폼데이터 저장
        	List list = new ArrayList();
//        	list.add(new BasicNameValuePair("key", "aaa"));
//        	list.add(new BasicNameValuePair("key1", "bbb"));
//        	list.add(new BasicNameValuePair("key2", "홍길동"));
//        	list.add(new BasicNameValuePair("key3", "ddd"));
//        	list.add(new BasicNameValuePair("key4", "eee"));
//        	requestURL = requestURL + "?" + URLEncodedUtils.format(list, "UTF-8");
        	
        	///////////////////////////////////////////
        	
        	
        	HttpGet get = new HttpGet(requestURL);
        	
        	//2. 요청
        	HttpResponse response = client.execute(get);
    		
        	//3. 결과 받기
        	HttpEntity entity = response.getEntity();
        	InputStream is = entity.getContent();
        	return is;
			
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
    }//end requestGet()
    
    public String streamToString(InputStream is) {
    	
    	StringBuffer buffer = new StringBuffer();
    	try {
			
    		BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
    		String str = reader.readLine();
    		while(str != null) {
    			buffer.append(str+"\n");
    			str = reader.readLine();
    		}
    		reader.close();
    		
		} catch (Exception e) {
			e.printStackTrace();
		}
    	
    	return buffer.toString();
    }//end streamToString()
    
    
    public ArrayList getXML(InputStream is) {
    	ArrayList list = new ArrayList();
    	Log.i("xxx", "getXML start!");
    	
    	try {
    		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    		XmlPullParser parser = factory.newPullParser();
			
		                parser.setInput(is, "UTF-8");
			
			int eventType = parser.getEventType();
			
			EmpDTO dto = null;
			
			while( eventType != XmlPullParser.END_DOCUMENT) {
				switch(eventType) {
				
				case XmlPullParser.START_TAG:
					
					String startTag = parser.getName();
					if(startTag.equals("record")){ dto = new EmpDTO(); }
					
					if(dto !=null ) {
						
						if(startTag.equals("deptno"))
                    { dto.setDeptno(Integer.parseInt(parser.nextText())); }
						if(startTag.equals("dname"))
                    { dto.setDname(parser.nextText()); }
						if(startTag.equals("loc"))
                    { dto.setLoc(parser.nextText()); }
					} else { Log.i("xxx", "dto = null"); }
					break;
					
				case XmlPullParser.END_TAG:
					
					String endTag = parser.getName();
					if(endTag.equals("record")){ 

						list.add(dto);
					}
				}//end switch
				
				eventType = parser.next();
				
			}//end while
			
			 for( EmpDTO xx : list){
		        	Log.i("xxx",xx.getDeptno()+" "+xx.getDname()+" "+xx.getLoc());
		        }
			 
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException ie) {
			// TODO Auto-generated catch block
			ie.printStackTrace();
		}
    	return list;
    }

	@Override
	protected void onResume() {
		super.onResume();
		String requestURL = "http://IP주소/99JSP_myEMP/select2.jsp";
		InputStream is = requestGet(requestURL);
//		String data = streamToString(is);
//		Log.i("xxx", data);
		ArrayList list = getXML(is);
		adapter = new CustomAdapter(getApplicationContext(),list,R.layout.custom_list);
        lv.setAdapter(adapter);
	}
    
}//end class


* InsertActivity 예제 소스
public class InsertActivity extends Activity {
	
	EditText edit_deptno,edit_dname,edit_loc;
	Button btn_insert;
	
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.insert_layout);
        
        edit_deptno = (EditText)findViewById(R.id.edit_deptno);
        edit_dname = (EditText)findViewById(R.id.edit_dname);
        edit_loc = (EditText)findViewById(R.id.edit_loc);
        
        btn_insert = (Button)findViewById(R.id.btn_insert);
        btn_insert.setOnClickListener(new View.OnClickListener() {
			
	public void onClick(View v) {
				
		String deptno = edit_deptno.getText().toString();
		String dname = edit_dname.getText().toString();
		String loc = edit_loc.getText().toString();
		String requestURL = "http://IP주소/99JSP_myEMP/insertdo2.jsp";
		InputStream is= requestGet(requestURL,deptno,dname,loc);
						
		finish();
	}
	});//end onClick()
        
    }//end onCreate
    
    public InputStream requestGet(String requestURL, String deptno, String dname, String loc) {
        
    	Log.i("xxx", "requestGet start");
    	try {
    		
    	//1.
        	HttpClient client = new DefaultHttpClient();
        	
        	//폼데이터 저장
        	List dataList = new ArrayList();
        	dataList.add(new BasicNameValuePair("deptno", deptno));
        	dataList.add(new BasicNameValuePair("dname", dname));
        	dataList.add(new BasicNameValuePair("loc", loc));
        	requestURL = requestURL + "?" + URLEncodedUtils.format(dataList, "UTF-8");
        	
        	HttpGet get = new HttpGet(requestURL);
        	
        	//2. 요청
        	HttpResponse response = client.execute(get);
    		
        	//3. 결과 받기
        	HttpEntity entity = response.getEntity();
        	InputStream is = entity.getContent();
        	return is;
			
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
    }//end requestGet()
    
}//end class


* select.jsp 예제 소스
<%@page import="test.com.jsp.EmpDTO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="test.com.jsp.EmpDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	EmpDAO dao = new EmpDAO();
	ArrayList list = dao.select();	

	StringBuffer buffer = new StringBuffer();
	buffer.append("");
	for(EmpDTO dto : list) {
		int deptno = dto.getDeptno();
		String dname = dto.getDname();
		String loc = dto.getLoc();
		buffer.append("");
		buffer.append(""+deptno+"");
		buffer.append(""+dname+"");
		buffer.append(""+loc+"");
		buffer.append("");
	}
	buffer.append("");
%>
<%= buffer.toString()%>


* insert.jsp 예제 소스
<%@page import="test.com.jsp.EmpDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>



<%

	//한글처리
	request.setCharacterEncoding("UTF-8");

	// 폼데이터 얻기
	String deptno2 = request.getParameter("deptno");
	String dname2 = request.getParameter("dname");
	String loc2 = request.getParameter("loc");
	
	// 오라클로 저장
	EmpDAO dao = new EmpDAO();
	dao.insert(deptno2,dname2,loc2);
	
%>


* EmpDAO 예제 소스
public class EmpDAO {
	
	ArrayList list;
	
	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@IP주소:1521:orcl";
	String userid = "scott";
	String passwd = "tiger";
	
	
	public EmpDAO() {
		
		try {
			list = new ArrayList();
			Class.forName(driver);
			
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
			
		}//end try~catch
	}//end 생성자
	

	public ArrayList select() {
		
		
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			
			//3.	Connection 맺기	
				con = DriverManager.getConnection(url, userid, passwd);

			//4.	sql 문 작성
				String query = 
            "SELECT deptno, dname, loc FROM dept ORDER BY deptno ";
				
			//5.	Statement 생성
				stmt = con.prepareStatement(query);
				
			//6.	sql 문 전송
				rs = stmt.executeQuery();

			//7.	Data 얻기

				// boolean b = rs.next();
				
				while ( rs.next() )	{

					  int deptno = rs.getInt("deptno");
		String dname = rs.getString("dname");
					String loc = rs.getString("loc");
					
					list.add(new EmpDTO(deptno,dname,loc));
					
				}//end while
				
			} catch (Exception e) {	e.printStackTrace();
} //end try~catch
			
			finally {
				
				//8.	자원 반납
				try {
					
					rs.close();
					stmt.close();
					con.close();
					
				} catch (SQLException se) {
					se.printStackTrace();
				}
				
			}
		//db 연동 끝
		return list;
	}//end select()
	
	public void insert(String deptno, String dname, String loc) {
		
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			
			//3.	Connection 맺기	
				con = DriverManager.getConnection(url, userid, passwd);

			//4.	sql 문 작성
				String insert =
          "insert into dept (deptno,dname,loc) values ( ?,?,? )";
				
			//5.	Statement 생성
				stmt = con.prepareStatement(insert);
			
			//6. 	내용 입력
				stmt.setInt(1, Integer.parseInt(deptno));
				stmt.setString(2,dname);
				stmt.setString(3,loc);
				
			//7.	sql 문 전송
				int n = stmt.executeUpdate();

			} catch (Exception e) {e.printStackTrace();} //end try~catch
			
			finally {
				
				//8.	자원 반납
				try {
					
					stmt.close();
					con.close();
					
				} catch (SQLException se) {
					se.printStackTrace();
				}
				
			}
		//db 연동 끝
	}//end insert()
			
	public EmpDTO retrieve(String deptno) {
		
		EmpDTO dto = new EmpDTO();
		
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			
			con = DriverManager.getConnection(url,userid,passwd);
			String sql = "select * from dept where deptno = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, Integer.parseInt(deptno));
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				dto.setDeptno(rs.getInt("deptno"));
				dto.setDname(rs.getString("dname"));
				dto.setLoc(rs.getString("loc"));
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				pstmt.close();
				con.close();
			} catch (SQLException se) {
				// TODO Auto-generated catch block
				se.printStackTrace();
			}
			
		}
		
		return dto;
		
	}//end retrieve()
	
	public void delete(String deptno) {
		
		EmpDTO dto = new EmpDTO();
		
		Connection con = null;
		PreparedStatement pstmt = null;
		
		try {
			con = DriverManager.getConnection(url,userid,passwd);
			String sql = "delete from dept where deptno=?";
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, Integer.parseInt(deptno));
			int n = pstmt.executeUpdate();
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				pstmt.close();
				con.close();
			} catch (SQLException se) {
				// TODO Auto-generated catch block
				se.printStackTrace();
			}
			
		}
		

	}//end delete
	
	public void update(String deptno, String dname, String loc) {
		
		Connection con = null;
		PreparedStatement pstmt = null;
		
		try {
			
			con = DriverManager.getConnection(url,userid,passwd);
			
			String sql = "update dept set dname = ?, loc = ? where deptno = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, dname);
			pstmt.setString(2, loc);
			pstmt.setInt(3, Integer.parseInt(deptno));
			int n = pstmt.executeUpdate();
			
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally{
			try {
				pstmt.close();
				con.close();
			} catch (SQLException se) {

				se.printStackTrace();
				
			}
		}
		
		
	}//end update()
	
}


* EmpDTO 예제 소스
public class EmpDTO {
	
	private int deptno;
	private String dname;
	private String loc;
	
	public EmpDTO(int deptno, String dname, String loc) {
		super();
		this.deptno = deptno;
		this.dname = dname;
		this.loc = loc;
	}

	public EmpDTO() {
		super();
	}

	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}

	public void setDname(String dname) {
		this.dname = dname;
	}

	public void setLoc(String loc) {
		this.loc = loc;
	}

	public int getDeptno() {
		return deptno;
	}

	public String getDname() {
		return dname;
	}

	public String getLoc() {
		return loc;
	}
	
}


다른 카테고리의 글 목록

Dev. 안드로이드/참고소스 카테고리의 포스트를 톺아봅니다