Eclipse를 사용하여 Spring MVC 을 구현하는 것에 대해서 알아보자.

일단 가장 먼저 Eclipse에서 Dynamic Web Project를 맹글자.
(이 부분은 다 알고 있으리라 생각하고 패쑤~~)

그 다음 맹글어진 프로젝트에서 WebContents 밑에 있는 web.xml을 열자.
web.xml 파일의 </web-app> 태그 위에 아래의 내용을 복사하여 붙이자.
-------------------------------------------------------------------
<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>
   org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>
    /WEB-INF/action-servlet001.xml
   </param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>
------------------------------------------------------------------------
잘 붙였으면, 간단하게 내용을 살펴보자.
DispatcherServlet은 말 그대로 Servlet 클래스이기 때문에 web.xml에 추가한 것이고,
앞으로 모든이름.do를 호출하면 이와 관련된 클래스가 호출될 것이다.
중간에 action-servlet001.xml이라는게 아직 없다.
없으니 만들자...

WEB-INF 디렉토리 하단에 action-servlet001.xml 을 다음과 같이 만들자.
------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd">

 <bean id="handlerMapping"
  class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
 
 <bean name="/test.do"   class="test.TestController">
  </bean>

</beans>
-----------------------------------------------------------------------------------
내용은 모른다고 치더라도 test.TestController 라는 클래스가 필요하다고 느낄것이다.
웹에서 test.do를 수행하면 해당 컨트롤러 클래스가 호출될 것이다.

test.TestController 클래스는 다음과 같다.
----------------------------------------------------------------------------------
package test;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class TestController implements Controller {
 public ModelAndView handleRequest(HttpServletRequest request,
   HttpServletResponse response) throws Exception
{
  System.out.println("TestController ==> handleRequest");
  return new ModelAndView("redirect:/index.html");
 }
}
-------------------------------------------------------------------------
이 소스에서는 다른 일은 안하고 "TestController ==> handleRequest"를 프린트하고
index.html로 forwarding 하도록만 되어있다.
그럼 마지막으로 이클립스의 WebContents 폴더 하단에 index.html을 하나 생성하자.
html의 body에는 다음과 같이 한번 넣어볼까?
-------------------------------------------------------------------------
<body>
Thank you for follow this tutorial. hahaha.
</body>
-------------------------------------------------------------------------
그럼 이제 코딩해야 할일은 다 끝났다.

하지만 두가지 일이 남아있다.
만든 클래스가 이클립스의 build 폴더에 생성이 되어있지 않으니,
eclipse 메뉴에서 Project --> Build All을 클릭하여 클래스를 빌드해야 한다.
(뭐~ 이게 자동으로 될 수도 있다.)

또 한가지 남은 것은
WEB-INF 하단의 lib 폴더에 Spring framework과 관련된 모든 jar를 집어 넣어 줘야 한다.
(이 방법도 여러분만의 방법이 있을 테니 자세한건 패스하고...
가장 간단한 것은 익스플로러에서 모든 jar를 선택하고 eclipse에 끌어 넣어주면 된다.)

정상적으로 작업이 되었다면
tomcat을 띄워서 해당WebApp/test.do 를 실행해보자.
Tomcat의 console에
"TestController ==> handleRequest"
가 출력되고,
화면에
Thank you for follow this tutorial. hahaha.
가 나타났다면,
초 간단 Spring MVC Framework 실습이 완료된 것이다.

이제 천천히 어려운 부분을 공부해 보자.

신고
Posted by tuning-java Trackback 0 : Comment 0

일단 본론에 들어가기 전에 MVC에 대해서는 다 알꺼라 생각한다. 몇줄만 적어보면

MVC는 Model, View, Controller의 약자로 예전의 UI, DB처리, 비즈니스 로직을 하나의 클래스나 파일에서 처리하던 것을 분리하는 것을 말한다.

간단하게 몇줄만 적었다. ㅋㅋ
그럼 Spring MVC 프레임웍에서 어떻게 사용자 요청이 처리되는지 알아보자.

1. 사용자의 요청이 오면 DispatcherServlet이라는 것이 받는다. 얘를 앞단 중계자라는 의미로 Front Controller라고 부른다.
2. 받은 것을 뭔가 매핑이 되어 있는 곳에서 적절한걸 찾아서 다른 곳으로 전달한다. 이 것을 핸들러라고 한다.
3. 전달 받은 데이터를 기반으로 DB에서 데이터를 얻어온 다음에 ModelAndView라는 객체에 저장해서 넘긴다고 한다.
4. 그 다음 DispatcherServlet이라는 놈에서 화면에 보여줄 View 와 Model 정보를 View Resolver라는 것을 통해서 View를 결정한다.
5. 해당 View에 데이터를 넘기고, View에서는 화면을 처리한 결과를 DispatcherServlet으로 넘긴다.
6. 마지막으로 화면으로 보내준다.

이 내용을 그림으로 표현한 것이 바로 아래 링크에 있다.
http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html
마우스 스크롤이 어떻게 되어 있느냐에 따라서 다르겠지만, 한 3번 정도 스크롤하면 볼 수 있다. ^^;

자세한 구현 방법은 다음 글에 올리도록 하겠다.

신고
Posted by tuning-java Trackback 0 : Comment 0
* Test.*(..)
[리턴타입] [패키지.클래스].[메소드명](매개변수의 타입])
여기서는 모든 리턴타입을 갖는 Test 클래스의 모든 매개변수 타입의 모든 클래스에 적용하라.

여기서 *은 all 이라는 의미가 된다. 즉 Test.* 이라는 것은 Test 클래스의 모든 메소드를 처리하라는 의미가 되고, 다음과 같이 사용할 수 있다.

void Test.hello(..)
void Test.hello*(..)
void Test.hello(int,String)

hello* 이라는 것을 보면, 모든 hello로 시작하는 메소드에 대해서 처리하라는 의미가 된다.

그리고 매개 변수의 타입에서 ..을 쓰면 모든 매개변수 타입에 대한 처리를 하게 되고, 원하는 타입을 명시할 수도 있다.
신고
Posted by tuning-java Trackback 0 : Comment 0
먼저 아래의 간단한 소스를 읽어 보자.

package proxytest;
public interface ITempLogic {
 public String greet();
}
----------
package proxytest;
public class TempLogicImpl implements ITempLogic {
 public String greet() {
  return "Hi";
 }
}
----------
package proxytest;
public class TempLogicProxy implements ITempLogic {
 private ITempLogic itl=null;
 public TempLogicProxy(ITempLogic l) {
  itl=l;
 }
 public String greet() {
  System.out.println("before");
  String r=itl.greet();
  System.out.println("after");
  return r;
 }
 public static void main(String args[]) {
  ITempLogic l=new TempLogicProxy(new TempLogicImpl());
  System.out.println(l.greet());
 }
}
----------
 간단하게 소스에 대해서 설명을 하자면,
 ITempLogic이라는 인터페이스를 하나 만들고,
 해당 인터페이스를 구현한 TempLogicImpl 이라는 클래스를 하나 만들었다.
 구현된 TempLogicImpl 이라는 클래스를 감싸주는 TempLogicProxy라는 클래스를 만들어 주어서 그 클래스에서 TempLogicImpl을 대행하여 수행해준다.

신고
Posted by tuning-java Trackback 0 : Comment 0

AOP : Aspect Oriented Programming

관점지향 프로그래밍이다. 어플리케이션을 OOP 관점으로 모듈화하여 작성해도 다른 모듈에서 발생하는 횡단 관심을 해결하기 위한 방법이다.

횡단 관심 : 로깅 보안, 트랜젝션등 부가 기능을 의미하며,
기존의 프로그램을 최대한 수정하지 않고 원하는 부가기능을 처리하고자 하는것이다.

AOP로 구현시 핵심 모듈을 건들지 않기 때문에 재사용성과 유지보수성이 쉬워진다.

여기서 AOP의 단점은 성능에 영향을 준다는 것이다.

참고로 횡단 관심을 해결하기 위한 시점은 다음과 같다.

  1. 메소드 호출 이전 시점
  2. Exception이 발생된 시점
  3. 메소드 호출 이후 시점

여기서 시점을 point cut 이라고 하고, 포인트 컷에서 해야하는 동작을 Advice라고 한다.
point cut과 advice를 모아놓은 것을 Aspect 라고 한다.

advice의 종류

  • around advice : org.aopalliance.intercept.MethodInterceptor - 메소드 수행 전후, Exception을 모두 처리할 수 있다.
  • before advice : org.springframework.aop.MethodBeforeAdvice - 메소드 수행전 작업을 처리할 수 있다.
  • after advice : org.springframework.aop.AfterReturningAdvice - 메소드 수행후 작업을 처리할 수 있다.
  • throws advice : org.springframework.aop.ThrowsAdvice - Exception 발생시 작업을 처리할 수 있다.


결론적으로 AOP를 사용하게되면,
원하는 proxy 기반의 interceptor 를 XML 기반으로 지정할 수 있게 되고,
XML에 지정된 bean을 사용하도록 소스를 변경해 주면 proxy에서 처리하는 부분을 사용할 수 있다.

참고로 Spring 에서는 이러한 Aspect를 Java로 구현하기 위해서 다음과 같은 방법을 사용한다.
방법 1 : 스키마 기반의 구현
방법 2 : Anotation을 이용한 구현

신고
Posted by tuning-java Trackback 0 : Comment 0

ApplicationContext : 국제화 지원, 자원 로딩, 이벤트 발생

BeanFactory : custom 초기화 메소드와 소멸 메소드를 호출하여 빈의 라이프 사이클 관리가 가능하다.

ApplicationContext  = BeanFactory + 이벤트 메커니즘.
그러므로, 이벤트 처리를 위해서는 ApplicationContext  를 사용하여 Bean을 생성한다.

Bean의 life cycle.
 Bean 의 내부 초기화 메소드 호출
-> 커스텀 초기화 메소드

-> 작업

-> 커스텀 소멸자
-> 내부 소멸자
-> 소멸

단 내부 초기화와 소멸자 메소드는 건드리지 않는 것이 좋다.

만약 ApplicationContext 의 경우가 된다면
나머지는 동일하고, 작업 부분에 이벤트 처리가 추가된다고 생각하면 된다.

신고
Posted by tuning-java Trackback 1 : Comment 0

Spring framework에서 지정하는 scope의 종류는 5가지가 있다.

singleton : 기본. 단하나의 인스턴스만 존재

prototype : 매번 객체를 생성

request : WebApplicationContext를 통해서 생성했을 경우에만 사용가능. request 스코프를 가진다.

session : WebApplicationContext를 통해서 생성했을 경우에만 사용가능. request 스코프를 가진다.

global-session : WebApplicationContext를 통해서 생성했을 경우 포틀릿을 지원하는 컨텍스트에서만 사용가능.

뒤에 있는 두가지의 경우는 웹에서 사용하기 위한 scope이다.

대부분 위에 있는 singleton과 prototype을 사용한다고 한다.

신고
Posted by tuning-java Trackback 0 : Comment 0

IoC는 Inversion of Control 의 약자이다.
이는 프레임웍에서 클래스의 객체를 관리하는 구조라고 생각하면 된다.

IoC의 구현 방법은 DL과 DI 두가지가 있다.
DL : Dependency Lookup
DI : Dependencty Injection

DL은 JNDI를 이용하여 Lookup 하는 방식을 말하고, DI는 각 오브젝트에서 의존적인 resource나 collaborator에 대한 책임을 갖지 않고 컨테이너가 그 일을 담당하도록 하는 것이다.

DI는 다음과 같이 두가지로 나뉜다.
Setter Injection
Constructor Injection

Setter Injection은 JavaBeans의 Property 구조를 이용하며, 주로 이 방법을 사용한다. 두가지 중 어떤 방법을 사용할 지에 대해서는 개인의 취향을 따르거나, 프로젝트의 표준을 따라야 한다.


신고
Posted by tuning-java Trackback 0 : Comment 0
여기에 있는 내용은 제가 교육 받으면서 필요한 부분에 대해서 정리를 해 놓은 것 입니다.
굉장히 심도가 얕기 때문에, 자세한 내용은 책을 활용하셔야 겠지요?


Spring Framework (스프링 프레임웍) 이란건 대체 무엇일까?

스프링 프레임웍을 한마디로 표현하자면
EJB 기반으로 개발을 하지 않고 POJO(Plain Old Java Object) 기반으로 개발을 하더라도 가볍고, 제어가 가능한 상호 관련이 적은, AOP (Aspect Oriented Programming. 관점지향 프로그래밍)을 지원하고, 컨테이너를 통해 라이프사이클을 관리하고, XML 기반으로 컴포넌트를 개발할 수 있도록 지원해주는 프레임웍이라고 할 수 있다.

(한마디로 표현하자니까 이해하기도 어려울 듯 하고, 열나 길다 - -;)

스프링 프레임웍은 다음과 같은 7개의 모듈로 되어 있다.
Spring Core
Spring Context
Spring DAO
Spring ORM
Spring AOP
Spring Web
Spring Web MVC

Core : DI 라는 Dependency Injection 기능을 제공한다.
Context : 컨텍스트라는 정보를 제공하는 설정을 관리한다. JNDI, EJB, 국제화, 스케줄링이 여기에 포함된다.
DAO : DB와 관련된 JDBC 코딩 부분을 처리해 주기 위한 JDBC 추상화 레이어를 제공한다.
ORM : JDO, Hibernate, iBATIS 등 O-R Mapping API를 위한 레이어를 제공한다.
AOP : 관점지향 프로그래밍을 제공한다.
Web : 웹 기반의 여러가지 기능을 제공한다.
Web MVC : Model과 View(Web form) 사이의 구분을 제공하기 위한 관련된 기능을 제공한다.

이제 스프링 프레임웍이 어떻게 되었는지 간단히 알아보았으니,
다음에는 IoC 컨테이너 부터 천천히 알아보자.
신고
Posted by tuning-java Trackback 0 : Comment 0
윤 머시기 강사가 이야기한

Spring Framework 가 만들어진 이유

Proxy의 불편함 => AOP 의 사용
JDBC의 불편함 => Spring JDBC
Web 프로그래밍의 불편함 => Spring MVC

기타 등등의 지금까지 Java 기반의 프로젝트를 하면서 불편한 점에 대해서
보완을 하기 위해서 만들어 졌다고 한다.
신고
Posted by tuning-java Trackback 0 : Comment 0