[Android] 안드로이드와 오라클 JSP로 연동/통신하기

이번 포스팅에서는 안드로이드 스튜디오와 오라클을 연결하는 방법에 대해서 한번 알아보도록 하겠습니다. 안드로이드 스튜디오에 내부 DB인 SQLite와는 직접적으로 바로 연결이 가능하지만 Oracle과 MySQL 같은 외부 DB는 안드로이드에서 직접적으로 접근이 불가능합니다. 보안상의 이유 때문이라고 하네요.

연동/통신하기1

그러므로 위 사진과 같이 JSP 혹은 서블릿등으로 오라클과 통신하기 위해서는 중간 다리를 만들어 줘야 하는데 이번 포스팅에서는 안드로이드를 JSP 서버를 이용하여 오라클과 연결할 수 있는 방법에 대해서 알아보도록 하겠습니다. 안드로이드에서 JSP로 통신 값을 보내고 그 통신 값을 JSP에서 오라클로 넣어주는 방식입니다. 먼저 안드로이드(클라이언트)부터 작업을 시작하도록 하겠습니다.

     

     Android Studio 

    androidManifest.xml

    <uses-permission android:name="android.permission.INTERNET"/>

    1. manifests에서 외부 JSP사이트와 연결이가능하도록 인터넷 사용을 허가하도록 해줍니다.

     

    Task.java

    public class Task extends AsyncTask<String, Void, String> {
        public static String ip ="172.22.229.37"; //자신의 IP번호
        String sendMsg, receiveMsg;
        String serverip = "http://"+ip+"/ex/list.jsp"; // 연결할 jsp주소
    
        Task(String sendmsg){
            this.sendMsg = sendmsg;
        }
        @Override
        protected String doInBackground(String... strings) {
            try {
                String str;
                URL url = new URL(serverip);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setRequestMethod("POST");
                OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream());
    
                if(sendMsg.equals("vision_write")){
                    sendMsg = "vision_write="+strings[0]+"&type="+strings[1];
                }else if(sendMsg.equals("vision_list")){
                    sendMsg = "&type="+strings[0];
                }
    
                osw.write(sendMsg);
                osw.flush();
                if(conn.getResponseCode() == conn.HTTP_OK) {
                    InputStreamReader tmp = new InputStreamReader(conn.getInputStream(), "UTF-8");
                    BufferedReader reader = new BufferedReader(tmp);
                    StringBuffer buffer = new StringBuffer();
                    while ((str = reader.readLine()) != null) {
                        buffer.append(str);
                    }
                    receiveMsg = buffer.toString();
                } else {
                    Log.i("통신 결과", conn.getResponseCode()+"에러");
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return receiveMsg;
        }
    }

    2. JSP와 통신할 Task.java를 만들어주세요.

    ip부분에서는 자신의 ip번호를 써주시고 serverip에서는 중간다리 역할을 할 jsp 홈페이지 주소를 써주시면 됩니다.

    그런 뒤 위에서 만든 Task에 값을 보내주도록 하겠습니다.

     

    String sendmsg = "vision_write";
    String result = "값"; //자신이 보내고싶은 값을 보내시면됩니다
    try{
        String rst = new Task(sendmsg).execute(result,"vision_write").get();
    }catch (Exception e){
        e.printStackTrace();
    }

    3. 값을 보내는 방법은 자신이 보내고 싶으신 값이 있는 java파일에서 위와 같은 코드를 넣어주면 됩니다. 위의 코드처럼 자신이 보내고 싶은 값이 있는 class에서 Task로 메시지를 보내주세요. 코드를 간략히 설명하자면은 vision_write라는 이름으로 result라는 변수 안에 있는 값을 넘기겠다는 의미입니다. 성공적으로 진행되었다면 success라는 문구가 찍히게 될 겁니다.

     

    JSP Server

    이제 중간다리를 할 JSP Server(서버)를 만들어서 안드로이드에서 넘어온 값을 받아 오라클에 저장시켜보는 작업을 해보겠습니다.
    연동/통신하기2
    4. 서버를 만들기전에 테이블부터 만들어주겠습니다. 위와 같이 만들어주면 됩니다.
     
     
     
    연동/통신하기3

    연동/통신하기 1

    위와 같은 구조로 JSP 프로젝트를 만들 하나 만들어 줍니다.

     

    list.jsp

    <%@page import="java.util.ArrayList"%>
    <%@page import="ex.*"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <%
       request.setCharacterEncoding("UTF-8");
       
       String returns = "";
       String type = request.getParameter("type");
       String vision = request.getParameter("vision_write");
    
    %>
    <%
       if (type == null) {
          return;
       }else if (type.equals("vision_write")) {
          System.out.println("값을받았습니다."+vision);
          Vision_Write vision_board = Vision_Write.getWrite();
          returns = vision_board.write(vision);
          out.println(returns);
          System.out.println(returns);
       }else if (type.equals("vision_list")) {
          System.out.println("값을 리턴합니다.");
          Vision_Board vision_board = Vision_Board.getVision_Board();
          returns = vision_board.select();
          out.println(returns);
         System.out.println(returns);
       }
    %>

    6. list.jsp는 안드로이드에서 보낸 값을 받는 페이지입니다. 위의 코드를 복사 붙여 넣어주세요.

     

    Vision_Write.java 

    package ex;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.SimpleDateFormat;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;
    
    public class Vision_Write {
    	private static Vision_Write vision = new Vision_Write();
    
    	public static Vision_Write getWrite() {
    		return vision;
    	}
    	private String returns = "";
    	private Connection conn = null;
    	private PreparedStatement pstmt = null;
    	private PreparedStatement pstmt2 = null;
    	private ResultSet rs = null;
    
    	public String write(String content) {
    	    try {
    		Context init = new InitialContext();
    		DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
    		conn = ds.getConnection();
    
    		Statement stmt = conn.createStatement();
    		String seq = "select max(num) from market_vision";
    		ResultSet rs = stmt.executeQuery(seq);
    
    		int num = -1;
    		if (rs.next())
    			num = rs.getInt(1);
    		num++;
    
    		String nowTime = getCurrentTime("YYYY,M,d");
    		System.out.println(nowTime);
    
    		System.out.println("시간확인" + nowTime);
    
    		String sql = "insert into MARKET_VISION(num,day,content) 
                                  values('"+ num +"','" + nowTime + "','" + content + "')";
    		pstmt = conn.prepareStatement(sql);
    		pstmt.executeUpdate();
    		returns = "success";
    
    	} catch (Exception e) {
    		e.printStackTrace();
    	} finally {
    	    if (pstmt != null)
    		try {
    			pstmt.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	    if (rs != null)
    		try {
    			rs.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	    if (conn != null)
    		try {
    			conn.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	return returns;
           }
            public static String getCurrentTime(String timeFormat) {
    	       return new SimpleDateFormat(timeFormat).format(System.currentTimeMillis());
            }
    }

    7. 그런 뒤 안드로이드 스튜디오에서 받은 값을 DB에 저장시킬 Vision_Write.java를 JavaResources안에 만들어주고,

    Vision_Write.java에 위에 있는 코드를 붙여 넣어줍니다.

    Vision_Write는 list.jsp에서 보내준 값을 데이터베이스(오라클)에 저장시키는 역할을 하게 됩니다.

     

    Vision_Board.java 

    package ex;
    
    import java.sql.*;
    import java.util.*;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;
    
    public class Vision_Board{
       private static Vision_Board vision_board = new Vision_Board();
    
       public static Vision_Board getVision_Board() {
          return vision_board;
       }
    
       private String returns;
       private Connection con = null;
       private PreparedStatement pstmt = null;
       private ResultSet rs = null;
    
       public String select() {
          try {
            returns ="";
             Context init = new InitialContext();
             DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
             con = ds.getConnection();
             String query = "SELECT * FROM MARKET_VISION ORDER BY NUM DESC";
             pstmt = con.prepareStatement(query);
             rs = pstmt.executeQuery();
             
             while(rs.next()) {
                returns +=rs.getString("DAY")+"\t"+rs.getString("CONTENT")+"\t";
             } // end while
          } catch (Exception e) {
             e.printStackTrace();
          } // end try~catch
    
          finally {
              if (pstmt != null)
                    try {
                       pstmt.close();
                    } catch (SQLException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                    }
                 if (rs != null)
                    try {
                       rs.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                       e.printStackTrace();
                    }
                 if (con != null)
                    try {
                       con.close();
                    } catch (SQLException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                 }
          }
          return returns;
       }// end select()
    
    }

    8. 데이터베이스에서 글의 목록을 가지고 올 Vision_Board.java입니다. Vision_Write와 같은 방식으로 만들어주면 됩니다.

     

    9. 여기까지 따라왔으면 끝났습니다.

    이제 안드로이드에서 전달한 값이 오라클에 잘 저장되고 출력되는지 한번 테스트해볼게요.

    톰캣을 이용하여 jsp페이지를 실행시켜주고

    안드로이드 스튜디오를 실행시켜 오라클에 값을 넣어보도록 하겠습니다.

    연동/통신하기4

    성공적으로 안드로이드에서 요청한 값이 오라클에 잘 저장되었군요.

    오라클에 있는 값을 사용할 경우에는 

    안드로이드에서 값을 불러올 Java.class에서

    String sendmsg = "vision_list";
    String result; //전체출력 result;
    try{
        result  = new Task(sendmsg).execute("vision_list").get();//디비값을 가져오기
    }catch (Exception e){
        e.printStackTrace();
    }

    위와 같은 식으로 값을 불러와서 쓰면 됩니다.

     

    [Android] 안드로이드와 오라클 스프링으로 연동/통신하기

     

    댓글

    Designed by JB FACTORY