My Trace/T아카데미

[T아카데미] 모바일 서버 프로그래밍 기본 - 1일차

Junhong Kim 2016. 6. 27. 17:55
728x90
반응형

*정적인 웹
- 미리 작성된(이미 만들어진) 웹 페이지를 보여주는 방식, 요청에 따라 페이지만 보여 준다.

 

*CGI(Common Gateway Interface) : 동적인 웹
- 클라이언트에서 요청을 받아 요청에 해당하는 프로세스(프로그램)를 실행시킨다.

 

*서블릿(Servlet)
- 서블릿은 CGI와 동일하게 동적인 웹 어플리케이션을 작성할 수 있는 기술
- CGI와 비슷하게 클라이언트의 요청을 받아 해당하는 프로그램을 실행시켜주지만 CGI와는 조금 다른 동작 형태를 보인다.

 

*AOT(Ahead-Of-Time) : 실행코드방식
- 미리 컴파일된 실행 프로그램을 사용자의 요청에 따라 실행, 컴파일이 되어있고 Running만 한다.
(예) CGI, Servelet

 

*JIT(Just-In-Time) : 스크립트코드방식
- 사용자의 요청이 있을 때 스크립트 코드를 번역해서 번역된 코드를 실행
- 스크립트 코드의 번역은 해당 페이지가 최초 요청된 맨 처음에 한번만 실행하고,
  그 이후 해당 페이지의 요청이 있는 경우 번역된 코드가 실행됨.
(예) ASP, JSP, PHP


*웹 어플리케이션과 모바일 어플리케이션
모바일 어플리케이션의 유형 및 제공하고자 하는 서비스의 특징에 따라 적절한 데이터 포멧 선택

 

Mobile Website 에는 HTML을 활용
Mobile Native App 에는 XML, JSON을 활용, 최근에는 JSON을 많이 활용한다

- Web : HTML을 보여주는 것
- App
 1) Native App
    - 앱에서 처리하기 쉬운 데이터 타입으로 응답 (XML, JSON 등)
    - HTML에 관련한 기술이 하나도 안들어 감.
 2) Web App
    - 모바일 기기내 브라우저(WebKit)가 인식할 수 있는 HTML 응답 [안드로이드 컴포넌트에서 Webview를 사용하면 됨]
    - 모든 기능을 브러우저가 다 함.
    - 앱에 안드로이드, iOS의 기술이 들어가지 않음.
    - HTML, JavaScript, CSS로만 만들어 짐.
    - 이것은 마켓에 올라가기 위해서 만들어진 것 임
 3) Hybrid App
    - Native App + Web App 을 혼용한 방식

 

 

웹 서버를 위한 이클립스 셋팅 방법

 

 
/* 프로젝트 경로 */

C:/webDev/work

 

*Encoding Setting

windows → preferences → general/workspace → Text file encoid other(UTF-8)
                              → web/HTML files → Encoding(UTF-8)
                              → web/JSP files → Encoding(UTF-8)

 

/* 프로젝트 생성 */

빈 네비게이션 탭 오른쪽 버튼 → new → project → Dynamic Web Project

 

Project name : test1
Target runtime → new runtime → Apache Tomcat v8.0

 

tomcat 설치 경로 → browser → C:/program files/tomcat8.0 (폴더자체) 로 연결 → next → next

 

context root : 그대로
content directory : 그대로

 

*프로젝트 생성한 결과

java resources 에는 실제 .java 이 들어가고

java를 컴파일하면 build 밑에 들어감

webContent 에는 순수 html이 들어감

 

/* Test */

webContent 오른쪽 버튼 → html 파일 → a.html

<body> 태그에 글쓰고 → 오른쪽 버튼 run as → run on server → tomcat 8.0 → next → finish → 웹서버가 열림

 

톰캣은 순수자바로 이루어져 있어서 대/소문자 구별을 함.
localhost/test1/a.thml 잘 켜지면 서버가 잘 돌아간다는 것임.

실행하고나면 네비게이션 탭에 Servers 폴더가 생김

 

/* 우리는 배포판과 테스트판을 구별하기 위해서 셋팅을 바꿔줘야 한다. */

자바파일은 Java Resources/src 오른쪽 버튼 눌러서 new → package 하고
name은 com.tacademy.controller 라고 입력 (도메인네임 or 앱의 네임) → finish
배포에 필요한 .java를 만들것임. 여기에 넣는거임.

실제로 배포로사용하는 것과 배포안 되는 것을 구분함

 

java Resource 오른쪽 버튼 → 소스폴더 (순수 자바 테스트 할 때 필요한 것.)

project name :  browser → test1 프로젝트 클릭
folder name : test → finish

 

생선 된 test 폴더 오른쪽 눌러서
com.tacademy.test package를 다시 만든다.

 

/* 배포하기 위해 build path 재 설정 */

WebContent/WEB-INF 오른쪽 버튼 눌러서 폴더를 새로 생성 folder name 은 classes 라고하고 폴더를 생성한다.

개발자는 대세를 따르는 것이 좋음.
컴파일 되면 여기에 저장


project명(test1) 에서 오른쪽버튼 누르면 build path → configure build path

가장 왼쪽 탭을 보면 source라는 것이 보임 아래에 보면 build path를 browser 누름.


webContent/WEB-INF/classes 를 눌러서 확인하여 빌드 패스를 바꿔준다. → classes는 네비게이션 탭에서 사라짐.

 

/* 웹 전체를 관리해주는 설정 파일 (안드로이드에서 manifest 역할과 동일) */

AndroidManifest.xml = web.xml

 

탐색기 열어서 tomcat 설치된 곳 (C:/programfiles/apache softeware~/tomcat 8.0 → webapps)에 들어가면 몇개가 생성 되어있다. 

ROOT 라는 것이 있는데 여기를 들어가면 WEB-INF 열면 web.xml이 있음, 복사해서 이클립스 WebContent / Web-INF에 붙여넣기

 

web.xml해서 열어보면 source로 봐보자 여기에 주석되어있는것은 apache tomcat 라인선스 동의 임. 안쓰면 위반 됨.

그리고 포맷형식때문에 한글을 쓰면 안됨. 이파일을 수정하면 무조건 기존 서버를 껏다가 다시켜야 함.

 

 

 

● GET 방식과 POST 방식

 

GET

- 서버로 전달하고자 하는 파라미터를 URL 뒤에 붙여 전송하는 방식

- 전달할 수 있는 데이터 길이에 제한이 있음

 

POST

- 전달하고자 하는 정보가 HTTP body에 포함되어 전송되는 방식

- 파라미터가 직접 노출되지 않고 길이 제한이 없음

 

GET 방식은 ?name=value&name=value → 주소에 첨부 되서 간다

POST 방식은 받기만 하면 됨 → 눈에 안보이는 아웃 스트림

 

 

 ※ GET 방식과 POST 방식의 차이

- GET 방식은 주소 창에 파라미터가 그대로 노출되지만, POST 방식은 노출되지 않는다

- GET 방식은 전달하는 파라미터의 크기에 제한이 있는 반면에 POST 방식은 제한이 거의없다.

- GET 방식은 1KB 이상의 데이터(즉, 큰 데이터)를 보낼 수 없어서, 신뢰성이 약하다. (라우터마다 보낼 수있는 크기는 다르다)

- GET 방식은 짧은 데이터에 적합, POST 방식은 큰 데이터를 보낼때 적합

- GET vs POST 누가 더 좋고 안좋고가 없다. → 빠름/늦음 차이 → 옳고 그름이 아니라 다름이다

- 정보 달라고 하는건 GET 방식, 삭제할 때도 GET 방식을 권장

 

 

<form> 태그가 아닌 <a>, <radio>, <checkbox> 등의 태그로도 데이터 보낼 수 있음

<a>는 무조건 get 방식 밖에없다.

 

null 방식이 넘어가지 않게 if문으로 잘 처리하자. 식별은 key 로, 실제 넘어가는 건 value

 

/* 파라미터가 1개일 때 */

String size = request.getParameter("size");

 

/* 파라미터가 여러개일 때 */

String[] langs = request.getParameterValues("lang");

 

 

● XML과 JSON

더 짧게 데이터를 보내기 위해사용하는것이 JSON

XML과 JSON의 내부적인 data는 같지만 용량이 JSON이 더 작다. 그래서 최근에는 JSON을 많이 쓴다.
(HTMl > XML > JSON) making :  / parsing :

 

Google JSON(GSON) 을 쓰면 쉽게 JSON 형태로 만들 수 있다.

 

GSON은 데이터를 JSON 형식으로 바꿔주기 위한 좋은 라이브러리이다.

모바일 데이터를 위해서 JSON형식으로 나오기만 하면 되므로 toString()를 재정의해서 사용해도 무방하다.

하지만, GSON을 이용하면 매우 편리하기 때문에 GSON을 사용을 권장한다.

 

[ProductTest.java]

 

 public class ProductTest {

 public ProductTest() {
  Product product = new Product("노트북2016", 2000, "T");
//  product.setName("노트북2016");
//  product.setPrice(2000);
//  product.setType("T");
  
//  System.out.println(product);
  Gson gson = new Gson();
  
  ArrayList<Product> list = new ArrayList();
  
  list.add(new Product("노트북1", 2000, "TA1"));
  list.add(new Product("노트북2", 2000, "TB1"));
  list.add(new Product("노트북3", 2000, "TC1"));
  list.add(new Product("노트북4", 2000, "TD1"));
  list.add(new Product("노트북5", 2000, "TE1"));
  list.add(new Product("노트북6", 2000, "TF1"));
  list.add(new Product("노트북7", 2000, "TG1"));
  
  ProductListResult listResult = new ProductListResult(); // 객체로 변환하기 위해, json은 객체로 받음
  listResult.setList(list);
  listResult.setSize(list.size());
  listResult.setStatus("success");
  
  String result = gson.toJson(listResult);
  System.out.println(result);
  
//  String result = gson.toJson(list);
//  System.out.println(result);
//  String result = gson.toJson(product); // 자바 -> json
//  System.out.println(result);
//  
//  Product product1 = gson.fromJson(result, Product.class); // json -> 자바
//  
//  System.out.println(product1);
 }

 public static void main(String[] args) {
  new ProductTest();
 }
}

 

 

[ProductListResult.java]

 

public class ProductListResult {
 
 private String status;
 private int size;
 private ArrayList<Product> list;
 
 public ArrayList<Product> getList() {
  return list;
 }
 
 public void setList(ArrayList<Product> list) {
  this.list = list;
 }
 public int getSize() {
  return size;
 }
 public void setSize(int size) {
  this.size = size;
 }
 public String getStatus() {
  return status;
 }
 public void setStatus(String status) {
  this.status = status;
 }

 @Override
 public String toString() {
  return "ProductListResult [list=" + list + ", size=" + size + ", status=" + status + "]";
 }
}

 

 

● 서블릿(Servlet)

JSP는 Servlet이다. (99.9% 맞는 말) Servlet이 JSP보다 먼저 나옴.

서블릿이란 "server" + "applet"의 합성어. 말 그대로 서버에서 실행되는 프로그램을 의미.

클라이언트의 요청에 따라 서버에서는 서블릿을 실행하고 그 결과를 클라이언트에게 전송하는 방식으로 동작.

 

URL 주소 치고 들어오면 무조건 get 방식이다 → post 방식으로도 쉽게 테스트 해보기 위해서 Postman을 사용

 

※ 서블릿은 응용프로그램이므로 WebContent/WEB-INF/web.xml에 추가해줘야 한다.

 

[web.xml]

 

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" metadata-complete="true" version="3.1">
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  <servlet>
   <servlet-name>hello</servlet-name>
   <servlet-class>com.tacademy.controller.HelloServelet</servlet-class>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>/hello</url-pattern>
  </servlet-mapping>

</web-app>

 

 

[HelloServlet.java]

 

@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //response.setContentType("application/json;charset=utf-8"); // 한글께짐 해결
  response.setContentType("text/html;charset=utf-8"); // 한글께짐 해결
  PrintWriter out = response.getWriter();
  out.println("doGet 메소드 call"); // 클라이언트로 출력
  System.out.println("doGet call"); // 서버로 출력
 }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html;charset=utf-8");
  PrintWriter out = response.getWriter();
  out.println("doPost 메소드 call<br>"); // 클라이언트로 출력
  System.out.println("doPost call"); // 서버로 출력
  
  String name = request.getParameter("name");
  out.println(String.format("name %s", name));
 }
}

 

 

※ 한글께짐 해결 방법: response.setContentType("text/html;charset=utf-8");

 

*서블릿의 라이프 사이클(Life-cycle)

- 서블릿 클래스는 클라이언트에 의해 바로 호출되는 것이 아니라, 일단 서블릿 클래스로부터 서블릿 객체가 만들어지고(create),

  그 객체가 웹 컨테이너에 의해 초기화(initialize) 된 다음 호출된다.

 

init → service → doGet → destory

[init는 최초 한번만 호출 됨]

 

첫번째 - [서블릿 생성] → [init] → [service] → get / post 방식에 따라서 [doGet / doPost] 호출 됨

두번째 - [service] → get / post 방식에 따라서 [doGet / doPost] 호출 됨

 

이제 더이상 사용되지 않을때 ... - [destory] 호출 → 소멸

 

서블릿은 한개만 생성된다. 동시접속이 발생하면 서비스가 쓰레드로 여러개 생성됨

 

※ Eclipse Shortcut key

- ctrl + shift + o : 자동 임포트

- alt + shift + s : getter/setter, constructor

- syso + ctrl + spacebar : 자동 완성

- ctrl + mouse-right : 링크

 

※ Error

1) 404

 - 페이지 없음 / 찾을 수 없음

 

2) nullPointException

 - null이 넘어 갔을 때 나는 오류, 이부분을 예외 처리해야 하는데 try..catch 하지말고 if로 하는게 성능상 더 좋다.

 

if (langs != null) {

...

}

else {

...

}

 

※ Link
[Tomcat]
http://tomcat.apache.org


[Eclipse]
www.eclipse.org

 

[JSON]

http://json.org/


[GSON]

https://code.google.com/p/google-gson/

https://github.com/google/gson

 

[Postman]

http://www.getpostman.com/

728x90
반응형