본문 바로가기
java

[Java] 서버 프로그래밍 - 특강으로 맛보기, 배운것과 앞으로 배워야할 것 #1

by jinbro 2017. 9. 14.

[나의 이야기부터]

(1) 참여 계기 : express보다 역할이 세세하게 쪼개져있고 개념, 구조만 익히기위해서 참여하게됨

(2) 다 끝나고 난 뒤 : 개념, 구조 뿐만 아니라 팁, 더 넓은 범위의 개념, 추상적이던 것을 구체적으로 배우게 된 시간

(3) 포스팅 구성

  • 3일 차 내용을 3번에 걸쳐 포스팅 할 예정, 그리고 개념, 구조 내용을 정리한 포스팅도 할 예정 : 하루 8시간 3일 동안 배우고 만들고 했음!

  • 서버 개념, 자바 프로그램 실행 기초, 프로토콜, 톰캣, 서블릿, jsp, 모델1, 모델2, 모델2 프론트 컨트롤러 패턴, 객체지향 개발 등 

  • 객체지향 : 자바 기본 공부하다가 객체지향 패러다임을 확실하게 알고싶어 객체지향의 사실과 오해라는 책을 읽고 있는 와중에 특강에서 듣게되면서 더욱 이해하게됨

  •  앞으로 따로 포스팅 할 예정



[강의 내용]

(1) 웹서버와 WAS 차이 : 정적, 동적 차이

(2) 마이크로 서비스와 헤비 서비스 차이

  • 마이크로 서비스는 유저 요청에 따라 db 액세스함
  • 헤비는 WAS 디비에 액세스하고 유저는 웹서버에 요청을 날리고 .html 응답받음 - 유저 요청이 WAS까지 닿는다면 서버 과부하

(3) 프로그램 실행방식

  • AOT 방식 : 컴파일 시간때문에 초기 느리고 다음부턴 일정함 - 컴파일러, 서블릿 - 자바 class - 자바 컴파일 방식의 언어
    => 최초 접근 시 서블릿 인스턴스 생성, 이후부터 service() 호출 < doGet(), doPost() 등 분기호출 
  • JIT 방식 : 브라우저 html 번역, jsp - html에서 자바 코드 작성

 

(4) HTTP 통신 : 헤더까지 포함되어서 128kb정도까지(TCP / IP > HTTP), 무거움 그래서 보통 IOT에서 소켓통신을

  • HTML / json : PC
  • XML / json : 모바일, IOT (쓸데없는 HTML 태그가 들어가있어서 필요없는 태그 제거, 태그를 아예 제거하는 방식을 사용 - 0,1 줄이기)
  • 프로토콜에 따라 장단점이 있으니 참고 : 리턴해주는 데이터 타입에 따라 서버 다름


(5) 반응형 웹과 웹앱은 다름

  • 웹앱 : 모바일 스토어에서 다운로드 -> 겉은 내부는 (, 컨트롤러 모두) : 웹뷰
  • 하이브리드 : 뷰는 html(+css, js), 컨트롤러는 모바일 네이티브, 웹앱에서 없는 기능이 있어서(전화 퍼미션이 필요한 기능)

 

(6) 강의 타겟(서버) 네이티브 앱이기때문에 XML / json으로 데이터를 뿌려줌 : WAS 프로그래밍

  • Nodejs 환경에서는 express
  • Java Tomcat - 서블릿

 

 

[tomcat]
(1) 아파치 톰캣 : 웹서버 + 웹컨테이너

  • 톰캣 5.5 버젼부터 httpd native 사용 : 자체적으로 웹서버 기능을 포함(8080 포트)
  • 성능상 아파치 네이티브와 큰 차이나지 않는다고 함
  • 웹컨테이너 : 서블릿 컨테이너 - 웹서버 응용프로그램 위에서 서블릿 응용프로그램(자바 코드로 짜여진)을 돌리는 것

 

(2) bash 환경에서 명령어를 가지고 서버 실행을 시킴 : IDE에서는 IDE로

  • 톰캣 설치 가이드 :  http://nahosung.tistory.com/55
  • sudo /Library/Tomcat/bin/startup.sh // sudo /Library/Tomcat/bin/shutdown.sh : 톰캣서버 시작, 중지 bash명령어 실행됨
  • 물론 서버 설치 특정 디렉토리로 옮기고 링크걸어줘야함 : 그래야 bash에서 다룰 있음
  • 초기에는 8080 포트로 설정되어있음 : 톰캣디렉토리/conf/server.xml 8080 찾기 80으로 변경하기
  • ip 접속하는 습관 : localhost, 127.0.0.1 말고(192.168.0.6/ 현재 인터넷 접속 후 할당받은 ip -> 톰캣 웹서버)
  • 자바 jdk 버젼, 톰캣 버젼, 안드로이드 버젼을 같이가는게 좋음

 

  • (3) web.xml

  • 서버 설정 파일
  • 안드로이드의 manifest.xml과 같은 역할
  • 서블릿 등록 : 톰캣에서 관리, url 맵핑 등 역할

 

 

[자바 플랫폼]

(1) Java SE : jvm + API + 개발도구 - jdk가 구현체

(2) Java EE : SE + 서버 관련 API 추가

(3) Java ME

 

 

[이클립스 + 톰캣 연동]

(1) webDev 새로운 디렉토리 만들어서 사용하기 : 워크스페이스, 프로젝트 효율적인 관리를 위해

(2) 환경설정 > General탭 > Charset 변경(UTF-8), Web 탭 > HTML5, CSS, JSP Charset 변경(UTF-8)

(3) Dynamic Web 선택(static은 WAS가 없음) > 이름 설정 > 런타임 설정(설치한 톰캣 버젼)
(4) WEB-INF > classes 디렉토리 생성 > 프로젝트 디렉토리 오른쪽 클릭 > 빌드 패스 설정

  • src에 있는 .java 파일이 빌드되어서 이동되는 디렉토리 설정

 

(5) WEB-INF로 이동 : web.xml 파일(톰캣 설치할 때 딸려오는 샘플 디렉토리에 있음)

  • 안드로이드 Manifest 동일한 역할

 

(6) src 폴더 하위에 패키지 생성

  • 리얼 소스, 테스트 소스 패키지
  • src는 배포용이고, test 폴더를 하나 생성함(Java Resources 하위에) : src와 동일하게 패키지 생성

 

(7) run as > run on server

(8) 빌드 후 Servers 디렉토리 생성

(9) 포트번호 변경 : server.xml > port 변경 : 80 포트를 사용하고 있지않아야함

 

 

[jsp]

(1) java server page
(2) *.jsp : html 태그가 들어있는 jsp 파일에서 java 처리를 할 수 있음

  • 자바 코드 처리 방식 : <% %>와 <%= %>가 있음
  • <% %> : 자바 로직 처리
  • <%= %> : 자바 로직에서 메모리 공간 할당해서 데이터 저장한 변수 불러올 때
  • request : 요청 객체, response : 응답 객체
  • 쿼리스트링, params 구분 안하고 params로만 : null 처리할 것(null과 빈문자열은 달라요 : 참조 String 객체가 있지만 값이 없는 것)

 

(3) 액션만 처리할 것이라면 JSP를 사용하는 것은 낭비 : 서블릿으로 처리

(4) jsp는 서블릿으로 변환 : 서블릿이 먼저 나오고, jsp가 나옴(같은겁니다)

(5) 웹서버가 아닌 일반 어플리케이션 서버라면 jsp를 사용x

 

 

[servlet]

(1) jsp와는 달리 백그라운드 처리가 필요한 경우 서블릿에서 처리 : jsp는 뷰에서 처리함, html 태그 생성하는 짓 따위는 하지맙시다

=> 처리 후에 리다이렉트 시키는 방법만 알면됨 : 자바 코드로서 이해하기

=> 그리고 데이터 리턴할 때 json 포맷(서버니깐)

 

(2) 자바 WAS : server + applet(애플릿은 클라이언트)

(3) 클라이언트 요청에 따라 서버에서 서블릿을 실행하고 결과를 클라이언트에 응답해줌

(4) 동시 접속(멀티유저) 처리 할 때 효율적인 처리

- CGI의 경우 멀티프로세스(동시접속, 멀티쓰레드 아닙니다)

- 자바는 멀티쓰레드(jvm + .exe: 1개일 때 더 많은 메모리 차지, cpu 부하) : 서버는 하나(.exe -> 프로세스)만 돌아가지만 쓰레드로 관리

=> 서블릿은 톰캣 위에서 돌아가는 자바 응용프로그램(WAS) : 그래서 jvm + exe 프로세스가 메모리를 차지함

 

(5) 서블릿 인터페이스(Servlet) > 서블릿 추상클래스(GenericServlet) > 서블릿 추상클래스(HttpServlet) 제공

- 객체 타입 구현체를 제공함

 

(6) 자바 소스 디렉토리에 서블릿 파일 생성 : .java (Servlet 템플릿 제공 : 응용프로그램이기때문에 제공을 함)

(7) web.xml 파일에서 등록해줘야함

- 매니페스트 파일에서 액티비티 등록하듯이 등록해줘야함 : servlet-name은 같아야함

- 라우팅까지

(web.xml 코드)

<servlet>

<servlet-name>hello</servlet-name>

<servlet-class>com.jinbro.sample.controller.HelloServlet</servlet-class>

</servlet>

  

<servlet-mapping>

<servlet-name>hello</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping>

 

(8) 서블릿 파일에서 맞게 작업하기

  • request, response 객체 활용
    => 로직 작성 : request, response 객체, 쿼리스트링, 파라미터 똑같은 메서드로 처리(getParameter), 헤더 처리는 별도(getHeader)
    => api key값을 헤더로 보내도됨  : csrf 처리하거나 헤더로 뭐 보내달라고 요청을 할 때 이렇게


 

=> request 객체 중에 요청 유저의 주소값을 받을 수도 있음 : 정보 기록해둬야함



(9)
서블릿 라이프 사이클(스프링 공부할 때 스프링은 어떻게 처리할 수 있는지 보기 : 라이프 사이클과 객체 생성)

  • 톰캣이 서블릿 인스턴스 생성 : 직접 인스턴스 생성할 수 없음(서블릿 파일 생성할 때 생성자 노필요)
  • 각 라이프사이클에 맞는 메서드가 있음 : 메서드에서 로직 작성할 수 있음
  • 서블릿 라이프사이클 찾아보기 : 필드 함부로 사용하면 안됨(서블릿 프로세스 1개당 1개만 사용 - 전체 유저가 공유하는 필드가 되어버림)
  • 서블릿 init은 한번만 호출함 : 최초 유저만 init()을 경험하십니다, 두번째부터는 다음 라이프사이클 service를 통해서
    =>  AOT : 클래스 로딩되고 init 호출된 뒤 그다음부터는 일정한 속도 유지(책의 그래프)
    => 최초는 init() -> service() 호출, 그다음부터 service()만 호출
  • 서블릿 WAS에 접속하면 : (최초 진입말고) service()가 호출됨(요청 - 응답)
  • 동시접속 : 서블릿 객체는 1개, 서비스 여러번 호출 - service가 구현되어져있는 클래스 살펴보기(request 메소드에 따라 doGet 등으로)

 

 

[mysql 서버]
(1) db서버로 사용할 mysql 서버 설치 : 맥의 경우 brew로 설치

  • rhel의 경우 mysql 설치 경로를 지정해줘야함
  • 맥에서 mysql 설치 : https://goo.gl/1PwzUd (brew)

 

(2) 이전에 설치했는데 다시 깔아야하는 경우

  • 프로세스 kill : ps -efc | grep mysql  -> kill -9 <PID> (-9 : 강제종료) -> brew remove mysql -> brew cleanup
  • 나머지 작업 : https://goo.gl/YSEbsV

 

 

[JUnit : 단위테스트]

(1) 단위테스트에 사용되는 라이브러리
(2) 사용하기

  • 프로젝트 라이브러리 추가 : add Library > JUnit 선택
  • 테스트 클래스 추가 : 일반클래스 - 테스트 메서드 추가
  • 메서드 위에 어노테이션 추가(@test - import 해야함) : 해당 메서드만 테스트

 

(3) 주의할 것

  • public으로 선언되어져있어야함

 

 

[웹기본]

(1) 파일 형식은 post, get은 쿼리스트링 형태만 가능(문자 전송만)

(2) 최근에는 xml 보다 json을 데이터 교환 타입으로 : http://www.json.org/json-ko.html

  • 대부분의 언어가 사용하는 규칙을 사용 : 언어와 상관없이 호환되는 데이터 타입
  • xml은 depth가 깊어지면 파싱하기가…..
  • Json : 자바스크립트의 object 형의 사용 형태를 사용( { key : "value" } )
  • 키값으로 값을 얻을 수 있음(응답받은 JSON을 변환해서 사용)
  • 배열 지원까지

 

(3) 서블릿 동작 과정 : http://anster.tistory.com/128

(4) 문자 인코딩 방식에 따라 깨질 수 있으니 request, response 객체에서 인코딩하도록

 

 

[사용한 라이브러리]

- http://mvnrepository.com/ (라이브러리 써치)

- jar를 직접 설치해서 import 시키거나 maven으로 설치해서 버젼관리하거나 gradle(intellij)을 사용하거나 모두 위의 사이트에 있음

- jar 직접 설치한 경우 : WEB-INF > lib에 넣기(웹컨테이너 디렉토리 구조 꼭 알기)

 

(1) gson : 자바에서 json 사용하기(모바일 서버니깐 데이터를 xml or json으로)

  • 자바로 표현된 데이터를 json으로 변경시켜야함, 포스트맨을 통해서 제대로된 결과가 나오는지 보기

  • json build 하기 : gson(https://github.com/google/gson)
  • 사용코드는 예제 보기 : Gson 객체 생성한 뒤 객체 메서드 사용하기(toJson의 매개변수로 Object형을…)
  • JSON을 파싱해서 문자열로 만들 수 있음 : 특정키로 특정값을 받아올 수도 있음
  • 서버 개발자는 여러 클라이언트 기기를 담당하므로 결과값을 잘 체크해야하고 { ... } (중괄호로 리턴되도록 하는게 좋음)
    => 네임 스페이스를 만드는 작업임 : 원래 결과가 [] 대괄호로 나올 때 네임스페이스로 감싸서 파싱하기 편하도록
    => gson은 들어가는 필드 순서가 곧 json key 순서
    => 뽑아져서 나온 데이터 : {"pList":[{"name":"jinbro","addr":"busan","age":26,"sex":true},{"name":"jimin","addr":"gyeongju","age":22,"sex":false}],"status":"success","count":2}

 

 

[명칭관련]

(1) 값 관리 관련 패키지 : vo(value object, com.jinbro.sample.vo), model, data

(2) 로직 패키지 : controller(com.jinbro.sample.controller)

 

 

[알아볼 것]

- 톰캣 디렉토리 파악하기 : jsp, servlet 위치 파악하기까지

- 톰캣(웹컨테이너 - 서버) 처리 과정 살펴보기

- jsp 처리 원리 알아보기 : response, request 객체를 어떻게 사용할 수 있는지

1) .jsp를 .java 파일로 변환 -> .class (컴파일러) -> jvm 실행(바이트코드 -> 바이너리 코드로 변환)

2) request, response 모두 servlet 객체 타입의 메서드

 

- 서블릿 개념 더 알아보기 : 톰캣 위에서 돌아가는 자바 응용프로그램

- 서블릿 동작 과정, 디렉토리 지정(톰캣)

- 서블릿 라이프사이클 찾아보기 : 필드 함부로 사용하면 안됨(서블릿 프로세스 1개당 1개만 사용 - 전체 유저가 공유하는 필드가 되어버림)

=> 톰캣 - 서블릿 동작과정 : 서블릿 객체 생성 -> service() 실행 (객체인지 아닌지)

=> service() super 객체 타입에 구현된 것 보기

 

- maven 개념, 사용하기

- 단축키좀 알아야하겠음 : getter, setter, 생성자 생성 등등

 

 

[사용한 API]

[멜론 API]

(1) 헤더 변경을 안해주면 xml 응답옴

 

 

[API 서버 테스트]

(1) postman(크롬 웹앱) : GET/POST  요청 수월함

  • 헤더 수정까지 가능 - 키값까지 던질 수 있음

  • params 설정까지 가능



댓글