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

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

연동/통신하기

그러므로 위 사진과 같이 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(서버)를 만들어서 안드로이드에서 넘어온 값을 받아 오라클에 저장시켜보는 작업을 해보겠습니다.
    연동/통신하기
    4. 서버를 만들기전에 테이블부터 만들어주겠습니다. 위와 같이 만들어주면 됩니다.

    연동/통신하기

    5.  위와 같은 구조로 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페이지를 실행시켜주고

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

    연동/통신하기

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

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

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

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

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


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


    댓글(48)

    • ㅁㄴㅇㄹ
      2017.11.18 15:10

      감사합니다 덕분에 1주일동안 머리싸매고있던게 해결됐네요

    • alsgur22
      2017.11.21 22:16

      안녕하세요 지금 JSP서버로 게시판을 만들고있는 초보개발자입니다. 이글을 보고 안드로이드 -> 오라클로 값을 넣는거는 성공했는데 값을 빼오는 부분은 안드로이드에서 어떻게받는가요??

      • 2017.11.22 00:43 신고

        returns라는 변수에 담아서 가져와요 returns 변수의 경로를 잘따라가서 다시한번 확인해주시기 바랍니다.

    • aaa
      2018.05.07 23:35

      Vision_Board 코드는 없나요..?

      • 2018.05.07 23:46 신고

        Vision_Board는 Vision_Write와 비슷하게 그냥 데이터베이스에 접속하여 데이터를 SELECT 가져오는 코드인데 원하시면 추가해드릴까요?

      • aaa
        2018.05.09 18:05

        네 가능하시다면 소스코드 좀 올려주시면 정말감사하겠습니다.

      • 2018.05.10 21:08 신고

        방금 소스코드 추가해서 올려드렸습니다. 확인부탁드려요

      • aaa
        2018.05.13 11:33

        감사합니다. 잘쓰겠습니다.

    • yys
      2018.06.05 00:57

      Vision_Board.java에서
      import javax.naming.Context;
      import javax.naming.InitialContext;
      이 부분이 아예 안된다고 뜨는데 어떻게 해야할까요 ㅠㅠ

      • 2018.06.05 01:28 신고

        Import가 안되신다고요? 그럼 이클립스가 JDK를 읽지못하고있을 가능성이 있습니다. 체크부탁드려요.

        아래글 참조
        http://coding-factory.tistory.com/6

      • yys
        2018.06.05 01:41

        안드로이드스튜디오에서 build path를 확인할 수 있는 방법은 없나요??

        ㅠㅠ 안드로이드 스튜디오 자료가 부족해서 입문하기가 너무 어렵네요 ㅠㅠㅠㅠ

      • 2018.06.05 01:43 신고

        안드로이드도 설정에서 build path확인하는법 있어요. 구글링 한번해보세요 혹시 모르니 자동임폴트 Ctrl+Alt+O 였나? 이거 한번해보세요.

      • yys
        2018.06.05 01:46

        여러모로 도움이 많이되는 블로그 운영해주셔서 감사해요!!

        우선 구글링 열심히해볼게요!!

        그리고 안드로이드에서 실행한다는게 어플리케이션 실행한다는 의미가 맞는거죠??

      • yys
        2018.06.05 01:49

        java. 은 import 다 잘되는데
        javax.naming.Context
        javax.naming.Initialcontext 이 둘만 import 안될 수도 있나요?? ㅠㅠ

      • 2018.06.05 01:53 신고

        네 실행은 안드로이드에서 애뮬을 실행시키든지 핸드폰으로 연결해서 하든지 하시면 되고요 저거 두개만 import안되는거는 저는 잘 모르겠네요.

        구글링 해보니까
        https://stackoverflow.com/questions/16803343/javax-cannot-be-imported-in-my-android-app
        이런 글이 나오네요.
        한번해보세요.

      • yys
        2018.06.05 02:15

        error: package javax.naming does not exist

        이게 원인인거 봐서 패키지가 없는 것 같아요 ㅠㅠ
        jar??파일을 다운받으면 된다는데 혹시 아시는 부분이 있을까요? 워낙 초심자라 이런 자잘한 부분까지 질문드려서 죄송합니다.

      • 2018.06.05 02:19 신고

        혹시 JDK 몇버전 쓰시고계세요??? JDK버전이 낮아서 JDK안에 패키지가 없을수도있겠다는 생각이드네요

      • yys
        2018.06.05 02:23

        버젼은 낮지 않은데 이상하게 naming부분 패키지만 없었네요. 다운받을 때 오류가 생긴건지.... 지금 패키지 추가를 시켜서 컴파일 오류는 안뜨게 되었습니다.
        진짜 여러모로 도와주셔서 정말 감사합니다! 블로그 자주자주 들리고 또 질문 올릴게요~~

      • 2018.06.05 02:24 신고

        해결하셨다니 다행이네요~ 자주놀러오세요. 감사합니다

    • 데이비드리
      2018.06.15 10:27

      지식공유 정말 감사합니다.
      그렇다면 Android 에서 돌아가는 twitter나 facebook들도 다 jsp,php등의 웹게시판앱이라고 봐도 무방하겠네요?

    • yong9
      2018.08.01 14:49

      안녕하세요 우선 좋은 글 감사합니다. 다름이 아니라 오라클과 연동하는 과정에서 오라클 workspace와 workspace가 있는 ip 주소와 같은 것은 필요가 없는것인가요? 어떻게 그 패스가 없는데 연동이 되는지 궁금합니다!!

      • 2018.08.01 15:22 신고

        오라클과 연동하는 부분은 JSP에서 담당합니다. 오라클 연동정보는 JSP프로젝트 안의 MATA-INF 안의 context.xml에 있습니다.

      • yong9
        2018.08.01 17:32

        context.xml 과 관련된 부분은 어디서 확인 가능한지 알 수 있을까요..?

      • 2018.08.02 13:59 신고

        ctrl + shift +r 누르신 뒤 context.xml 찾아보세요. 그리고 구글에 context.xml 설정 이렇게 치니까 여러개 나오네요 한번 확인해보세요

    • 이슬티
      2018.09.17 11:42

      안녕하세요 항상 많은 도움 받고 있습니다. 현재 회원가입 기능을 구현중에 있는데 위 방법대로 값 하나는 제대로 DB로 받아져 옵니다. 하지만 안드로이드에 있는 값 여러개 받는 방법을 이리저리 해도 모르겠네요 ㅠㅠ

      • 2018.09.17 15:28 신고

        가장 간단하게 구현하려면 String변수를 여러개 선언해서 값을 넘기고 받으면 해결될거구요. 좀 더 간결하게 하고싶으시면 List로 데이터를 주고 받아보세요.

    • 나야나
      2018.11.01 21:10

      Task자바는 메인 자바두고 그냥 만들면 되는건가요?

    • tjs1916@naver.com
      2018.12.05 15:48

      3. 값을 보내는 방법은 자신이 보내고싶으신 값이 있는 java파일에서 위와 같은 코드를 넣어주면 됩니다.

      위의 코드처럼 자신이 보내고싶은 값이 있는 class에서 Task로 메시지를 보내주세요.

      코드를 간략히 설명하자면은 vision_write라는 이름으로 result라는 변수안에 있는 값을 넘기겠다라는 의미입니다.

      성공적으로 진행되었다면 success라는 문구가 찍히게 될겁니다.

      이 부분이 잘 이해가 가지 않습니다 ... ,,,,

      • 2018.12.16 13:38 신고

        자신이 보내고싶은 클래스에서 Task 클래스로 데이터를 보내면 된다는 뜻입니다.

    • sss
      2018.12.14 17:52

      데이터베이스를 이용한 오픈소스에 관해서 여쭤보고싶은데 코드가 길이가 좀 있어서 그런데 혹시 봐주실수있나요

      • 2018.12.16 13:40 신고

        봐드릴수는 있는데 제가 지금 코드를 돌려보지를 못해서 정확하게 문제점을 파악하기 힘들거같아요

    • kkkk
      2019.05.28 10:57

      저는 왜 안될까요 ㅠㅠㅠㅠ 따라했는데
      DB에값이안들어가네요... 이거 디버깅은못하나요?

      • 2019.05.29 00:56 신고

        디버깅 할 수 있죠 안드로이드 스튜디오에서는 shift + F9 누르시면 되고 이클립스에서도 디버그모드로 실행시켜보세요

    • rejoi
      2019.06.28 23:59

      한가지 질문드려도 될까요?
      설명해 주신 내용을 활용해서 db에 연결해서 값을 저장하고 불러오는 부분은 성공했는데요..
      2개의 클라이언트(에뮬레이터 + 핸드폰에 설치)에서 a라는 jsp를 동시에 호출했을때 넘겨주는 파라메터를 동시에 받아서 처리가 제대로 되지않는 것을 발견했습니다.
      즉, 로그인을 처리하기위해 이이디와 패스워드 리턴받을 커서 3개의 파라메터를 보냈는데 동시에 받다보니 6개를 받아서 오류가 난다거나..
      동시에 호출하지않고 순차적으로 호출했을때 2개의 클라이언트가 중 하나는 값을 받지 못하는 증상이 있던데 이럴때는 어떤식으로 서버에 추가 적으로 처리해야 할게 있는지요?

      • 2019.06.29 19:43 신고

        데드락이 일어나는거 같은데 일단 제생각에 DB에서 나는거같은데 한번 확인해보시고 구글에서 데드락/교착현상 이라는 키워드로 구글링 한번해보세요

    • 1234
      2019.09.04 17:24

      혹시 안드로이드 스튜디오 파일 구조도 5번 처럼 사진 넣어 주실 수 있나요??

      • 2019.09.05 09:11 신고

        워낙 예전글이라 조금 힘들거같아요. 그런데 Task.java하나만 있으면 됩니다. Task.java 하나 만드시고 다른 Java에서 Task.java로 값만보내주시면 되요

    • 죠스킴
      2020.02.17 23:36

      정말 궁금해하던 통신시스템을 이해했네요 .
      혹시 안드로이드 로그인 form 에서 아이디,암호-> jsp(asp,php) -> DB -> jsp(asp,php) 비교 결과값 => 안드로이드 로그인 성공/실패 요런 예제나 공부를 할만한 커뮤니티등 있을까요??
      참고로 asp 개발자라 ㅠㅠ 서버단 디비 핸들링은 큰 문제가없는데 데이터 주고 받는게 영 감이 안잡히네요.. ㅠㅠ
      강좌 너무 잘 봤습니다.

      • 2020.02.18 11:15 신고

        글 봐주셔서 감사합니다. 안드로이드 공부 커뮤니티 같은건 잘 모르겠습니다.

    • 123
      2020.05.04 01:12

      result2 는 어디에 있나요?

      • 2020.11.09 01:29 신고

        result2는 무시하셔도 되요. 다른 기능을 구현하는데 사용하던 변수인데 복붙하는 과정에서 딸려왔네요... 글에서 삭제할게요

    • so
      2021.01.15 13:24

      안녕하세요 너무 잘 정리해주셔서 감사합니다
      혹시 mysql과 연동할때에는 위의 코드에서 어디부분을 수정하면 좋을까요

      • 2021.01.16 16:08 신고

        mysql도 위의 코드 그대로 호환 될겁니다. 데이터 베이스 연동부분만 바꾸시면 될것 같아요

    • 정수빈
      2021.09.06 18:59

      안녕하세요!! 막막했는데 쉽게 따라할 방법을 알려주셔서 감사합니다 ㅠㅠ
      최근에도 답변해주시는것 같아 질문 하나 남겨봅니당...

      위에 하신것대로 구조랑 프로젝트명 다 똑같이했는데
      HTTP상태 404 - Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것이 존재하는지를 밝히려 하지 않습니다.
      오류가 뜹니다...

      구글에 검색해서 이것저것 해보고있는데 계속 같은 오류네요 ㅠㅠㅠ 혹시 해결하셨던 경우나 이유 알 수 있을까요..?

      • 2021.09.09 17:23 신고

        자세한 이유는 모르겠지만 안드로이드측에서 서버의 위치를 못찾는거같은데 음... 당장 생각나는거는 위의 내용을 다 똑같이 따라하셨다면 같은 와이파이로 설정되어있는지 확인해주세요. 서버로 돌리고 있는 컴퓨터는 랜선이고 핸드폰은 와이파이면 못찾을 수 있어요.

    Designed by JB FACTORY