* 구조 : 서블릿 - 서블릿 컨테이너 - 웹서버

 

1. Servlet

웹에서 자바 프로그래밍 구현을 위해 탄생함

자바 프로그램이 서버 역할을 잘 할 수 있도록 확장해주는 것

보안성이 있고, 이식이 가능함. 사용이 쉬워서 CGI로 대체 가능

클라이언트(웹서버)의 요청에 따라 동적으로 모듈을 처리하고 그 결과를 다시 클라이언트에게 전송하는 서블릿 클래스

HTTP 프로토콜 서비스를 지원하는 Javax.http:.HttpServlet 클래스를 상속한다 (Servlet은 Container에 의해 실행되고 관리된다)

JVM에서 작동함. 서버 측 프로그램이라 브라우저를 가리지 않는다

HTML 변경시 Servlet을 재컴파일 해야 한다

 

ㄱ. 역할 : request header와 user가 보낸 데이터를 받음 > 결과 생성 > response header와 생성된 결과를 보여줌

 

ㄴ. 구성 : javax.Servlet = 보편적인 서블릿 인터페이스

javax.Servlet.http = HTTP용 서블릿 인터페이스

 

ㄷ. 자바 서블릿의 생명 주기 : public void init = 서블릿이 처음 적재될 때 호출되는 초기화 함수

   public void service = 클라이언트의 요청이 들어올 때마다 호출(doGet / doPost 호출)

   public void destroy = 서블릿이 메모리에서 해제될 때 호출되는 종료 함수

 

 

2. Servlet Container (서블릿 관리)

서블릿 생명 주기를 관리하고 요청에 따른 스레드를 생성한다

HTTP를 요청 받아서 Servlet 을 실행시키고 결과를 사용자 브라우저에게 전달해주는 기능을 가진 컴포넌트

서블릿과 웹 서버(Apache)가 서버로 통신하는 방법을 제공

멀티스레딩을 지원하여 클라이언트가 다중 요청을 알아서 처리한다

 

ㄱ. 역할 : 통신 지원

생명 주기 관리

멀티스레딩 관리

선언적 보안 관리

jsp 지원

 

ㄴ. 대표적인 컨테이너 : Tomcat, jetty, jboss etc

 

 

 

* Web Server : 웹서버로 들어온 클라이언트의 요청을 받아 컨테이너로 전송하고 웹 컨테이너의 결과값을 받아

클라이언트로 전송한다.

클라이언트가 get, post 등의 메소드를 이용하여 요청하면, 프로그램이 어떤 결과를 돌려준다.

정적인 data를 처리하는 서버.

단순 이미지나 html과 같은 리소스를 제공하는 서버 전달시 WAS보다 빠르다.

사용자의 요청을 효율적으로 처리 가능

(ex. apache)

 

 

* Web Application Server(=WAS) : 웹서버 + 웹컨테이너

다양한 기능을 컨테이너에 구현하고 다양한 역할을 수행하는 서버

넘겨받은 요청을 내부적인 연산으로 처리한 후 출력할 내용을 웹서버로 전달하여 웹서버가 다시 클라이언트로 전송한다.

동적인 data를 처리하는 서버.

DB와 연결되어 데이터를 주고받거나 프로그램으로 데이터의 조작이 필요한 경우 활용한다.(java, jsp, css 등)

(ex. apache tomcat)

 

 

* 보통 대용량의 DB가 오고 가는 곳에서는 web server와 was를 동시에 사용하는데, 그 이유는 정적인 데이터 / 동적인 데이터를 나누어서 처리할 수 있기 때문에 효율성을 극대화할 수 있어서이다(속도).

기본적인 기능은 같다.

 

1. window.location

read / write 속성 둘 다 가짐.

창의 위치로 이동(새로운 페이지로 이동).

웹 표준이기 때문에 되도록이면 이것을 쓰는게 좋다.

 

 

2. document.location

read 속성만 가짐.

페이지의 위치로 이동.

 

 

3. 속성

location.href='주소'; 

주소로 이동 

location.replace('주소');

주소로 이동

location.reload();

새로고침

 

Java version과 eclipse project version이 맞지 않으면 프로젝트 실행시 컴파일 에러가 발생하곤 하는데,

소스가 잘못된 것이 아니기 때문에 자칫하면 이유를 모르고 몇 날 몇 일을 샐 수도 있다.

 

외부의 프로젝트를 import 했거나 새 프로젝트를 만들었을 시에는 작업 하기 전 무조건 버젼부터 맞추고 시작하는 편이 낫다.

 

 

1. cmd로 java와 javac version 확인

 

 

java와 javac 모두 1.8.0_71 이다. 그러므로 이클립스 상에서도 프로젝트 버젼이 1.8 이어야 한다.

 

* cd.. : 상위 폴더로 이동

  java -version : java (jdk) version 확인

  javac -version : javac (jre) version 확인

 

 

2. Properties > Project Facets

 

 

 

Project Facets에 들어가면 Java 등의 버젼을 맞출 수 있다. (일반적인 경우)

 

 

 

그러나, 위와 같이 설정이 되지 않는 경우도 있다.

아래 창에 Cannot~라고 뜨면 다른 방법으로 설정해야 한다.

 

 

3. Navigator > .settings > org.eclipse.~.facet.core.xml

 

 

Project Explorer가 아닌 Navigator로 들어가서,

프로젝트를 열고 폴더 중 .settings를 열면 여러 파일 중에 ofg.eclipse.wst.common.project.facet.core.xml 파일을 연다.

 

<installed facet="java" version="1.8"/> : java version

<installed facet="jst.web" version="3.0/> : Dynamic Web Module version

 

수동으로 직접 수정해준다.

 

 

4. Build Path > Configure Build Path > JRE System version 수정

 

 

 

 

버젼 수정을 수동으로 해주면 프로젝트에서 원인 모를 오류가 발생할 것이다.(아마도)

왜냐하면, 이미 Build Path를 한 JRE의 라이브러리 버젼이 수정되지 않았기 때문이다.

 

 

5. Edit > JRE version 수정

 

 

Execution environment 버튼을 누르고 1번에서 cmd 창으로 확인했던 javac version(jre) 과 동일한 버젼을 클릭하고 Finish를 누른다.

 

버젼을 동일하게 맞췄으면, eclipse를 종료시키고 다시 켠다.

프로젝트 이름을 변경할 때, 단순히 보이는 곳만 변경한다고 해서 변경이 된 것이 아니다.

이제부터 프로젝트 이름을 모두 변경하려 한다.

 

 

1. Project Explorer > Refactor > Rename

 

 

 

가장 기본적인 프로젝트명 변경 방법이지만 이 방법 하나로 프로젝트명이 완전히 수정되는 것은 아니다.

 

 

2. Project Explorer > Refactor > Rename Maven Artifact (필자는 현재 Maven 프로젝트임)

 

 

 

 

3. (Window > Show View > Navigator)

pom.xml > Overview > Project > name

 

 

 

 

4. (Window > Show View > Navigator)

pom.xml > Effective POM > (연보라색 칠해진 부분)

 

 

 

5. (Window > Show View > Navigator)

pom.xml > pom.xml > (연보라색 칠해진 부분)

 

 

* Navigator : 탐색기

 

이 다섯 군데를 모두 수정해야 비로소 프로젝트 이름 변경이 끝난다.

* request 기본 객체 : 웹브라우저에 웹 사이트 주소를 입력하면 웹 브라우저는 해당 웹 서버에 연결한 후, 웹 서버에

 요청 정보를 전송한다. 클라이언트가 전송한 요청 정보를 제공하는게 바로 request.getParameter() 기본 객체이다.

 

* parameter : 페이지와 페이지 간의 정보 중 다음 페이지를 읽어들일 때 필요한 정보를 넘겨주고 받는 것을 의미

 다음 페이지에서 그대로 읽어들이기 위해서도 사용하지만 DB정보 요청, 중요 로직값을 사용하는 인자 값으로도 사용된다.

 

request 객체는 웹 브라우저에서 jsp 페이지로 전달되는 정보의 모임으로 http 헤더와 http 바디로 구성된다.

웹 컨테이너는 요청된 http 메세지를 통해 HttpServletRequest 객체를 얻어내서 이로부터 사용자의 요구 사항을 얻어낸다.

 

 

1. request.getParameter() :  String 형만 주고 받을 수 있다.

request.setParameter()로 지정하고 request.getParameter()로 받아온다.

 

 

2. request.getAttribute() : String 형 이외에 int나 List 형의 값을 받을 수 있다.

기본 타입은 Object이기 때문에 반드시 형 변환이 필요하다.

request.setAttribute()로 지정하고 request.getAttribute()로 받아온다.

 

request.setAttribute("currentPage", pages); => page를 currentPage라는 이름으로 지정

request.getAttribute("currentPage"); => 이름으로 지정했던 currentPage를 가져옴

 

 

3. get 방식 vs post 방식

ㄱ. get : (ex. http://localhost:8080/insert.jsp?name=joon&address=suwon

  url 뒤에 파라미터 값을 적어주는 방식. 데이터가 외부에 노출되어 보안에 취약함

  지정된 리소스에서 데이터를 요청하여 읽을 때 사용하는 리소스

  클라이언트로부터 데이터를 이름 + 값이 결합된 String 형태로 전달받는다.

  전송할 수 있는 데이터 양은 255가지

 

ㄴ. post : (ex. http://localhost:8080/form.jsp)

html의 <form>에 객체를 담아 넘기는 방식. 주로 사용자가 입력한 값을 넘긴다

    보안 가능. 개인정보가 담겨 있는 데이터에 주로 쓰임

    지정된 리소스에서 데이터를 처리하는 경우인 write, insert, delete인 경우에 쓰임

    클라이언트와 서버 간에 인코딩을 하여 서버로 전송한다 (클라이언트측 데이터 인코딩 => 서버측 디코딩)

    헤더를 통해 전송되는 방식, 전송할 수 있는 데이터의 양은 무제한

    get방식에 비해 처리 속도가 느리다.

 

 

4. get < post인 이유

get 방식은 데이터의 용량 제한이 있는 반면 post 방식은 용량 제한이 없고, get 방식은 예약어가 있기 때문에 불편하다.

또한, get방식은 사용자에게 값을 노출시키지 않아도 되기 때문이다.

간단한 게시판 프로젝트를 만들던 와중, contents.jsp에서 오류가 나서 그 오류를 살펴보았다.

 

 

24번째 라인에서 오류가 났다는 건 personVO = personDao.selectById("id", "DESC"); 부분에서 오류가 났다는 것이었다.

 

 

오류 내용 : Type mismatch : cannot conver from List<PersonVO> to PersonVO

List<PersonVO> 형을 PersonVO로 변환할 수 없다는 내용의 오류였다.

 

 

PersonDao.java 파일을 살펴봤다.

HashMap을 사용하여 List<PersonVO>에 넣었는데, 오류가 형 변환이라길래 단순히 List<PersonVO>를 PersonVO로 변환하면 오류가 해결되지 않을까 해서

 

personVO = (PersonVO)personDao.selectById("name", "DESC");

 

로 바꿔봤다.

 

 

 

코드상으로는 오류가 나지 않으나 컴파일을 시키니 또 형 변환 오류가 났다. 이게 아닌 것 같다..

 

오류를 해결할 수 있는 키워드가 '형 변환'인 것만은 확실하다.

 

PersonDao.java 파일을 유심히 보다가, 내가 출력하려는 contents.jsp 페이지의 목적이 list.jsp에서 클릭하는 사람의 정보 하나만 가져오는 것이기 때문에 personDao.selectById 메소드는 selectOne 메소드를 사용하여 List<PersonVO>가 아닌 단일 정보인 PersonVO를 출력하는 것으로 고쳐야 한다.

 

 

contents.jsp 의 수정된 부분 코드.

 

 

내가 오류의 문제를 잘 못 이해하고 있었던 것.

list.jsp에서 클릭하는 한 명의 정보만 선택되어야 하기 때문에 selectOne 메소드를 사용해야 한다.

 

오류 해결.

그러나 오류는 또 다른 오류를 생성하고.. 이름이 왜 null로 표기되는지 또 다른 오류 해결을 위하여.

 

 

* selectOne vs selectList 비교

1. selectOne : 쿼리 결과가 없으면 null을 반환

   쿼리 결과로 레코드가 하나만 나와야 한다

   DB에 레코드가 하나만 있는 경우에 사용 => 다수의 레코드가 있을 시 TooManyResultsException 에러 발생

 

2. selectList : 쿼리 결과를 List<E>로 반환

  결과가 없을 시에는 빈 List를 반환한다(null로 반환하지는 않는다)

 

 

자바 메소드로 매개변수 받는 법을 더 연습해야겠다.

 1. 마우스 오른쪽 버튼 > Build Path > Configure Build Path > Add Library로 추가 (일반적)

 

 

 

 

 

2. Maven 프로젝트의 pom.xml 클릭 > Dependencies로 추가 (Maven project에서만 가능한 기능)

 

 

Add > Select Dependency에서 'Group Id / Artifact Id / Version'을 기입하면 자동으로 받아온다.

 

* Group Id : package 경로

  Artifact Id : 프로젝트 이름

  Version : 버젼

 

이 세가지를 알 수 있는 방법은 메이븐저장소 (https://repo1.maven.org/maven2/)에 들어가서 찾아보고 기입하는 것이 초보자에게는 훨씬 쉬운 방법.

 

* 메이븐저장소 : Java 개발시 필요한 라이브러리(.jar)를 다운 받는 저장소

 

예를 들어, mysql/mysql-connector-java/5.1.38/ 이라는 경로에서는 Group Id : mysql / Artifact Id : mysql-connector-java / Version : 5.1.38이 되는 것.

 

org/mybatis/mybatis/3.3.0/이라면, Group Id : org.mybatis / Artifact Id : mybatis / Version : 3.3.0 가 된다.

 

(생각하기가 힘들다면 순서대로가 아니라 /를 경계로 놓고 Version > Artifact Id > Group Id 순으로 생각하면 쉬워진다)

 

세가지를 기입하고 나서 OK 버튼을 누르면 저장이 되지 않은 상태여서 자동으로 다운로드가 되지 않기 때문에 저장을 해주면 자동으로 다운로드가 된다.

 

많은 연습이 필요한 방법이다.

1. 정의

소프트웨어 디자인 패턴 중 Architectural Patten의 하나.

 

애플리케이션을 크게 세가지 영역으로 구분하고 영역 간의 결합도를 최소화하하기 위해 사용

주로 Web Application에서 사용되는 대표적인 객체 지향 설계

 

 

2. 구성

. 모델 (Modal) => DAO, DTO

데이터를 담거나 데이터베이스로 데이터를 보내는 작업을 하는 객체

어플 상태를 저장하고 있다가 View에서 요청하면 전송한다.

DTO를 통해 상태의 값을 주고받고, 영속 저장(DB)와의 데이터 통신을 위해 DAO를 사용한다.

모델 상태의 변화가 있을 때에는 Controller와 View에 이를 통보한다.

 

. 뷰 (View) => html, Jsp

모델 중 DTO 데이터를 뿌려준다.

렌더링을 하여 실제 사용자에게 보여지는 부분

View에서 사용자 행위를 Controller에 저장하고, 사용자가 볼 결과물 생성을 위해 모델로부터 정보를 얻어온다.

 

. 컨트롤 (Controll) => Servlet

View에 대한 진입점.

특정 결과에 대해 모델에 명령을 보냄으로서 모델의 상태를 변경한다.

 

 

3. 순서

사용자 정보 등록 html 페이지

=> html에서 넘어오는 데이터를 저장하는 DTO 클래스 (.java)

=> 사용자 정보를 관리하는 DBMS의 테이블 생성

=> DTO에서 넘어오는 DB를 실제 DBMS에 저장하는 작업을 처리하는 DAO 클래스 생성

=> 사용자가 html 페이지에 입력한 정보를 DTO에 담아 그것을 DAO 클래스의 관련 메소드에 전송하는 작업을 담당, 그 결과에 따라 서블릿이 이동

=> 성공 / 실패 뷰 페이지 작성

 

 

4. 장점

ㄱ. 유연하고 확장하기 쉽다

뷰와 모델간 간섭을 피하고 컨트롤러가 중간 관리를 하는 역할을 하여 간접소통을 통해 좀 더 유연한 구조를 설계 가능

 

 

5. 단점

ㄱ. 복잡한 구조로 보일 수 있다

ㄴ. Model과 View의 완벽한 분리가 어렵다

* Luna 버전에서는 src/main/java 경로가 잘 만들어지나, Kepler 에서는 src/main/java 경로가 잘 만들어지지 않는다. maven 버전이 낮아서인 듯 하다.

 

 


1. Maven 다운로드

http://maven.apache.org/download.cgi 사이트에 접속해서 Binary zip archive Link 의 .zip 파일을 다운받는다.

 

 

* Binary (바이너리) zip archive : 컴파일이 되어 있는 것. 일반적으로 바이너리 파일을 다운받는다.

   Source zip archive : 컴파일이 되어있지 않은 아카이브(직접 컴파일 해서 써야 하는)이기 때문에 초보자들은 쓰기 어렵다.

 

 


2. 시스템 변수(Path)에 설정

 

 

시스템 > 고급 시스템 설정 > 시스템 변수에 들어가서 MAVEN_HOME과 Path 경로를 바꿔준다. (MAVEN_HOME은 없으면 생성해도 됨)

- MAVEN_HOME : maven 경로 copy & paste

- Path : 기존의 Path 경로 뒤에 %MAVEN_HOME%bin; 을 적는다.

 

 


3. Eclipse Plugin
이클립스에서 Help > Install new Software에서 https://www.eclipse.org/m2e/m2e-downloads.html 주소를 적고 검색하고 나서 아래 http://download.eclipse.org/technology/m2e/releases/1.6/1.6.2.20150902-0002 을 New install로 설치 - Maven Integration for Eclipse (설치되어 있으면 생략)

 

 

* 이클립스 Luna 버전은 Maven이 미리 설치되어 있는 경우가 있다.

   Luna가 설치되어 있는 경로 > Pulgins > maven 폴더가 있는지 확인.

 

 


4. D:\apache-maven-3.3.3\conf\settings.xml 편집
 <localRepository>D:\apache-maven-3.3.3\tools\repository</localRepository>

 

 

@ in Eclipse
 Preference - Maven - User settings -
 D:\apache-maven-3.3.3\conf\settings.xml 변경

 

* 이클립스에서 tools.jar의 경로를 찾을 수 없다는 에러가 뜨는 경우 : Java Path의 경로를 JDK 폴더가 아닌 JRE 폴더로 설정해줬기 때문이다. Path 경로를 JDK 경로로 다시 설정해주면 에러가 해결된다.

 



5. Project 변환 (이 방식 아님 x)
 Project name - configure - Convert to Maven Project...
 pom.xml  생성

 

* pom.xml : 프로젝트의 root에 존재하는 xml 파일 (Project Object Model : 프로젝트 객체 모델)

 

 

 

6. Create a New Maven Project
 Project -> Maven -> Maven Project

 

@ Add Archetype (팝업창)
Archetype Group Id: org.apache.maven.archetypes
Archetype artifact Id: maven-archetype-webapp
Archetype Version: 1.0

OK (click)

 

@ New Maven Project
Group Id: com.jkkang
 Artifact Id: SpringExample(프로젝트이름)
Version: 0.0.1-SNAPSHOT
 Package: com.jkkang    (프로젝트이름은 제거한다)

Finish (click)


 /src/main/java (처음에는 안생김 - Build Path에 Runtime Libarary Tomcat 7.x 추가후에 생김)
 /src/main/resources/
 /src/main/webapp/WEB-INF/web.xml
 /src/test/java (삭제해도 됨)

pom.xml

 

 


7. Mybatis .jar & mysql-connector-java 추가 (via maven)
저장소에서 버전 확인

https://repo1.maven.org/maven2/org/mybatis/mybatis/

https://repo1.maven.org/maven2/org/springframework/spring-context/


 mybatis-3.3.0.jar & mysql-connector-java-5.1.36.jar

 

 <dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.3.0</version>
 </dependency>

 <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.36</version>
 </dependency>

  <properties>
   <org.springframework-version>3.2.15.RELEASE</org.springframework-version>
  </properties>
  <dependencies>
   <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${org.springframework-version}</version>
   </dependency>
   <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${org.springframework-version}</version>
   </dependency>
  </dependencies>

 

 import org.springframework.stereotype.Controller;

 


@ Controller

import org.springframework.web.bind.annotation.RequestMapping;


@ RequestMapping ("/helloWorld")   이것을 인식시킬려면, spring-webmvc 를 설치해야한다.
설치하면 윗줄 import org.springframework.web.bind.annotation.RequestMapping; auto resolv 가능

 


작성 후 Maven - clean 하고, update project 하면 mybatis-3.3.0.jar가 Libraries 밑에 download된것을 확인

* 자바 플랫폼에서 동적인 웹을 개발할 때 사용하는 기반 기술

* 웹에서 Java 프로그래밍을 할 수 있음

* 사용자의 요청을 받아 요청한대로 처리해주는 일을 한 후 처리 결과를 응답자에게 응답해줌

 

 

 

1. 사용자의 URL 요청

어떤 사용자의 URL 요청이 서블릿 요청이라는 걸 웹서버가 알기 위해서는 사전에 웹서버 측에 URL과 서블릿 클래스를 미리 mapping시켜 놓은 배포 서술자(웹 서버가 알아채라고 적은 파일들 (ex. web.xml)) 가 필요하다.

 

 

2. request, response 생성(객체)

웹 컨테이너는 지금 받은 요청을 처리하기 위해 HTTP 요청(request)을 처리하기 위한 request 객체와 HTTP 응답(response) 처리를 위한 response 객체 생성

 

 

3. 서블릿 인스턴스와 스레드 생성

request, response 객체를 생성한 뒤 사용자의 URL 요청이 어떤 서블릿 클래스 필요로 하는지 배포 서술자를 통해 알아낸다

만일 그 클래스가 한번도 실행되지 않았거나 현재 메모리에 생성된 인스턴스가 없다면 새로 생성하고 int() 메소드를 실행하여 초기화한 뒤 스레드를 하나 생성한다.

 

 

4. service() 메소드 호출과 서블릿 클래스 실행

스레드만 생성되면 각 스레드에서 service() 메소드가 호출된다

service() 메소드가 호출되면 HTTP 방식이 get일 경우 doGet(), post일 경우 doPost()가 request나 response를 자동으로 호출한다.

 

 

5. 응답과 스레드의 소멸

doGet() 또는 doPost() 메소드가 호출되어 사용자 요청에 따른 동적인 웹페이지를 생성하면, 그 결과물이 담긴 response 객체를 웹 컨테이너가 response 형태로 바꿔 서버에 전송한다. 그리고 사용이 끝난 request, response 객체를 소멸시키고 스레드가 종료된다.

'BackEnd > Java' 카테고리의 다른 글

Jsp :: MVC Model  (0) 2016.01.22
Maven :: Eclipse Luna + SpringFramework 3.2.15 + Maven Project 설치  (0) 2016.01.22
Java :: JDK와 JRE  (0) 2016.01.20
Java :: 이클립스 없이 cmd 창으로 컴파일 하기  (2) 2016.01.20
JAVA :: JRE 오류  (0) 2016.01.15

+ Recent posts