** Socket
1. java.net.InetAddress
2. java.net.Socket 클래스
** Android와 PC Application TCP Socket 통신
1. Server 역할을 할 PC Application
2. Android Application
** URL 통신
1. URL 클래스
2. URLConnection
** 텍스트를 읽어서 출력하기
1. 실행 가능한 Activity를 추가
2. 화면 디자인
3. Activity.java 작성
4. AndroidManifest.xml 파일에서 권한 확인
** 데이터 다운로드 받아서 출력할 때 주의 사항
** 이미지 파일을 다운로드
** 이미지 파일을 다운로드 받아서 바로 ImageView에 출력하는 것과 파일로 저장하고 출력하는 것
1. 실행 가능한 Activity 추가
2. 레이아웃 수정
3. Activity.java 파일에 작성
** Oracle & MyBatis를 이용한 Spring MVC Projec와 Android 통신
1. Oracle에 접속해서 샘플 데이터 생성
2. Spring MVC Project 생성
3. pom.xml(Maven 설정 파일) 파일에 필요한 의존성 설정
4. web.xml(웹 프로젝트 설정 파일) 파일에 인코딩 필터를 설정
5. 파일 업로드가 있는 경우 파일을 저장할 디렉토리를 생성
6. 하나의 서비스를 위한 준비
** Android에서 JSON 파싱
1. JSON(JAvascrop Object Notation)
2. 안드로이드에서의 JSON 파싱
** 서버의 데이터를 가져와서 출력하기 - Android
1. Android Application Project를 생성
2. 인터넷 사용 권한 설정
3. activity_main.xml 파일에 화면 디자인
4. MainActivity.java 파일에 작성
5. 상세보기 구현
** 로그인 & 로그아웃
1. 회원 테이블을 생성하고 샘플 데이터를 대입
2. 서버 작업
3. Android 작업
** 로그인 처리를 할 때 웹에서는 세션이나 데이터베이스를 이용해서 로그인 정보를 저장해서 로그인 여부를 판정하게 된다.
1. 메모리 상에서의 공유
2. 반영구적으로 저장하기
3. 서버에 저장하기
** Socket
- 네트워크 인터페이스 카드를 추상화한 클래스
- 통신 방식
저수준 통신 : Socket을 직접 생성해서 통신 - Socket 통신
고수준 통신 : Socket을 직접 생성하지 않고 추상화된 클래스를 이용
저수준 통신이 효율은 좋지만 어려움
1. java.net.InetAddress
- 인터넷 주소와 관련된 클래스
- 생성자는 없고 Static 메소드를 이용해서 인스턴스를 생성
getLocalHost, getByName, getAllByName을 이용해서 생성
예외 처리를 강제한다.
2. java.net.Socket 클래스
1) 생성자
Socket()
Socket(InetAddress addr, int port)
Socket(String addr, int port)
Socket(InetAddress addr, int port, InetAddress localAddr, int localPort) : 앞의 2개는 접속할 상대방의 주소 정보이고 뒤의 2개는 자신의 주소 정보 - Network Interface Card가 2개 이상인 경우
- 상대방 주소를 설정해서 생성하면 자동으로 접속 된다.
addr이 잘못되면 NullPointerException이 발생하고 port 번호가 잘못되면 illegalArgumentException이 발생한다.
2) 입출력을 위한 스트림을 제공하는 메소드
InputStream getInputStream()
OutputStream getOutputStream()
3) UDP와 TCP
- UDP : 비 연결형 통신 - 데이터를 일방적으로 보내기만 하는 방식
효율은 좋은데 신뢰성이 떨어짐 - APNS, FCM(스마트 폰의 알림 메시지)
- TCP : 연결형 통신 - 서로 연결을 하고 대화를 주고받는 방식으로 통신 효율은 UDP에 비해 떨어지지만 신뢰성이 높다.
- Java에서는 일반 소켓과 ServerSocket을 이용하면 TCP 통신이고 DatagramSocket을 이용하면 UDP 통신이다.
** Android와 PC Application TCP Socket 통신
1. Server 역할을 할 PC Application
1) Java Project 생성
2. Android Application
1) 프로젝트 생성
2) 화면 디자인
- 전송할 문자열을 입력받을 EditText 1개와 전송받은 문자열을 출력할 TextView 1개와 전송 버튼 1개를 디자인
3) Activity에 코드 작성
4) 안드로이드에서는 네트워크를 사용하기 위한 권한 설정
- INTERNET
** URL 통신
- 웹의 주소를 이용하는 통신 방식
- http나 https 프로토콜을 이용하는 통신 방식
- 스마트 폰은 보안 문제 때문에 http는 추가 설정을 해야만 통신이 가능하다.
1. URL 클래스
- 접속할 주소를 만들어주는 클래스
1) 생성자
URL(String addr) : new URL("https://www.daum.net");
URL(String protocol, String host, int port, String file) : new URL("https", "www.daum.net", 433, "/");
2) 메소드
- get으로 시작하는 메소드를 이용해서 각 부분의 정보를 리턴 받을 수 있다.
3) 주의할 점
- 잘못된 URL을 대입하면 MalformedURLException이 발생한다.
- URL은 전부 인코딩 된 상태로 작성되어야 한다.
URL에 영문이나 숫자 이외의 데이터가 있다면 인코딩을 해주어야 한다.
URLEncoder.encode(변환할 문자열, "utf-8");
2. URLConnection
- URL에 접속해서 서버에게 데이터를 전송하고 읽어올 수 있는 클래스
1) 객체 생성
(실제 사용할 클래스)URL객체.openConnetion();
- 실제 사용할 클래스는 HttpURLConnetion, HttpsURLConnection, JarURLConnetion
2) 옵션을 설정하는 메소드
- setConnectTimeout(int timeout) : 접속이 안될 때 최대 시도 시간으로 설정하지 않으면 무제한
- setUseCache(boolean newValue) : 변화가 별로 없는 경우 브라우저의 캐시 기능처럼 데이터를 로컬에 저장했다가 다시 불러오기 위한 옵션
- post방식의 파라미터나 헤더를 추가하는 메소드
setRequestProperty(String attr, String value)
addRequestProperty(String attr, String value)
- 전송방식 선택 : setRequestMethod("GET" 또는 "POST") : 기본은 GET
- 요청 결과 리턴 : int getResponseCode()
GET : 파라미터를 URL에 포함해서 전송하는 방식, 보안이 취약, 전송하는 크기에 제한이 있다.
POST : 파라미터를 header에 숨겨서 전송하는 방식, 보안이 우수, 전송하는 크기에 제한이 없다.
인코딩을 잘 설정해야 하고 속도는 GET 보다는 느림, 최근에는 FORM의 데이터는 되도록 POST로 전송하는 것을 권장한다.
password, textarea, file이 존재하는 경우는 무조건 POST
응답 코드
200번대 : 정상 응답
300번대 : 리다이렉트 중
400번대 : 클라이언트 오류(URL 에러나 권한이 없거나 하는 등의 에러)
500번대 : 서버 오류(서버의 로직이 잘못 수행되는 경우)
4) http 통신의 문제
- 보안이 취약하기 때문에 기본적으로 접속이 안되도록 되어 있다.
- 안드로이드에서는 application 설정에 android:usesClearTraffic="true"를 추가해 주어야 한다.
** 텍스트를 읽어서 출력하기
1. 실행 가능한 Activity를 추가
2. 화면 디자인
- 버튼 1개를 배치하고 HTML을 출력할 TextView를 배치하는데 html이 TextView의 크기를 넘어가면 스크롤할 수 있도록 TextView를 ScrollView안에 배치
- WebView, ListView(데이터 출력을 위한 뷰), MapView, ScrollView를 상속받아서 자체적으로 스크롤이 가능한데 그 이외의 View는 스크롤 기능이 없으므로 내용이 많은 경우에는 스크롤 뷰 안에 배치해야 한다.
3. Activity.java 작성
4. AndroidManifest.xml 파일에서 권한 확인
- INTERNET 권한이 있어야 하고 접속하는 곳이 http로 시작하는 곳이라면
** 데이터 다운로드 받아서 출력할 때 주의 사항
- 권한 설정을 하지 않으면 permit 관련된 에러 발생
- 다운로드받는 코드를 Thread에 작성하지 않으면 앱은 Crash된다.
- UI 갱신을 스레드에서 직접하면 아무 일도 발생하지 않는다.
** 이미지 파일을 다운로드
- 파일을 다운로드 받는 것은 BufferedReader 대신에 BufferedInputStream을 사용해서 읽어온 후 파일에 기록한다.
- 파일은 계속해서 다운로드 받지 않고 대부분의 경우는 처음 접속할 때만 다운로드 받아서 저장하고 이후에는 저장된 데이터가 있는지 확인해서 없으면 다운로드 하고 있으면 로컬에 있는 파일을 사용한다.
- 파일이 업데이트될 가능성이 있다면 서버를 만들 때 업데이트 날짜를 기록해야 하고, 앱은 처음 접속할 때 파일이 있는지 확인한 후 없으면 다운로드 받고 있으면 파일의 마지막 수정 날짜와 서버의 업데이트 날짜를 비교해서 서버의 업데이트 날짜가 더 크다면 다시 다운로드를 받고 그렇지 않으면 로컬에 있는 파일을 사용한다.
- 안드로이드 앱은 자신의 데이터 디렉토리에만 파일을 저장할 수 있다.
/data/data/패키지이름/files 디렉토리가 자신의 데이터를 저장할 수 있는 디렉토리이다.
맨 앞의 /data 대신에 Environment.getDataDirectory().getAbsolutePath()를 이용해서도 생성 가능하다.
** 이미지 파일을 다운로드 받아서 바로 ImageView에 출력하는 것과 파일로 저장하고 출력하는 것
1. 실행 가능한 Activity 추가
2. 레이아웃 수정
- 버튼 2개와 이미지 뷰 1개
3. Activity.java 파일에 작성
** Oracle & MyBatis를 이용한 Spring MVC Project 와 Android 통신
- 데이터 조회
1. Oracle에 접속해서 샘플 데이터 생성
- URL: 49.161.30.27
- PORT: 1521
- ID: system
- 비번: ********
2. Spring MVC Project 생성
3. pom.xml(Maven 설정 파일) 파일에 필요한 의존성 설정
1) java 와 spring 그리고 junit 버전을 변경
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
- 여기까지 저장하고 실행한다.
에러가 발생하는 경우는 대부분 포트 충돌입니다.
다른 톰캣이 실행 중은 아닌지 확인
자신의 컴퓨터에 오라클이 설치된 경우라면 servers 디렉토리의 server.xml 파일을 열어서 port 번호가 8080 인 부분을 다른 번호로 수정
port 번호가 -1 인게 있으면 8005 번으로 수정
2) Oracle을 사용하는 경우는 repositories를 설정
- repositories는 중앙저장소가 아닌 곳에서 다운로드 받을 때 설정
- Oracle은 Maven 중앙 저장소에 없습니다.
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
</repository>
</repositories>
3) 필요한 의존성을 dependencies 안에 추가
- oracle, mysql, spring-jdbc, spring-orm, mybatis, mybatis-spring, hibernate : 데이터베이스 연동 필수 라이브러리
- json 라이브러리 : json 출력
- spring-test : junit을 이용해서 spring project 테스트
- commons-fileupload : 파일 업로드
- jbcrypt : 복호화가 불가능한 암호화
- lombok
<!-- 오라클 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
</dependency>
<!-- spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 하이버네이트 사용 의존성 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- json 출력을 위한 라이브러리 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<!-- file upload API -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 복호화가 불가능한 암호화 라이브러리 -->
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<!-- 데이터베이스 로그 기록 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<!-- 스프링 테스트 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
- 실행하고 확인
4. web.xml(웹 프로젝트 설정 파일) 파일에 인코딩 필터를 설정
- 이 작업을 하지 않으면 입력할 때 한글을 입력하면 한글이 깨진다.
- 한글이 깨지면 인코딩 필터 설정과 MySQL 테이블 만들 때 인코딩 설정을 했는지 그리고 MySQL DataSource 만들 때 인코딩 설정했는지 확인
<!-- 파라미터 인코딩 필터 설정 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- web.xml 파일을 설정하고 나면 실행
5. 파일 업로드가 있는 경우 파일을 저장할 디렉토리를 생성
- webapp 기준
- img 디렉토리와 profile 디렉토리
6. 하나의 서비스를 위한 준비
- 테이블과 연동할 DTO : Item
- 테이블에 수행할 SQL을 저장하는 mapper(mybatis) : mybatis/mappers/item.xml
테이블과 매핑할 객체에 대한 설정을 하는 xml(hibernate) : dao/item.hbm.xml
- DAO : ItemDAO
- Service, ServiceImlpl : ItemService, ItemServiceImpl
- Controller(웹 브라우저 화면 출력 용도), RestController(데이터를 전송하기 위한 용도) : ItemViewController, ItemDataController
- View(웹 브라우저 화면 출력 용도)
- 모든 클래스들은 기본 패키지 안에 생성
기본 패키지 이름을 변경한 경우에는 servlet-context.xml 파일에서 component-scan에 추가를 해주어야 한다.
1) DTO 역할을 수행할 Item 클래스
- 필드의 자료형이 중요
2) Item 테이블에 수행할 SQL을 저장하는 mapper 파일을 생성
- src/main/resources 디렉토리에 mybatis 디렉토리를 생성하고 그 안에 mappers 디렉토리를 생성하고 item.xml로 생성
3) root-context.xml 파일에 데이터베이스 접속과 Mybatis 연동 객체를 생성하는 코드를 작성
4) servlet-context.xml 파일에 트랜잭션 사용을 설정
- tx 네임스페이스를 추가
5) ItemDAO 클래스를 생성하고 메소드 작성
- 어노테이션 생략하면 안되고 sql 이름을 정확하게 기재해야 한다.
6) ItemService 인터페이스를 만들고 메소드를 선언
7) ItemServiceImpl 클래스를 만들고 메소드를 구현
8) json으로 출력하는 Controller를 생성하고 메소드를 작성 - ItemDataController
** Android에서 JSON 파싱
1. JSON(JAvascript Object Notation)
- 자바스크립트의 표현식으로 데이터를 표현하는 표준 포맷
- 전에는 XML을 표준 포맷으로 많이 사용했는데 JSON이 XML보다 가볍고 프로그래밍 언어들이 이해하기가 쉬워서 최근에는 JSON을 사용하는 경우가 많다.
1) 배열
[데이터, 데이터, 데이터,...]
2) 객체
{속성이름 : 데이터. 속성이름 : 데이터...}
- 속성이름은 반드시 문자열로 작성해야 하고 데이터는 null, 숫자, boolean, 문자열 그리고 다른 객체나 배열이 가능하다.
3) 직접 서버를 구현해서 리턴하는 경우
- 되도록 객체(Map)을 만들어서 리턴
- List는 인덱스를 사용해서 데이터를 구분한다.
- Map은 이름을 이용해서 데이터를 구분한다.
- List보다는 Map이 낫다.
2. 안드로이드에서의 JSON 파싱
- Java에서는 JSON 파싱을 하려면 JSON 라이브러리를 추가해야 하지만 안드로이드에서는 그럴 필요가 없다.
- 파싱에 사용되는 클래스 : JSONArray, JSONObject
JSON 문자열의 구조를 보고 먼저 생성자를 이용해서 생성한다.
- 가져온 문자열을 보고 아래 중 1개로 생성
JSONArray 이름 = new JSONArray(JSON 문자열);
JSONObject 이름 = new JSONObject(JSON 문자열);
- 2개의 클래스에는 각각의 데이터를 가져오는 메소드가 존재하는데 매개변수가 배열은 인덱스이고 객체는 속성 이름이다.
배열.get자료형(0) : 0번째 데이터를 자료형으로 가져오는 것
객체.get자료형("속성 이름") : 속성이름에 해당하는 데이터를 자료형으로 가져온다.
String data = {“list":[{"itemid":6,"itemname":"Mandarin","price":300,"description":"Vitamin-F","pictureurl":"mandarin.jpg"},
{"itemid":5,"itemname":"Strawberry","price":2000,"description":"Vitamin-E","pictureurl":"strawberry.jpg"}]}
- item 와 itemname 만 가져와서 출력하기
JSONObject obj = new JSONObject(data); //데이터가 { 로 시작
JSONArray list = obj.getJSONArray(“list”); // list에 해당하는 데이터를 배열로 가져오기
for(int I=0; I<list.length(); I=I+1){
JSONObject item = list.getJSONObject(I);
int item = item.getInt(“itemid”);
int itemname = item.getString(“itemname”);
}
** 서버의 데이터를 가져와서 출력하기 - Android
- http://192.168.0.84:8080/list?pageno=페이지번호
{"list":[{"itemid":6,"itemname":"Mandarin","price":300,"description":"Vitamin-F","pictureurl":"mandarin.jpg"},{"itemid":5,"itemname":"Strawberry","price":2000,"description":"Vitamin-E","pictureurl":"strawberry.jpg"}]}
- http://192.168.0.84:8080/oracleserver/detail?itemid=1
{"item":{"itemid":1,"itemname":"Lemon","price":500,"description":"Vitamin-A","pictureurl":"lemon.jpg"}}
1. Android Application Project를 생성
2. 인터넷 사용 권한을 설정
- 네트워크를 사용할 때는 INTERNET 권한이 있어야 한다.
- 웹 서버에 접속할 때 http 프로토콜을 사용하는 경우에는 Application에 android:usesClearTraffic=true로 설정되어야 한다.
* 구현하려는 것 : 버튼을 누르면 첫 번째 페이지의 데이터를 가져와서 텍스트 뷰를 출력하고 다시 누르면 다음 페이지의 데이터를 추가하는 것
3. activiy_main.xml 파일에 화면 디자인
- 버튼 1개와 TextView 1개를 배치
- 출력되는 데이터가 View의 크기보다 크면 View에 내용을 전부 출력할 수 없어서 이런 경우에는 ScrollView를 사용해야 한다.
4. MainActivity.java 파일에 작성
5. 상세보기 구현
1) 실행가능한 Activity 생성 - DetatilActivity
2) activity_layout.xml 파일에 화면 디자인
- TextView 1개와 ImageView 1개를 배치
아이템 이름과 이미지를 출력
3) DetailActivity.java 파일에 코드 작성
** 로그인 & 로그아웃
1. 회원 테이블을 생성하고 샘플 데이터를 대입
2. 서버 작업
1) DTO 클래스 생성
2) Member 테이블의 SQL 작업을 위한 mapper 파일을 추가
- src/main/resources/mybatis/mappers/member.xml
3) Member 테이블에 SQL을 수행할 MemberDAO 클래스를 생성하고 메소드를 작성
4) Member 테이블 요청을 위한 메소드를 소유한 MemberService 인터페이스 생성
5) Member 클래스의 요청을 처리할 MemberServiceImpl 생성
6) Controller 클래스를 생성
3. Android 작업
1) 실행 가능한 Activity 생성 - LoginActivity
2) 레이아웃 수정
3) LoginActivity.java에 로그인 처리하는 코드 작성
** 로그인 처리를 할 때 웹에서는 세션이나 데이터베이스를 이용해서 로그인 정보를 저장해서 로그인 여부를 판정하게 된다.
- 모바일에서는 세션이 없기 때문에 다른 방법을 생각해야 한다.
1. 메모리 상에서의 공유
- public class에 static 변수를 생성해서 이용하는 방법
- singleton 패턴으로 디자인하고 인스턴스 변수를 만들어서 사용하는 방법
2. 반영구적으로 저장하기
- 파일에 저장하는 방법
- sqlite에 저장하는 방법
- 환경설정에 저장하는 방법
3. 서버에 저장하기
- 서버에 저장하게 되면 네트워크가 안될 때 서버의 데이터를 가져올 수가 없다.
'안드로이드&IOS 앱 개발자 양성' 카테고리의 다른 글
안드로이드&iOS 앱 개발자 양성(79일차) (0) | 2020.07.29 |
---|---|
안드로이드 MySQL&Hibernate 연동(76 ~ 78일차) (0) | 2020.07.23 |
안드로이드&IOS 앱 개발자 양성(74일차) (0) | 2020.07.22 |
안드로이드&IOS 앱 개발자 양성(73일차) (0) | 2020.07.20 |
안드로이드&IOS 앱 개발자 양성(72일차) (0) | 2020.07.17 |