Spring Annotation

JAVA 2019. 9. 30. 20:48

1. HttpServletRequest, HttpServletResponse


 

2. HttpSession


 

3. Local

 - java.util.Locale 지역 정보


 

4. InputStream, Reader

 - HttpServletRequest의 getInputStream(), Reader


 

5. OutputStream, Writer

 - HttpServletResponse의 getOutputStream(), Writer - 서블릿 형태로 만들때 사용한다.


 

6. @PathVariable

 - @RequestMapping의 URL {} 부분의 패스 변수를 받는다.

    만약 타입이 틀린 값이 들어오면 HTTP 400 - Bad Request 가 전달 된다.

?

1

2

@RequestMapping("/board/{id}")

public void view( @PathVariable("id") int id ) {...}

 


 

7. @RequestParam

 - 스프링 내장 변환기가 다룰 수 있는 모든 타입을 지원한다.

   해당 파라미터가 없다면 HTTP 400 - Bad Request 가 전달 된다.

 -  file의 경우는 <input type="file" name="file" /> 에 매핑 된다.

?

1

2

3

public String edit( @RequestParam("id") int id,

            @RequestParam("title") String title,

            @RequestParam("file") MultipartFile file ) {...}

 

 -  맵 형태로 받으면 모든 파라미터 이름은 맵의 키에 파라미터 값은 맵의 값에 담긴다. 

?

1

public String add( @RequestParam Map<String, String> params ) {...}


 

-  파라미터가 필수가 아니라면 required = false 로 지정하면 된다. 

   이때 파라미터가 없으면 NULL이 들어간다. default 값을 지정 할 수도 있다. 

?

1

2

3

public void view( @RequestParam(value = "id",

                        required = false,

                        defaultValue = "0" )  int id) {..}.

 


 

8. @CookieValue

 - @RequestParam과 동일 하며 쿠키값을 가져올 때 사용한다.

?

1

2

public String check( @CookieValue("check") String check,

                required = false, defaultValue = "" ) {...}

 


 

9. @RequestHeader

 - 헤더 정보를 메소드 파라미터에 넣어 준다. Ajax로 처리할때 $.ajax(...) 에서 head에 특정 값을 넣고 여기서 받아서 

   있으면 ajax이고 없으면 일반페이지라는 식으로 이용하면 된다.

?

1

public String header( @RrequestHeader("ajax") String ajax ) {...}

 


 

10. Map, Model, ModelMap

 - view를 String으로 리턴해 주고 Attribute를 Map, Model, ModelMap 에 담을 수 있다.

 

11. @ModelAttribute

 - 파라미터를 Object형태로 받을때 사용된다. 일반적인 파라미터 형태로 쓰인 경우 타입이 일치하지 않으면 객체에 매핑 되지 

   않으며 에러는 발생 시키지 않는다. 자동으로 ModelMap에 담기므로 modelMap.addAttribute를 해 줄 필요가 없다.

?

1

public void update( @ModelAttribute("board") Board board) {...}


 

 - 메소드에도 @ModelAttribute를 설정 할 수 있다. 리턴값이 항상 나머지 컨트롤러에 자동 추가 되며 보통 참조용 데이터 등에 

   이용된다.

?

1

2

@ModelAttribute("emailList")

public Map<String, String> getEmailList() { ... }

 


 

12. Errors, BindingResult

  - 모델의 값을 검정한다. 이때 BindingResult나 Errors의 파라미터 값의 위치는 반드시 @ModelAttribute 뒤에 위치해야 한다. 

     자신의 바로 앞에 있는 @ModelAttribute 파라미터의 검정 작업만 하기 때문이다.

?

1

2

@RequestMapping(value = "/board/add", method = RequestMethod.POST)

public String add( @ModelAttribute("board") Board board, BindingResult result ) {...}

 


 

13. SessionStatus

 - 모델 오브젝트를 세션에 저장하여 계속 사용한다. 더이상 모델 오브젝트를 사용하지 않을 때는 세션에서 제거해 줘야 한다.


 

14. @RequestBody

 - HTTP body 부분만 전달 한다. XML 이나 JSON 으로 출력 할 경우 사용한다.

   리턴타입의 @ResponseBody 를 참조하자.

 

15. @Value

 - 프로퍼티값이나 값을 파라미터에 적용한다.

?

1

2

3

4

5

6

7

8

9

public class BoardController {

    @Value("${eng.url}")

    String engUrl;

 

    @RequestMapping(..)

    public String gotoEng() {

        return this.engUrl;

    }

}

 

 - 위는 프로퍼티중 eng.url 의 값을 String engUrl에 매핑 시키고 메소드에서 사용한 케이스다. 파라미터에도 적용 된다.

?

1

2

3

public String gotoEng( @Value("${eng.url}") String engUrl ) {

    return engUrl;

}

 


 

16. @Valid

 - JSR - 303 검증기를 이용해서 @ModelAttribute를 검정하도록 한다.

?

1

public String add( @Valid @ModelAttribute("board") Board board, BindingResult result ) { ...}


 

Posted by 철냄비짱
,

    관련 문서

    목차

     

    개발단계에서 사용빈도가 높은 어노테이션 위주로 정리.

    목차에 없는 항목은 API 문서를 참고할 것. 구글링하는게속편한건함정

     

    @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"/>

    cs

    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 {

           .....

    }

    Colored by Color Scripter

    cs

     

    CGLIB

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

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

     

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

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

    <context:component-scan base-package="spring.demo" scoped-proxy="no">

       <context:include-filter type="regex" expression="*HibernateRepository"/>

       <context:exclude-filter type="aspectj" expression="..*IBatisRepository"/>

    </context:component-scan>

    Colored by Color Scripter

    cs

    위와 같이 <context:include-filter> 태그와 <context:exclude-filter> 태그는 각각 type 속성과 expresseion 속성을 갖는데, type 속성에 따라 expression 속성에 올 수 있는 값이 달라진다. 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

    설정 위치: setter 메서드 앞

    Required 어노테이션은 필수 프로퍼티임을 명시하는 것으로 필수 프로퍼티를 설정하지 않을 경우 빈 생성시 예외를 발생시킨다.

    import org.springframework.beans.factory.annotation.Required

     

    public class TestBean {

        @Required

        private TestDao testDao;

        

        public void setTestDao(TestDao testDao) {

            this.testDao = testDao;

        }

    }

    Colored by Color Scripter

    cs

    <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanpostProcessor"/>

    <bean name="testBean"  class="han.test.TestBean">

        <property name="testDao" ref="testDao"/>  

        <!-- @Required 어노테이션을 적용하였으므로 설정하지 않으면 예외를 발생시킨다. -->

    </bean>

    Colored by Color Scripter

    cs

    RequiredAnnotationBeanPostProcessor 클래스는 스프링 컨테이너에 등록된 bean 객체를 조사하여 @Required 어노테이션으로 설정되어 있는 프로퍼티의 값이 설정되어 있는지 검사한다.

    사용하려면 <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" /> 클래스를 빈으로 등록시켜줘야 하지만 이를 대신하여 <context:annotation-config> 태그를 사용해도 된다:

    <beans xmlns="http://www.springframework.org/schema/beans"

              xmlns:context="http://www.springframework.org/schema/context"

              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-3.1.xsd

                 http://www.springframework.org/schema/context

                 http://www.springframework.org/schema/context/spring-context-3.1.xsd">

        <context:annotation-config/>

    </beans>

    Colored by Color Scripter

    cs

     

    @Autowired

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

    버전: spring 2.5

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

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

    options:

    • required: Autowired 어노테이션을 적용한 프로퍼티 중 반드시 설정할 필요가 없는 경우에 false값을 주어 프로퍼티가 존재하지 않더라도 스프링이 예외를 발생하지 않도록 한다. 기본값은 TRUE. ex) @Autowired(required=false)

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

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

    @Autowired

    @Qualifier("test")        

    private Test test;

    cs

     

    @Qualifier

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

    버전: spring 2.5

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

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

    options:

    • name: alias명

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

    <bean id="user2" class="com.sp4.UserImpl">

        <property name="name" value="스프링"/>

        <property name="age" value="20"/>

        <property name="tel" value="000-0000-0000"/>

    </bean>

     

    <bean id="userService1" class="com.sp4.UserService"/>

    cs

    public class UserService {

        @Autowired

        @Qualifier("user2")

        private User user;

     

        public String result() {

            return user.getData();

        }

    }

    cs

     

    @Resource

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

    @Autowired와 흡사하지만 @Autowired는 타입으로(by type), @Resource는 이름으로(by name)으로 연결한다는 점이 다르다.

    options:

    • name: 자동으로 연결될 빈객체의 이름을 입력한다. ex) @Resource(name="testDao")

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

    <beans

        <!-- 기타 설정 생략 -->

        <context:annotation-config/>

        

        <bean id="user2" class="com.test.UserImpl" p:data="65536"/>

    </beans>

    Colored by Color Scripter

    cs

    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();

        }

    }

    Colored by Color Scripter

    cs

     

    @Scope

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

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

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

    @Component

    @Scope(value="prototype")

    public class Worker { }

    cs

    @Component

    @Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)

    public class Worker { }

    Colored by Color Scripter

    cs

     

    @PostConstruct

    패키지: javax.annotation

    버전: jdk1.6, spring 2.5

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

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

    사용하려면 CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. <context:annotation-config> 태그로 대신할 수 있다.

    @PostConstruct

    public void init() {

        System.out.println("객체 생성 후 내가 먼저 실행된다.");

    }

    Colored by Color Scripter

    cs

     

    @PreDestroy

    패키지: javax.annotation

    버전: jdk1.6, spring 2.5

    설정 위치: 해당 작업 메서드 앞

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

    사용하려면 CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. <context:annotation-config> 태그로 대신할 수 있다.

     

    @Inject

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

     

    @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();

        }

    }

    Colored by Color Scripter

    cs

    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;

            }

        }

    }

    Colored by Color Scripter

    cs

    @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";

    }

    Colored by Color Scripter

    cs

     

    @Repository

    패키지: org.springframework.stereotype

    버전: spring 2.0

    @Repository는 일반적으로 DAO에 사용되며 DB Exception을 DataAccessException으로 변환한다.

    @Repository("bbs.boardDAO")

    public class BoardDAO {

        private SqlSession sqlSession;

        

        public int insertBoard(Board dto) throws Exception {

            ...

        }

    }

    Colored by Color Scripter

    cs

    public class BoardServiceImpl implements BoardService {

        @Resource(name="bbs.boardDAO")

        private BoardDAO dao;

     

        public int insertBoard(Board dto){}

    }

    Colored by Color Scripter

    cs

     

    @Controller

    http://noritersand.tistory.com/474

     

    @RequestMapping

    http://noritersand.tistory.com/475

     

    @RequestParam

    http://noritersand.tistory.com/357

     

    @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);

        }

     

        // 중간생략

    }

    Colored by Color Scripter

    cs

     

    @ModelAttribute

    http://noritersand.tistory.com/365

     

    @RequestBody

    @RequestBody 어노테이션이 적용된 파라미터는 HTTP Request body의 내용이 전달된다.

    참고: http://java.ihoney.pe.kr/283

    @RequestMapping(value="/test")

    public void penaltyInfoDtlUpdate(@RequestBody String body,

            HttpServletRequest req, HttpServletResponse res,

            Model model, HttpSession session) throws Exception  {

     

        System.out.println(body);    

    }

    Colored by Color Scripter

    cs

     

    @ResponseBody

    참고: http://ismydream.tistory.com/140

    클라이언트에 JSON 형식의 값을 응답할 때 유용하다. 메서드에 @ResponseBody를 적용한 후 문자열을 리턴하면 그 값은 HTTP response header가 아니라 HTTP response body에 쓰여진다. 객체를 넘길경우 스프링에 내장된 JACKSON에 의해 문자열로 변환될 것이다.

    또한 @ResponseBody가 적용된 컨트롤러는 context에 설정된 resolver를 무시한다.

    @RequestMapping("/getVocTypeList")

    @ResponseBody

    public ArrayList<Object> getVocTypeList() throws Exception {

        HashMap<String, Object> vocData = gvocInf.searchVocTypeList();

        return (ArrayList<Object>) vocData.get("data");

    }

    Colored by Color Scripter

    cs

     

    @PathVariable

    URL의 일부를 파라미터 혹은 변수로 사용한다.

    package com.sp.ex;

     

    @Controller("ex.exController")

    public class ExController{

        @RequestMapping(value="/blog/{userId}/main.action", method=RequestMethod.GET)

        public String main(HttpServletRequest req

                           , @PathVariable String userId) throws Exception    {

     

            req.setAttribute("userId", userId);

            return "restful/result";

        }

    }

    Colored by Color Scripter

    cs


Posted by 철냄비짱
,

먼저 범주부터 나열하자면 다음과 같습니다.

List 계열
AbstractListArrayListLinkedListVector 


Map계열 
AbstractMapAttributesHashMapHashtableIdentityHashMapRenderingHintsTreeMapWeakHashMap


Set계열
AbstractSetHashSetLinkedHashSetTreeSet

 

위의 List, Map,Set은 모두 Collection이라는 넘의 자식이라고 생각하시면됩니다.

말그대로... 먼가를 수집하는 박스라는 의미이죠.

 

Collection, List, Map,Set은 모두 구현되지 않은 interface입니다. 그냥 이러이러하다고 틀만 잡아놓은거죠... 이것들을 실제로 사용할 수 있게 구현한것이 위에 적어 놓은 자식들입니다.

예를들어보자면..

List a = new Vector();  --> 다형성(부모는 여러가지 자식의 형태로 나타날 수 잇다.)의 예가됩니다.

이러한 것은 가능하지만...

List a = new List();

이렇게는 사용할 수없다는 것입니다.

 

 

 

이러한 Collection 의 자식들은 자신들만의 고유한 특징을 명확히 가지게됩니다.

List :  수집의 순서가 있으며, 동일한 데이터의 중복 입력이 가능합니다.

          순차적으로 대량의 데이터를 억세스하거나 입력할때 유리한 방식입니다.

 

Map : Key & Value의 형태로 입력이되며, 키값을 입력하면 해당하는 value값을 획득할 수있습니다. 수집의 순서를 기억하지 않으며, 동일한 데이터를 Key값으로 사용할 수 없습니다. (물론 key값이 틀리고 value값이 동일한건 가능합니다.)

다건의 데이터에서 원하는 특정 데이터에 접근(검색)할 때 유리한 방식입니다. 

 

Set : 중복데이터를 불허하는 것을 제외하고는 큰 특징이 없습니다.

      입력되는 당시의 순서에는 따르지 않으나... 순차적인 접근을 위해서는 Iterator로 접근하게됩니다.

 

그리고 각가의 구현 class들의 특징도 조금씩이나마 차이가 발생합니다.

음.. 예만 들어보자면... 같은 Map 계열임에도 불구하고.. HashMap은 데이터 입출력이 동기화되지 않고 처리속도가 빠른 반면  HashTable은 모든 입출력이 동기화(토근을 부여받아 순차적으로 객체에 접근)되며 처리속도는 다소 떨어지게됩니다.

 

그외 List계열의 Vector와 ArrayList도 Vector가 synchronized(동기화) 되는 반면 ArrayList는 그렇지 않다는 정도입니다.(물론 특정상황에서는 이것이 매우 중요한 문제가 될 수 있습니다.)





 출처 : http://blog.naver.com/atonikkaz?Redirect=Log&logNo=10017976539

Posted by 철냄비짱
,

기본형/참조형 변수, 각종 기초문법(if, for, while, switch 등), 배열, 상속, 오버라이딩, 오버로딩, 인터페이스, 추상클래스 등 정도 학습을 하게 되면 어느정도 자바 프로그래밍에 대한 평가를 받아봐야 합니다.

프로그래밍의 감각 내지는 이해도 공부 정도를 평가해야 할 때 입니다. 쉽게 말해 기초 내공이겠지요.

그 것중에 가장 대표적으로 좋은 평가 예제가 Iterator 패턴 입니다. 자바에서는 많은 패턴이 존재하지만 그 중에서도 Iterator이 가장 쉬우면서도 기초 평가에는 아주 제격이죠.

아마 많은 자바 프로그래밍 교재에서도 Iterator 패턴은 적어도 한 줄 이상은 언급을 할 것이라고 생각합니다. 저 역시 자바를 처음 접하면서 Iterator을 해봤죠..(시험 시간에 멍 때린 기억이...)

그럼 이제 본론으로 들어가봅시다.

일단 Iterator 패턴을 프로그래밍 하기 전에 간단한 UML을 알아보고 진행하도록 합시다.
블로그를 통해서 UML에 관한 글을 별도로 준비하지 않은 이유는 지식이 너무도 부족해서 입니다. 그래도 간단한 설계도를 그려 보면 코딩하는 과정은 복잡해지지 않고 클래스 간의 연관성을 쉽게 파악할 수 있는 장점이 생깁니다.

가장 먼저 상속의 관계를 그려 봅시다.

A클래스를 B클래스가 상속한다.(추상 클래스도 상관은 없습니다.)
A와 B의 관계는 상속 관계입니다. B가 A를 상속할 때는 화살표 모양이 삼각형으로 하면 됩니다.
인터페이스간의 상속도 이와 같이 하면 됩니다.
class A {
        ......
}
class B extends A{
        ......
}


인터페이스를 구현하는 그림

상속과는 비슷하지만 구현 관계는 점선으로 표시 합니다.
B클래스가 A 인터페이스를 구현.

interface A {
        ......
}
class B implements A {
        ......
}


집약 그림

class A {
        ......
}
class B {
        private A a;
        ......
}
집약 관계는 B 클래스에서 A 클래스의 객체를 맴버로 갖고 있는 경우를 말합니다. 말 그대로 객체를 갖고 있는 경우를 집약이라고 하는 것 입니다. 표현은 갖고 있는 쪽이 마름모, 대상이 화살표 입니다.

클래스의 관계 그림

B 클래스는 A 클래스를 사용한다라고 해서 "◀ User" 라고 표시 합니다. 이 외에도 생성하는 관계라면 "◀ Creates", 통지(아마 값을 전달하는 관계를 말하는 것 같음) "◀ Notifies" 단어를 이용해서 표시 하면 됩니다. 솔직히 말씀 드리면 이 부분에 대해서는 저도 사용을 어떤식으로 해야 하는지 자세히 모르기 때문에 설명을 분명히 못하겠습니다.

 

 

그 외에도 맴버변수, 생성자, 메소드 등에 대한 표기법과 클래스, 추상클래스, 인터페이스 표기법, 접근제어자에 따른 표기법이 존재합니다. 일단 지금은 UML을 자세히 알기 위한 글이 아니니 이 부분은 따로 준비를 해서 알려드리도록 하겠습니다.

그럼 이제 위에서 잠시 소개 했던 UML은 다음의 Iterator 예제 문제를 제시 한 뒤에 설계를 위해 이용하도록 합시다.

인수에 대한 언급이 없으면 인수는 없도록 한다, 모든 메소드는 public 사용, 맴버변수는 private 사용을 하도록 한다.

1. Iterator 인터페이스
반환형이 boolean형인 메소드 hasNext를 보유, 반환형이 Object형인 메소드 next를 보유

2. Aggregate 인터페이스
반환형이 Iterator형인 메소드 iterator를 보유

3. Book 클래스
책이름을 저장하는 맴버변수 name를 보유, 문자열을 인수로 받아 name에 책이름을 저장하는 생성자를 보유,
책이름을 반환하는 메소드 getName을 보유.

4. BookShelf 클래스
Aggregate 인터페이스를 구현, Book형 배열 books[]와 int형 변수 last를 맴버변수로 보유(last는 선언과 동시에 0으로 초기화 할 것), 배열 books의 크기를 지정하는 값을 인수로 받아서 books의 크기를 설정하는 생성자를 보유, 인수 int index를 이용해서 books[]의 지정된 위치의 객체를 반환하는 메소드 GetBookAt를 보유, Book 객체를 인수로 받아 books[last] 위치에 전달 받은 객체를 저장하고 last를 1 증가시키는 appendBook 메소드를 보유, last를 반환하는 getLength 메소드를 보유, BookShelfIterator 객체를 생성하여(인수는 this를 사용한다.) 반환하도록 iterator 메소드를 오버라이딩 한다.

5. BookShelfIterator 클래스
Iterator 인터페이스를 구현, BookShelf 형 객체 bookshelf와 int형 index를 맴버변수로 보유, BookShelf형 객체를 인수로 받아 bookshelf에 대입하고 index를 0으로 초기화 하는 생성자를 보유, bookshelf에서 index의 위치에 가져올 객체가 존재하는지에 따라 true/false를 반환하도록 hasNext 메소드를 오버라이딩 한다. bookshelf에서 index의 위치의 객체를 가져온 뒤 index를 1증가 시키고 가져온 객체는 반환하도록 next 메소드를 오버라이딩 한다.

6. Main 클래스
BookShelf형 객체를 만들어 Book 객체 3개를 BookShelf 객체에 저장한다.(책은 국어책, 수학책, 영어책으로 한다.) 이 후 Iterator 객체에 BookShelf의 객체를 대입한 뒤 while문과 hasNext메소드, next메소드 등을 이용해서 화면에 출력한다.

실행 화면


생각보다 복잡하고 어려울 수 있습니다. 그러나 좀 전에 이야기 한 것 처럼 UML을 이용하면 생각보다 어렵지 않다는 것을 알 수 있습니다. 그리고 문제를 이해하는 것 또한 중요합니다. 문제 전체를 이해 하려 하지 말고 각 문제당 제시한 조건을 개별적으로 이해한 뒤에 조합을 해보면 쉽게 프로그래밍 할 수 있습니다.

단순하게 클래스다이어그램을 그려 보면(UML을 이용해서 그런 것을 말함)

메소드와 인터페이스 등의 특징을 표시 하지 않고 아주 간략하게 그린 것 입니다.(틀렸을지도 ~) UML에 대한 지식이 부족하므로 일단은 자신이 알아볼수 있도록 그리는 것이 중요할 것 입니다. (메인은 제외 시켰음)

그럼 이 것만으로 프로그래밍 하기에는 어려운 점도 있을 것이니 약간의 힌트를 알려드리겠습니다.

1, 2, 3번은 문제에서 제시한 그대로를 코딩으로 옴기면 됩니다.

3번의 경우 약간 주의해야 할 것은 문자열이라는 것과 반환형입니다.

4번 부터 슬슬 난이도가 있네요. 오버라이딩이라는 것은 구현 또는 상속 관계에서 반드시 해야 하는 것입니다. 부담 갖지 마세요.

배열을 선언하는 것과 그 크기를 지정하는 것은 다릅니다.
선언과 동시에 초기화 한다는 것은 변수를 선언하면서 값을 지정한다는 것입니다.

인수라는 것은 메소드 뒤에 오는 소괄호 안에 들어가는 매개변수(인수와 같은 의미)를 말합니다.
인수는 값을 전달받기 위해서 사용됩니다. 반환한다는 것은 return문을 사용해야 한다는 것을 말합니다.

반환에 대한 언급이 없으면 반환형은 void 입니다.
변수값을 반환 할 때는 반환형과 변수의 유형에 주의해야 합니다.

인수를 this로 한다는 것은 자신을 가리키는 것입니다.(여기서 this의 의미는 객체입니다.)
생성자에도 소괄호가 존재하고 이 곳은 매개변수(인수) 라고 하며 값을 전달하는데 사용합니다.

객체를 인수로 전달 받는다는 것은 어떤 형태로 전달 받을 것인가를 말합니다.(인수의 형태)

return문은 어디에 위치하느냐에 따라 한 메소드에서 여러번 사용할 수 있습니다.

반환형과 반환될 객체가 다른 경우에 둘 사이에 관계가 어떤 관계인가를 살피도록 합시다.

형변환/캐스팅을 알고 있어야 합니다.

Main 클래스에서는 Vector 클래스 사용법을 알고 있으면 쉽게 구성할 수 있습니다.

이 정도면 충분할 것 같습니다. 프로그램이 완성된 소스는 Java 예제 소스 카테고리에 있습니다.

본인 실력으로 풀어보시는 것이 중요합니다. 이 문제를 풀 수 있느냐 없느냐에 따라 자신의 기초 실력과 객체지향 프로그래밍 개념에 대한 이해도가 나타나기 때문입니다.
Posted by 철냄비짱
,

Microsoft Ajax - http://ajax.asp.net

 

Java BluePrints - https://blueprints.dev.java.net/

 

Protptype - http://www.prototypejs.org/

 

Scriptaculus - http://script.aculo.us/

 

Laszlo - http://www.openlaszlo.org/

 

GWT - http://code.google.com/webtoolkit/

 

AJAX.net - http://www.ajaxpro.info/

 

Yahoo - http://developer.yahoo.com/yui/

 

Active Widgets - http://www.activewidgets.com/

 

Tibco General Interface - http://developer.tibco.com/

 

Visual Web GUI - http://www.visualwebgui.com/

 

Dojo - http://dojotoolkit.org/

 

Backbase - http://www.backbase.com/

 

SmartClient - http://www.smartclient.com/

 

Nitobi - http://www.nitobi.com/

 

JackBe - http://www.jackbe.com

 

Zimbra - http://www.zimbra.com/

 

Rico - http://www.openrico.org/

 

Spry - http://labs.adobe.com/technologies/spry/

 

Aflax - http://www.aflax.org/

 

DWR - http://getahead.org/dwr

 

Moo.fx - http://moofx.mad4milk.net/

 

Mochikit - http://www.mochikit.com/

 

Xajax - http://www.xajaxproject.org/

 


Nexaweb - http://www.nexaweb.com





1. Cross-browser 라이브러리

 

x library (www.cross-browser.com)

베테랑 DHTML 라이브러리, 다양한 브라우저에서 동작하는 애니매이션, 스타일링, 이벤트, 기타의 공통 기능을 제공한다. 

 

Sarissa (http://sarissa.sf.net)

브라우저에 독립적으로 XML을 다루는  방법을 제공하는 자바스크립트 API

브라우저에 상관없이 자바스크립트 객체를 XML로 직렬화하는 기능, XSLT, XPath 쿼리 기능등의 다양한 XML 기술들을 지원한다.

 

Prototype  (http://prototype.conio.net/)

자바스크립 프로그래밍을 위한 범용의 헬퍼 라이브러리. 자바스크립트를 Object Oriented Programming 스타일로 작성위한 확장을 제공한다. 또한 견고한 Ajax 라이브러리를 포함한다.프로토타입은 Ruby on Rails, Rico, Scriptaculous 등에서 자바스크립트 엔진으로 사용된다.

 

2. 위젯 & 위젯 슈트

 

Scriptaculous (http://script.aculo.us)

다양한 시각효과(visual effect)를 지원하는 자바스크립트 라이브러리. 기본적으로 프로토타입을 사용하며 문서화가 잘 되어있다. 데모와 샘플애플리케이션, 드래그&드럽 라이브러리등을 지원한다.

 

Rico (http://openrico.org)

AJAX를 지원하는 다목적 프레임워크. 애니매이션, MVC의 분리, 드래그&드롭, 데이터그리드, 그외에 다양한 위젯등을 지원한다. 프로토타입 상에서 구현됨.

 

3. 애플리케이션 프레임워크

 

DWR, JSON-RPC, and SAJAX

다른 언어를 사용하지만, 이들은 모두 자바스크립트 코드로 부터 곧바로 서버측 함수(자바, 파이썬, 루비, 펄...)를 호출할 수 있는 방법을 지원한다.

 

DWR : http://www.getahead.ltd.uk/dwr/

JSON RPC : www.json-rpc.org/

SAJAX : www.modernmethod.com/sajax

 

Backbase (http://www.backbase.com/)

서버에서 생성된 HTML 문서안에 포함된 XML 태그를 실시간으로 리치위젯으로 바인딩할 수 있는 기능을 제공하는 browser-side 프레임웍이 되겠다. RICO가 표준 HTML 태그를 사용하는 반해, BackBase는 커스텀 XHTML 태그를 사용하여 UI 컴포넌트를 생성하는 것을 제외하고는 기본적인 원리는 RiCO의  behavior 컴포넌트와 비슷하다.

 

Echo2 (www.nextapp.com/products/echo2)

서버에 선언된 유저 인터페이스 모델로 부터 리치 UI 컴포넌트를 생성해주는 프레임워크.  Echo2는 순수 자바만으로 AJAX 애플리케이션을 만들 수 있다.

 

Ruby on Rails (www.rubyonrails.org)

루비 프로그래밍 언어로 쓰여진 웹 개발 프레임워크. 기본적으로 서버측 객체를 데이터베이스로  바로 매핑하는 기능, 테플릿을 사용해서 콘텐츠를 프리젠테이션하는 기능등을 제공한다. 최근버전에서는 프로토타입 라이브러리를 통해 ajax 강력 지원한다.

[출처] Ajax 구현 라이브러리 모음|작성자 잘난돌이

Posted by 철냄비짱
,