'Framework'에 해당되는 글 5건

  1. 2017.06.22 Springboot > Main Type Application 설정
  2. 2013.07.30 Spring Framework/ DI / IOC 컨테이너 / POJO
  3. 2013.07.29 Annotation_Spring_MVC_2
  4. 2013.07.29 Annotation_Spring_MVC_1
  5. 2013.07.29 Annotation
2017. 6. 22. 10:24
MainTypeApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.web.filter.CharacterEncodingFilter;

@SpringBootApplication
public class MainTypeApplication extends SpringBootServletInitializer {

	 private static Class<Maintypeapplication> applicationClass = MainTypeApplication.class;

	 
	public static void main(String[] args) {
		SpringApplication.run(MainTypeApplication.class, args);
	}
	
	@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(applicationClass);
    }
	
	/**
	 * EncodingFilter 
	 * @return
	 */
	@Bean
	public CharacterEncodingFilter characterEncodingFilter() {

		CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
	  
		characterEncodingFilter.setEncoding("UTF-8");
	    characterEncodingFilter.setForceEncoding(true);

	    return characterEncodingFilter;
	}
	
}


Eclipse
Spring boot project > Run as > Run Configurations > 
Main Type -> search -> this class (ex). MainTypeApplication.java) settings


Posted by 1+1은?
2013. 7. 30. 14:31

Spring

1.  SpringFramework ?

-   정의

부품을 조립해주는lib 또는framework  lib 들이 모이면

framework(재사용하는 ) 된다.

요구명세서(목록) 주면 객체도 생성하고 조립까지 해준다.

생성순서는Big -> small  형식이 아니라 small 에서big  순서대로

ex)로봇을 생성할  손가락-> -> 팔뚝-> -> 몸통-> 전체  형식

-    


    

위와 같이 Core 부분의IoC Container Spring 핵심이고, IoC에는DI 있으며 이것을좀더 세부적으로 나눈다면Setter Injection, Constructor Injection, Method Injection 등으로 나눌  있다.

 

2.  SpringFramework 장점

-   경량컨테이너

:  전체 스프링의 크기는 1MB 남짓  하나의JAR파일,스프링에 의해 발생하는 부하는 무시해도 되는 수준

객체의 라이프 사이클 관리,JAVA EE 구현을 위한 다양한 API 제공

-   DI(Dependency Injection), AOP(AspectOriented Programming), POJO(Plain Old Java Object) 지원

-   다양한 API와의 연동 지원을 통한JAVA EE 구현 가능 

 

3.  Spring 주요특징

-   DI(의존성 주입)/ AOP(관점지향)/ MVC(JDBC코딩)

-   통합(struts, spring, Mybatis, hibenate)

-   Transaction / IOC(제어의 역행,역제어)

 

4.  POJO(PlainOld Java Object): 특별한 요구사항을 따르지 않은 평범한 자바객체

 

5.  IOC컨테이너

-   Spring으로 만든 것을IOC 컨테이너에 보관하는데,보관하고 있다가 사용자가 달라고 요청할 시에만 주는 형식이다.



출처 : http://blog.naver.com/jjijilx2?Redirect=Log&logNo=60187998892


'Framework > Spring' 카테고리의 다른 글

Annotation_Spring_MVC_2  (0) 2013.07.29
Annotation_Spring_MVC_1  (0) 2013.07.29
Annotation  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 16:35

■ MVC 관련 Spring annotation - 2 


목차

@Service

@Repository

@Controller

@RequestMapping

@requestParam

@ModelAttribute

@SessionAttributes

@InitBinder



@Service


개요 : @Service를 적용한 Class는 비지니스 로직이 들어가는 Service로 등록이 된다.

 

Controller에 있는 @Autowired는 @Service("xxxService")에 등록된 xxxService와 변수명이 같아야 하며

Service에 있는 @Autowired는 @Repository("xxxDao")에 등록된 xxDao와 변수명이 같아야 한다.


@Service("helloService")
      public class HelloServiceImpl implements HelloService {
    @Autowired
    private HelloDao helloDao;
           public void hello() {
  System.out.println("HelloServiceImpl :: hello()");
  helloDao.selectHello();
     }
      }

helloDao.selectHello(); 와 같이 @Autowired를 이용한 객체를 이용하여 Dao 객체를 호출한다.


예제

@Service("test2.testService") 
//괄호 속 문자열은 식별자를 의미한다.
//괄호를 생략할 경우 클래스명 그대로 사용한다. 
//따라서 ,같은 클래스명이 존재 할 시 같은 식별자가 생성되기때문에 에러가 발생한다.
public class TestService
{
 public String result(int num1, int num2, String oper)
 {
  String str = null;
  
  if(oper.equals("+"))
  {
... 
생략
...
  return str;
 }
} 

@Resouce로 연결

@Resource(name="test2.testService") 
 //name에 필요한 것은 @Service("test2.testService") <- 여기서 괄호 속 문자열, 즉 식별자
 private TestService service; 
        //TestService service = new TestService(); 라고 하는것과 같은 식
 
 @RequestMapping(value="/test2/oper.action", method={RequestMethod.GET})
 public String form() throws Exception
 {
  return "test2/write";
 }

@Repository 


패키지 : org.springframework.stereotype

버젼 : spring 2.0

개요 : 레포지 토리 어노테이션은 일반적으로 DAO에 사용되며 DB Exception을 DataAccessException으로 변환한다.


예제


@Repository("bbs.boardDAO")
public class BoardDAO
{
 private SqlSession sqlSession;
 
 public int insertBoard(Board dto) throws Exception
 {
  ...
 }
}

public class BoardServiceImpl implements BoardService
{
 @Resource(name="bbs.boardDAO")
 private BoardDAO dao;
 
 public int insertBoard(Board dto){}
}


@Controller


패키지 : org.springframework.stereotype

버젼 : spring 2.5

개요 : spring MVC의 Controller 클래스 선언을 단순화시켜준다. 스프링 컨트롤러, 

서블릿을 상속할 필요가 없으며, @Controller로 등록된 클래스 파일에 대한 bean을 자동으로 생성해준다.

 

Controller로 사용하고자 하는 클래스에 @Controller 지정해 주면 component-scan으로 자동 등록된다.

 

- xml 설정



- java


 package han.test;
 
       import org.springframework.stereotype.Controller;
 
       @Controller
       public class SpringC {
       }

@RequestMapping


개요 : RequestMapping annotation은 url을 class 또는 method와 mapping 시켜주는 역활을 한다. annotation을 쓰지 않을때 지정했던 Controller등록을 위한 url bean 설정을 생략 할 수 있다.

class에 하나의 url mapping을 할 경우, class위에 @RequestMapping("/url")을 지정하며

, GET 또는 POST 방식 등의 옵션을 줄 수 있다.

해당되는 method가 실행된 후, return 페이지가 따루 정의되어 있지 않으면 @RequestMapping("/url")에서 

설정된 url로 다시 돌아간다.


수업예제


@RequestMapping(value="/test3/oper.action"[, method=RequestMethod.POST])
public ModelAndView submit(int num1, int num2, String oper) throws Exception
{
 ....
} 

//요청된 URL에 따라 호출될 메서드를 지정한다.
//클라이언트가 /test3/oper.action 을 요청하면 위 메서드가 실행된다는 것이다.
//단, method 지정을 하면 해당 프로토콜에 해당된 요청에만 반응한다.
//여기서 method 는 get/post 둘 다 지정할 수도 있다.
 @RequestMapping(value="/...", method={RequestMethod.GET, RequestMethod.POST})
method=...get || method={...get, ...post}

상세 속성 정보

 (1) value  : "value='/getMovie.do'"와 같은 형식의 매핑 URL 값이다. 디폴트 속성이기 때문에 value만 정의하는 경우에는 'value='은 생략할 수 있다.

 

 예 : @RequestMapping(value={"/addMovie.do", "/updateMovie.do" })

 

이와 같은 경우 "/addMovie.do", "/updateMovie.do" 두 URL 모두 처리한다.

 

(2) method  : GET, POST, HEAD 등으로 표현되는 HTTP Request method에 따라 requestMapping을 할 수 있다. 'method=RequestMethod.GET' 형식으로 사용한다. method 값을 정의하지 않는 경우 모든 HTTP Request method에 대해서 처리한다.

 

예 : @RequestMapping(method = RequestMethod.POST)

 

위의 경우 value 값은 클래스 선언에 정의한 @RequestMapping의 value 값을 상속받는다.  

 

(3) params  : HTTP Request로 들어오는 파라미터 표현이다. 'params={"param1=a", "param2", "!myParam"}' 로 다양하게 표현 가능하다.

 

예 : @RequestMapping(params = {"param1=a", "param2", "!myParam"})

 

위의 경우 HTTP Request에 param1과 param2 파라미터가 존재해야하고 param1의 값은 'a'이어야하며,

myParam이라는 파라미터는 존재하지 않아야한다. 또한, value 값은 클래스 선언에 정의한 @RequestMapping의 value 값을 상속받는다. 

 

(4) headers  : HTTP Request의 헤더 값이다.'headers="someHader=someValue"', 'headers="someHader"', 'headers="!someHader"' 로 다양하게 표현 가능하다. Accept나 Content-Type 같은 헤더에 대해서 media type 표현 시 '*' 도 지원한다.

 

예 : @RequestMapping(value="/movie.do", headers="content-type=text/*")

 

위의 경우 HTTP Request에 Content-Type 헤더 값이 "text/html", "text/plain" 모두 매칭이 된다. 또한,

Type-Level, Method-Level에서 모두 사용할 수 있는데, Type-Level에 정의된 경우, 하위의 모든 핸들러 메소드 에서도 Type-Level에서 정의한 헤더값 제한이 적용된다.


 - 사용 예

@Controller
@RequestMapping("/han/test/*")
public class HelloController
{
@RequestMapping(method=RequestMethod.GET, value="go")
public returntype getMethodName(){
:
}

@RequestMapping(method=RequestMethod.POST, value="go2")
public returntype getMethodName2(){
:
}
}

@Controller("mainController")
@RequestMapping(value="/main.action")
public class MainController {
  
 @RequestMapping(method=RequestMethod.GET)
 public String method() {
  return ".mainLayout";
 }
}
 

@RequestParam


개요 : RequestParam annotation은 key=value 형태로 화면에서 넘어오는 파라미터를 맵핑 된 메소드의

파라미터로 지정해 준다. 주로 get 방식으로 들어오는 request에서 사용한다.

 

아래에서 xxx/editBlog.do?blogId=3 과 같이 접근할 때, editBlogHandler 메소드의 파라미터인 blogId에는 3이 셋팅된다. 필수 요건이 아닐 경우, @RequestParam(value="id", required="false")와 같이 옵션을 주고 사용할 수 있다.


@Controller
      public class BlogController {
 /* 중간생략 */
 
 @RequestMapping("/editBlog")
 public ModelMap editBlogHandler(@RequestParam("blogId") int blogId) {
  blog = blogService.findBlog(blogId); 
  return new ModelMap(blog);
 }
 
 /* 중간생략 */
     }

수업예제


@RequestMapping(value="/...", method={RequestMethod.GET, RequestMethod.POST})
public String submit(HttpServletRequest req
  , @RequestParam(value="num1") int num1
  , @RequestParam(value="num2") int num2
  , @RequestParam(value="oper") String oper) throws Exception
{
 ...  //value : form객체가 넘겨줄 값의 name
}
 
//@RequestParam 어노테이션이 적용된 파라미터는 기본적으로 필수 파라미터이다.
따라서, 명시한 파라미터가 존재하지 않을 경우 400 에러가 발생한다.
 
//여기서 파라미터에 값이 있을수도 없을수도 있는 로직을 구현하려면 다음처럼 작성한다.
 
 
@RequestMapping(value="/...", method={RequestMethod.GET, RequestMethod.POST})
 
public String submit(HttpServletRequest req
  , @RequestParam(value="num1", defaultValue = "0") int num1
  , @RequestParam(value="num2", defaultValue = "0") int num2
  , @RequestParam(value="oper", required=false) String oper) throws Exception
{
 ...
}

@ModelAttribute


개요 : ModelAttribute annotation은 화면의 form 속성으로 넘어온 model을 맵핑된 method의 파라미터로 지정해주는 역활을 한다. 주로 POST 타입으로 넘어오는 form 속성의 model 값을 받아 올 때 사용된다.

(get/post 모두 통용된다.)


 @Controller
     public class BlogController {
 /* 중간생략 */
 
 @RequestMapping("/updateBlog")
 public String updateBlogHandler(@ModelAttribute("blog") Blog blog) {
  blogService.updateBlog(blog);
  return "redirect:findBlogs.do";
 }
 
 /* 중간생략 */
    }

@SessionAttributes


개요 : SessionAttribute annotation은 세션상에서 model의 정보를 유지하고 싶을 경우 사용 할 수 있다.


 @Controller
     @SessionAttributes("blog")
     public class BlogController {
 /* 중간생략 */
 
 @RequestMapping("/createBlog")
 public ModelMap createBlogHandler() {
  blog = new Blog();
  blog.setRegDate(new Date());
  return new ModelMap(blog);
 }
 
 /* 중간생략 */
    }
 

@InitBinder


ο Annotation 기반 Controller 에서 ServletContext 구하기


  :
 
    @Controller
    @RequestMapping("/common/download")
    public class DownloadController {
        @Autowired
        private ServletContext sc;
 
        @RequestMapping
        public ModelAndView download(@RequestParam("filePath") String filePath) throws               Exception              
        {
            String path = sc.getRealPath(filePath);
            return new ModelAndView("common.download", "downloadFile", new File(path));
        }
    }


'Framework > Spring' 카테고리의 다른 글

Spring Framework/ DI / IOC 컨테이너 / POJO  (0) 2013.07.30
Annotation_Spring_MVC_1  (0) 2013.07.29
Annotation  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 16:10

Spring annotation

   spring Framework는 java 5+ 부터 annotaion을 제공 하며, annotation의 사용으로 설정파일을 간결화하고, 객체 또는 메소드의 맵핑을 명확하게 할 수 있다.


목차

@Component 

@Required

@Autowired

@Qualifier

@Resource

@Scope

@PostConstruct

@PreDestroy

@Inject



@Component 


패키지 : org.springframework.stereotype

버젼 : spring 2.5

개요 : <context:component-scan> 태그를 설정파일에 추가하면 해당 어노테이션이 적용된 클래스를 빈으로 등록하게 된다. 범위는 디폴트로 singleton이며 @Scope를 사용하여 지정할 수 있다.

 

설정위치: 클래스 선언부 위 

추가설정 : XML 설정파일에 <context:component-scan>을 정의하고 적용할 기본  패키지를 base-package 속성으로 등록한다.


context:annotation-config 태그는 어노테이션과 관련해서 다음의 BeanPostProcessor를 함께 등록 한다.
           - @Required(RequiedAnnotationBeanPostProcessor)
           - @Autowired(AutowiredAnnotationBeanPostProcessor)
           - @Resource, @PostConstruct, @PreDestory(CommonAnnotationBeanPostProcessor)
           - @Configuration(ConfigurationClassPostProcessor)
 
* 그 외 Repository, Service, Controller 포함



예를 들어 <context:component-scan base-package="xxx" />에서 xxx패키지 하위에서 


@Component로 선언된 클래스를 bean으로 자동 등록한다.

bean의 이름은 해당클래스명(첫글자는 소문자)이 사용된다.       

 

<context:component-scan /> 요소에는 scoped-proxy 속성이 존재 한다. 

scoped-proxy 속성은 <aop:scoped-poxy/> 요소처럼 WebApplicationContext 에서만 유효하며 

"session", "globalSession", "request" 이외의 scope는 무시 되며 아래의 3가지 값을 설정 할 수 있다.

 

 

        no : proxy를 생성하지 않는다.(기본값)

        interfaces : JDK Dynamic Proxy를 이용한 Proxy 생성

        targetClass : 클래스에 대해 프록시를 생성(CGLIB를 이용한 Proxy 생성)

 

 

 -  사용 예


@Component
     @Scope("prototype")   // 생략하면 싱글톤
     public class Test {
            .....
     }


- CGLIB

   기존의 자바 클래스파일로부터 자바의 소스코드를 동적으로 생성하는 라이브러리(자바 소스 변경)

 

http://sourceforge.net/projects/cglib/

 

 

- 스캔 대상 클래스 범위 지정하기

       <context:include-filter> 태그와 <context:exclude-filter> 태그를 사용하면 자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스를 구체적으로 명시할 수 있다.

 


           
           
      
 


위와 같이 <context:include-filter> 태그와 <context:exclude-filter> 태그는 각각 type 속성과 expresseion 속성을 갖는데, type 속성에 따라 expression 속성에 올 수 있는 값이 달라지는데 type 속성에 입력 가능한 값을 다음과 같다

 

* Type 속성에 올 수 있는 값

 

     annotation : 클랙스에 지정한 어노테이션이 적용됐는지의 여부

            expression 속성에서는 "org.example.SomeAnnotation"와 같은 어노테이션 이름을 입력한다.

      assignable : 클래스가 지정한 타입으로 할당 가능한지의 여부. 

            expression 속성에는 "org.exampleSomeClass" 와 같은 타입 이름을 입력한다.

      regex : 클래스 이름이 정규 표현식에 매칭되는 지의 여부.

           expression 속성에는 "org\.example\.Default.*" 와 같이 정규표현식을 입력한다.

      aspectj : 클래스 이름이 AspectJ 의 표현식에 매칭되는 지의 여부.

          expression 속성에는 "org.example..*Service+" 와 같이 AspectJ 의 표현식을 입력한다.

 

 

@Required 

 

패키지 : org.springframework.beans.factory.annotation

버젼 : spring 2.0

Required 어노테이션은 필수 프로퍼티임을 명시하는 것으로 필수 프로퍼티를 설정하지 않을 경우 

빈 생성시 예외를 발생시킨다.


설정위치 : setter 메소드

추가설정 

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" /> 클래스를 빈으로 등록시켜줘야 한다. 

해당 설정 대신에<context:annotation-config> 태그를 사용해도 된다.

 

    - 1단계 : 코드내에 프로퍼티 설정 메소드에 @Required 어노테이션을 붙인다.


import org.springframework.beans.factory.annotation.Required
     public class TestBean {
         private TestDao testDao;
  
         @Required
         public void setTestDao(TestDao testDao) {
            this.testDao = testDao;
         }
     }


- 2단계 : 스프링 설정 파일에 RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록



 
    
          

    


RequiredAnnotationBeanPostProcessor 클래스는 스프링 컨테이너에 등록된 bean 객체를 조사하여 @Required 어노테이션으로 설정되어 있는 프로퍼티의 값이 설정되어 있는지 검사하고 설정되어있지 않으면 bean 생성시 예외를 발생시킨다.

 

     RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록하지 않고

     <context:annotation-config> 다음과 같이 태그를 이용할 수도 있다.



     

       

     


@Autowired  

 

 패키지 : org.springframework.beans.factory.annotation

버젼 : spring 2.5

개요 : 오토 와이어링 어노테이션은 의존관계를 자동설정할 때 사용하며 타입을 이용하여 의존하는 객체를 삽입해 준다. 그러므로 해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시키게 된다.


설정 위치 : 생성자, 필드, 메소드(setter메소드가 아니여도 된다)

추가설정 : <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.


옵션 : required - @Autowired어노테이션을 적용한 프로퍼티에 대해 설정할 필요가 없는 경우에 false값을 주며 이때 해당 프로퍼티가 존재하지 않더라도 스프링은 예외를 발생시키지 않는다.

 

@Autowired(required=false)로 선언한다. (기본값은 true)

 


특징 : byType으로 의존관계를 자동으로 설정할 경우 같은 타입의 빈이 2개 이상 존재하게 되면 예외가 발생하는데, Autowired도 이러한 문제가 발생한다. 이럴 때 @Qualifier를 사용하면 동일한 타입의 빈 중 특정 빈을 사용하도록 하여 문제를 해결할 수 있다.

 

       @Autowired

       @Qualifier("test")

       private Test test;

 


@Qualifier


패키지 : org.springframework.beans.factory.annotation

버젼 : spring 2.5

개요 : 콸리파이어 어노테이션은 @Autowired의 목적에서 동일 타입의 빈객체가 존재시 특정빈을 삽입할 수 있게 설정한다. @Qualifier("mainBean")의 형태로 @Autowired와 같이 사용하며 해당 <bean>태그에 <qualifire value="mainBean" /> 태그를 선언해주어야 한다. 메소드에서 두개이상의 파라미터를 사용할 경우는 파라미터 앞에 선언해야한다.


설정위치 : @Autowired 어노테이션과 함께 사용된다.

추가설정 : 동일타입의 빈객체 설정에서 <qualifier value="[alias명]" />를 추가해 준다.

옵션 : name - alias명



  
  
  
 
 
 

 

@Resource 


개요 : 자바 6버전 및 JEE5 버전에 추가된 것으로 어플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용 한다. 스프링 2.5 부터 지원하는 어노테이션으로 스프링에서는 의존하는 빈 객체를 전달할 때 사용하다.

              @Autowired 와 같은 기능을 하며 @Autowired와 차이점은 @Autowired는 타입으로(by type),  @Resource는 이름으로(by name)으로 연결시켜준다는 것이다.


설정위치 : 프로퍼티, setter 메소드


추가설정 : <bean class="org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor"/> 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.

옵션 : name 

      name속성에 자동으로 연결될 빈객체의 이름을 입력한다.

      @Resource(name="testDao")

 

CommonAnnotationBeanPostProcessor 클래스를 설정파일에 빈객체로 등록하여 어노테이션을 적용시킨다.



 
    
          

    


예제


public class UserService
{
        @Resource(name="user2")
 private User user;  
        //UserImpl user2 = new UserImpl();
        //User user = user2;

 public void setUser(User user)
 {
  this.user = user;
 }
 public String result()
 {
  return user.getData();
 }
}


@Scope 


패키지 : org.springframework.beans.factory.annotation

개요 : 스프링은 기본적으로 빈의 범위를 "singleton" 으로 설정한다. "singleton" 이 아닌 다른범위를 지정하고 싶다면 @Scope 어노테이션을 이용하여 범위를 지정한다.

설정 : prototype, singleton, request, session, globalSession

 

사용 예 - 1


@Component
     @Scope(value="prototype")
     public class Worker {
            :
     }
 


사용 예 - 2


@Component
    @Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
    public class Worker {
           :
    }


 

@PostConstruct, @PreDestroy, @Inject 


@PostConstruct

패키지 : javax.annotation

버젼 : jdk1.6, spring 2.5

개요 : 의존하는 객체를 설정한 이후에 초기화 작업을 수행하기 위해 사용

설정위치 : 초기화 작업 수행 메소드

추가설정 : CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.


-예제


@PostConstruct
 public void init()
 {
  System.out.println("객체 생성 후 내가 먼저 실행된다.");
 }



@PreDestroy

패키지 : javax.annotation

버젼 : jdk1.6, spring 2.5

개요 : 컨테이너에서 객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용

설정위치 : 해당 작업 메소드

추가설정 : CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.

 

@Inject

개요 : JSR-330 표준 Annotation으로 Spring 3 부터 지원하는 Annotation이다. 특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다. @Inject를 사용하기 위해서는 클래스 패스 내에 JSR-330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 함에 유의해야 한다. 


'Framework > Spring' 카테고리의 다른 글

Spring Framework/ DI / IOC 컨테이너 / POJO  (0) 2013.07.30
Annotation_Spring_MVC_2  (0) 2013.07.29
Annotation  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 16:04

.

하지만 자바 리플렉션도 같은 기능을 제공한다고 생각할 수도 있다. 결국 이 모든 정보에 대한 코드를 검사할 수 있다. 표면적으로 볼 때 그럴 듯 하지만 실제로 그렇지 않다. 

많은 경우 메소드는 인풋으로서 받아들이거나 아웃풋으로 리턴한다. 이는 메소드가 원하는 것이 아니다. 예를 들어, 매개변수 유형이 Object이지만 메소드는 Integer를 사용해서만 작동한다. 

 

이는 메소드가 겹쳐 쓰기된 곳에서 쉽게 발생할 수 있다. 그리고 슈퍼클래스가 메소드를 일반 매개변수로 선언하던가 많은 직렬화가 진행되는 시스템에서도 쉽게 발생한다. 두 경우 모두 메타데이터는 코드 분석 툴을 지정할 수 있다. 매개변수 유형이 Object이더라도 정말로 원하는 것은 Integer라는 것을 나타낼 수 있다. 이러한 종류의 분석은 상당히 유용하며 그 가치는 상당하다. 

 

보다 복잡한 경우 코드 분석 툴은 모든 종류의 추가 태스크들을 수행할 수 있다. 그 예 중 하나가 Enterprise JavaBean (EJB) 컴포넌트이다. 심지어 간단한 EJB 시스템으로의 의존성과 복잡함은 상당하다. 

로컬 인터페이스와 로컬 홈 인터페이스의 가능성과 함께 홈 인터페이스와 원격 인터페이스를 얻는다. 이 모든 클래스들을 연동시키는 것은 진정한 고통이다. 하지만 메타데이터는 이 문제에 대한 솔루션을 제공한다. 좋은 툴은(예를 들어, XDoclet)은 이 모든 의존성을 관리하면서 "코드-레벨" 연결이 없지만 "로컬-레벨" 관계를 가진 클래스들이 연동될 수 있도록 한다. 이것이 바로 메타 테이터의 진정한 가치이다. 

 

2. Annotation의 종류

 1) Mark Annotation

   변수가 없다. 이 어노테이션은 이름으로 구분되며 추가 데이터 없이 나타난다. 예를 들어, 

 

@MarkerAnnotation은 marker 어노테이션이다. 데이터가 없으며 단지 어노테이션 이름만 있을 뿐이다.

   예) @Stateless

 


2) Single-value Annotation

   marker와 비슷하지만 데이터를 제공한다. 싱글 비트 데이트를 제공하기 때문에 간단한 신택스를 사용할 수 있다. (단, 어노테이션 유형이 이 문법을 수용해야 함)

 

@SingleValueAnnotation("my data")이는 @표시만 제외하고는 일반적인 자바 메소드 호출과 비슷하다.

   예) @Resource("mappedName=PERSON")

 


 3) Full Annotation(Multi value Annotation)

   다중 데이터 멤버를 갖고 있다. 결과적으로 전체 신택스를 사용해야 한다. (그리고 어노테이션은 일반 자바 메소드와 더 이상 비슷하지 않다) 

 

@FullAnnotation(var1="data value 1", 

var2="data value 2", var3="data value 3") 

 


 4) 커스텀 annotation 구현 : 개발자가 직접 annotation을 구현


public @interface TODO {      // Single-Value Annotation
            String value();       // value가 아닌 다른 이름을 사용하면 사용시 메소드 이름을 써준다
    }
 
    // @TODO("Something todo")
 
    public @interface TODO{      // Single-Value Annotation
            String msg();        // value가아닌다른이름을사용한경우
    }
    // @TODO(msg="Something todo")



3. Annotation을 구분하는 또 다른 기준

 1) Simple Annotation

    메소드나 변수 위에 붙이는 일반적인 Annotation

 

 2) Meta Annotation

    Annotation의 Annotation(다른 Annotation 위에다가 설정)

 

 

4. Meta Annotation

 1) @Target annotation

    작성한 annotation이 어디에서 사용하게 될지를 결정


@Target(
{
                ElementType.TYPE,              // 클래스,인터페이스,enum
                ElementType.METHOD,            // 생성자를 제외한 모든 메소드
                ElementType.CONSTRUCTOR,       // 생성자
                ElementType.ANNOTATION_TYPE    // 메타 annotation
         }
)


2) @Retention annotation([속성값])

   작성한 annotation의 지속성을 설정

 

   - RetentionPolicy.SOURCE : 컴파일러가 컴파일시 삭제하여 클래스 파일에 저장되지 않는다

   - RetentionPolicy.CLASS : 클래스 파일에 저장되지만 JVM은 무시

   - RetentionPolicy.RUNTIME : 클래스 파일에 저장하고 JVM

 

 

5. 내장 Annotation

 1) @Override

   슈퍼클래스의 메소드를 오버라이드


public class OverrideTester {
    public OverrideTester() { }
 
    @Override
    public String toString() {
      return super.toString() + " [Override Tester Implementation]";
    }
 
    @Override
    public int hasCode() {
      return toString().hashCode();
    }
  }
 


 2) @Deprecated

    Override와 마찬가지로 Deprecated는 marker 어노테이션이다. Deprecated를 사용하여 더 이상 사용되지 말아야 하는 메소드에 주석을 단다. Override와 다른 점은, Deprecated는 더 이상 사용되지 말아야 하는(depreciated) 메소드와 같은 라인상에 놓여져야 한다.


public class DeprecatedClass {
    @Deprecated public void doSomething() {
      // some code
    }
 
    public void doSomethingElse() {
      // This method presumably does what doSomething() does, but better
    }
  }


 3) @SuppressWarnings

   번거로운 경고를 제거한다.

   Override와 Deprecated와는 다르게 SupressWarnings는 변수를 갖고 있다. 따라서 이를 작동하게 하려면 싱글-어노테이션 유형을 사용한다. 값 어레이로서 변수를 제공할 수 있다. 각각 삭제할(Suppress) 특정 유형의 경고를 나타낸다.


@SuppressWarnings(value={"unchecked"})
  public void nonGenericsMethod() {
    List wordList = new ArrayList();
    wordList.add("foo");
  }



'Framework > Spring' 카테고리의 다른 글

Spring Framework/ DI / IOC 컨테이너 / POJO  (0) 2013.07.30
Annotation_Spring_MVC_2  (0) 2013.07.29
Annotation_Spring_MVC_1  (0) 2013.07.29
Posted by 1+1은?