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

저번 포스팅에서는 안드로이드와 jsp와 연결/통신하는 방법을 포스팅 했었죠. 이번에는 안드로이드와 서블릿을 연결/통신하는 방법을 소개해드리고자 합니다. 저번 포스팅에서도 알려드렸다시피 안드로이드는 보안 관련 문제로 외부 DB(오라클, MYSQL, 몽고 DB 등)과의 직접적인 연결이 불가능합니다.

연동/통신하기1

그래서 사진과 같은 방식으로 안드로이드와 오라클 사이에 중간다리 역할을 하는 서버가 있어야 하는데 앞선 포스팅에서는 JSP로 중간다리역할을 하는 방법을 알려드렸다면 이번 포스팅에서는 서블릿 방식으로 안드로이드와 오라클을 연결하는 방법에 대해 포스팅하겠습니다. 안드로이드의 통신 값을 서블릿에서 받고 그 통신 값을 오라클에 넣어주는 전체적인 툴은 이전 포스팅과 동일합니다.

     Spring Server 

    연동/통신하기2

    1. 우선 서버부터 작업을 하도록 하겠습니다. 스프링 프로젝트(서버)를 하나 만들어 주세요.

    위와 같은 구조로 하나 만들어주면 됩니다.

     

    HomeController.java

    /*안드로이드 통신관련*/
    @RequestMapping("/vision")
    @ResponseBody
    public Map<String, String> androidTestWithRequestAndResponse(HttpServletRequest request){
    
            ArrayList<VisionDto> visionDto = new ArrayList<VisionDto>();
            Map<String, String> result = new HashMap<String, String>();
            String nowTime = getCurrentTime("YYYY,M,d");
            String num = "",day = "",content = "";
          
            VDao dao = sqlSession.getMapper(VDao.class);
           
            dao.writeDao(nowTime,request.getParameter("content"));
            
            visionDto = dao.listDao();
            
            for(int i=0;i<visionDto.size();i++) {
            	num += Integer.toString(visionDto.get(i).getNum())+"\t";
            	day += visionDto.get(i).getDay()+"\t";
            	content += visionDto.get(i).getContent()+"\t";
            }
    
            result.put("num",num);
            result.put("day",day);
            result.put("content",content);
    
            return result;
    }
    
    private String getCurrentTime(String timeFormat) {
             // TODO Auto-generated method stub
             return new SimpleDateFormat(timeFormat).format(System.currentTimeMillis());
    }

    2. 컨트롤러에 위에있는 코드 복사해서 붙여 넣어줍니다.

     

    Pom.xml

    <!-- MYBATIS사용 -->
    <dependency>
    	<groupId>org.mybatis</groupId>
    	<artifactId>mybatis</artifactId>
    	<version>3.2.8</version>
    </dependency>
    
    <dependency>
    	<groupId>org.mybatis</groupId>
    	<artifactId>mybatis-spring</artifactId>
    	<version>1.2.2</version>
    </dependency>
    		
    <!-- 안드로이드통신 -->
    <dependency>
     	<groupId>com.googlecode.json-simple</groupId>
     	<artifactId>json-simple</artifactId>
     	<version>1.1.1</version>
    </dependency>
    	
    <dependency>
    	<groupId>org.codehaus.jackson</groupId>
    	<artifactId>jackson-mapper-asl</artifactId>
    	<version>1.9.13</version>
    </dependency>
    
    <dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-databind</artifactId>
    	<version>2.7.3</version>
    </dependency>

    3. 그런 뒤 만든 프로젝트의 Pom.xml로 가서 dependency에 다음과 같은 코드를 추가해주세요.

    저는 서블릿과 오라클을 연동하는 부분을 mybatis방식으로 진행할 것이기 때문에 

    mybatis도 사용 가능하게끔 dependecy 해줬습니다.

     

    VDao.java 

    public interface VDao {
    	public ArrayList<visiondto> listDao();
    	public void writeDao(String day,String content);
    	public VisionDto viewDao(String strID);
    	public void deleteDao(String bId);
    }

    5. VDao interface에 위의 코드를 복사해 넣습니다.

     

    VDao.xml 

    <!--?xml version="1.0" encoding="UTF-8"?-->
    <mapper namespace="com.javalec.spring_mybatis.dao.VDao">
       <select id="listDao" resulttype="com.javalec.spring_mybatis.dto.VisionDto">
            select * from MARKET_VISION order by num desc
       </select>
      
       <insert id="writeDao">
       	insert into MARKET_VISION (num, day, content) values (vision_seq.nextval, #{param1}, #{param2})
       </insert>
       
       <delete id="deleteDao">
       	delete from MARKET_VISION where num = #{param1}
       </delete>
    </mapper>

    6. 오라클에 값을 주고받는 VDao.xml입니다.

     

    VisionDto.java 

    public class VisionDto {
    	int num;
    	String day;
    	String content;
    
    	public VisionDto() {
    		// TODO Auto-generated constructor stub
    	}
    	
    	public VisionDto(int num, String day, String content) {
    		this.num = num;
    		this.day = day;
    		this.content = content;
    	}
    
    	public int getNum() {
    		return num;
    	}
    
    	public void setNum(int num) {
    		this.num = num;
    	}
    
    	public String getDay() {
    		return day;
    	}
    
    	public void setDay(String day) {
    		this.day = day;
    	}
    
    	public String getContent() {
    		return content;
    	}
    
    	public void setContent(String content) {
    		this.content = content;
    	}
    }

    7. 오라클에 값을 주고받을 때 바구니 역할을 할 Dto입니다.

     

    연동/통신하기3

    8. 데이터가 저장될 테이블도 하나 만들어줍니다. 이렇게 하면 서버단의 작업은 끝이 납니다. 이제 클라이언트만 작업해주면 되겠군요.

     

     Android Studio 

    연동/통신하기4

    9. json 방식으로 서블릿과 통신할 예정이므로 build.grade에 다음과 같이 추가해줍니다. GSON이란 데이터를 JSON 형식으로 주고받을 수 있도록 구글에서 만든 라이브러리입니다.

     

    HTTPClient 

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.ProtocolException;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    
    public class HttpClient {
    
        private static final String WWW_FORM = "application/x-www-form-urlencoded";
    
        private int httpStatusCode;
        private String body;
    
        public int getHttpStatusCode() {
            return httpStatusCode;
        }
    
        public String getBody() {
            return body;
        }
    
        private Builder builder;
    
        private void setBuilder(Builder builder) {
            this.builder = builder;
        }
    
        public void request() {
            HttpURLConnection conn = getConnection();
            setHeader(conn);
            setBody(conn);
            httpStatusCode = getStatusCode(conn);
            body = readStream(conn);
            conn.disconnect();
        }
    
        private HttpURLConnection getConnection() {
            try {
                URL url = new URL(builder.getUrl());
                return (HttpURLConnection) url.openConnection();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        private void setHeader(HttpURLConnection connection) {
            setContentType(connection);
            setRequestMethod(connection);
    
            connection.setConnectTimeout(5000);
            connection.setDoOutput(true);
            connection.setDoInput(true);
        }
    
        private void setContentType(HttpURLConnection connection) {
            connection.setRequestProperty("Content-Type", WWW_FORM);
        }
    
        private void setRequestMethod(HttpURLConnection connection) {
            try {
                connection.setRequestMethod(builder.getMethod());
            } catch (ProtocolException e) {
                e.printStackTrace();
            }
        }
    
        private void setBody(HttpURLConnection connection) {
    
            String parameter = builder.getParameters();
            if ( parameter != null && parameter.length() > 0 ) {
                OutputStream outputStream = null;
                try {
                    outputStream = connection.getOutputStream();
                    outputStream.write(parameter.getBytes("UTF-8"));
                    outputStream.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if ( outputStream != null )
                            outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
        }
    
        private int getStatusCode(HttpURLConnection connection) {
            try {
                return connection.getResponseCode();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return -10;
        }
    
        private String readStream(HttpURLConnection connection) {
            String result = "";
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line = null;
                while ( (line = reader.readLine()) != null ) {
                    result += line;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(reader != null)
                        reader.close();
                } catch (IOException e) {}
            }
    
            return result;
        }
    
        public static class Builder {
    
            private Map<String, String> parameters;
            private String method;
            private String url;
    
            public String getMethod() {
                return method;
            }
    
            public String getUrl() {
                return url;
            }
    
            public Builder(String method, String url) {
                if(method == null) {
                    method = "GET";
                }
                this.method = method;
                this.url = url;
                this.parameters = new HashMap<String, String>();
            }
    
            public void addOrReplace(String key, String value) {
                this.parameters.put(key, value);
            }
    
            public void addAllParameters(Map<String, String> param) {
                this.parameters.putAll(param);
            }
    
            public String getParameters() {
                return generateParameters();
            }
    
            public String getParameter(String key) {
                return this.parameters.get(key);
            }
    
            private String generateParameters() {
                StringBuffer parameters = new StringBuffer();
    
                Iterator<String> keys = getKeys();
    
                String key = "";
                while ( keys.hasNext() ) {
                    key = keys.next();
                    parameters.append(String.format("%s=%s", key, this.parameters.get(key)));
                    parameters.append("&");
                }
    
                String params = parameters.toString();
                if ( params.length() > 0 ) {
                    params = params.substring( 0, params.length() - 1 );
                }
    
                return params;
            }
    
            private Iterator<String> getKeys() {
                return this.parameters.keySet().iterator();
            }
    
            public HttpClient create() {
                HttpClient client = new HttpClient();
                client.setBuilder(this);
                return client;
            }
        }
    }

    10. HTTP Client를 만들어 위의 코드를 넣어줍니다. 서블릿과 연동하는 소스만 따로 빼서 만든 것입니다

    저 부분은 앞으로 건드릴 필요가 없어요.

     

    Task.java 

    public class Task extends AsyncTask<Map<String, String>, Integer, String> {
    
        public static String ip = "192.168.200.167"; // 자신의 IP주소를 쓰시면 됩니다.
    
        @Override
        protected String doInBackground(Map<String, String>... maps) { // 내가 전송하고 싶은 파라미터
    
           // Http 요청 준비 작업
    
            HttpClient.Builder http = new HttpClient.Builder
            ("POST", "http://" + ip + ":80/spring_mybatis/vision"); //포트번호,서블릿주소
    
           // Parameter 를 전송한다.
            http.addAllParameters(maps[0]);
    
            //Http 요청 전송
            HttpClient post = http.create();
            post.request();
    
            // 응답 상태코드 가져오기
            int statusCode = post.getHttpStatusCode();
    
            // 응답 본문 가져오기
            String body = post.getBody();
    
            return body;
        }
    
        @Override
        protected void onPostExecute(String s) { //서블릿으로부터 값을 받을 함수
    
            Gson gson = new Gson();
            Vision data = gson.fromJson(s, Vision.class);
    
            System.out.println("번호 : "+data.getNum());
            System.out.println("날짜 : "+data.getDay());
            System.out.println("내용 : "+data.getContent());
        }
    }

    11. 서블릿과 연결 & 통신하는 Task.java를 만들어줍니다.

    만약 연동이 성공적으로 진행되었으면 onPostExecute 메서드 안에서 값이 정상적으로 찍힐 거예요.

     

     

    Vision.java 

    public class Vision {
            private String num;
            private String day;
            private String content;
    
            public String getNum() {
                return num;
            }
    
            public void setNum(String num) {
                this.num = num;
            }
    
            public String getDay() {
                return day;
            }
    
            public void setDay(String day) {
                this.day = day;
            }
    
            public String getContent() {
                return content;
            }
    
            public void setContent(String content) {
                this.content = content;
            }
    }

    12. 서블릿에서 값을 가져올 Dto도 하나 생성해줍니다.

     

    try{
    	Task networkTask = new Task();
    
    	Map<String, String> params = new HashMap<String, String>();
    	params.put("content", result);
    
    	networkTask.execute(params);
    }catch (Exception e){
     	e.printStackTrace();
    }

    13. 그럼 이제 제대로 통신이 되는지 실험을 한번 해보겠습니다. 

    자신이 보내고 싶은 값이 있는 class에서 Task.java로 값을 보내보자. 위의 코드처럼 값을 전달해주면 됩니다..

    소스 설명을 간략히 하자면 "content"라는 키값으로 result이라는 데이터를 Task.java로 보낸다는 의미예요.

     

    14. 마지막으로 작업이 잘 되었는지 테스트를 진행해보겠습니다.

     

    연동/통신하기5

    실행을 해보면 안드로이드에서 보낸 값이 서블릿에서 잘 받아진 것을 볼 수 있고

    연동/통신하기

     

    서블릿에서 받은 값을 위의 사진에서처럼 오라클 테이블에도 잘 저장했습니다.

    연동/통신하기6

     

    테이블에서 가지고 온 값을 안드로이드에서도 이렇게 로그가 잘 찍히는 것을 볼 수 있습니다.

     

    혹시나 따라 하면서 오류가 나는 부분이 있거나 궁금한 점이 있으신 분들은 댓글을 남겨주세요. 제가 아는 부분이 있다면 최대한 알려드리도록 하겠습니다.

     

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

     

    댓글

    Designed by JB FACTORY