2012년 7월 9일 월요일

[토비의 스프링]개념정리

회사에서 스프링 공부하래서 혼자 정리하면서 익힐겸 이것저것..개념정리!

Maven


  • Apache에서 프로젝트의 복잡한 빌드 과정을 관리하기 위해 만들었다.Project Management Object를 사용하여 빌드,테스트,도큐멘테이션,의존성등 프로젝트의 전체를 관리하는 플러그인이다.
  • 일관된 디렉토리 구조로 개발의 가독성,협업 편의성이 높아지고 유지보수,라이브러리 관리를 쉽게 해준다.
  • Maven은 POM(project Object Model)에서 모든 설정을 한다


여기에 잘 설명 되어있다. http://blog.naver.com/inho1213?Redirect=Log&logNo=80063933144

Spring

1.오픈소스 프레임워크
- java beans를 사용하지만 EJB에서 할 수 있었던 작업을 가능하게 해줌
2.경량컨테이너
3.DI(Dependency Injection)지원
3.AOP(Aspect oriented programming) 지원
4.POJO(Plain Old Java Object) 지원
5.다양한 API와의 연동 지원

Spring 구성 모듈



Core


  • 프레임워크의 가장 기본적인 부분,IoC(제어의 역전)와 DI(의존성 삽입)기능을 제공한다.
  • BeanFactory는 IoC를 적용하여 애플리케이션의 설정과 의존성에 대한 명세를 실제 Application code로 부터 분리하는 Factory pattern의 구현체

  • DAO(Data Access Object)


  • JDBC로 작업할 때의 반복적인 연결생성,명령실행등의 일을 추상화하여 데이터베이스 연결 코드를 간결하도록 구성.끔찍한 JDBC코딩과 데이터베이스 업체 특정 에러코드의 파싱을 할 필요를 제거하는 JDBC추상화 레이어를 제공한다. 또한 JDBC패키지는 특정 인터페이스를 구현하는 클래스를 위해서 뿐 아니라 모든 POJO를 위해서도 선언적인 트랜잭션 관리만큼 프로그램에 따른 방식으로 할수 있는 방법을 제공한다.

  • ORM(Object Relational Mapping)


  • JDO,Hibernate,iBatis를 포함하는 인기있는 객체-관계 맵핑 API를 위한 통합 레이어를 제공한다.ORM패키지를 사용하여 앞에서 언급된 간단한 선언적인 트랜잭션 관리와 같은 Spring이 제공하는 다른 모든 기능을 사용해서 혼합하여 모든 O/R매퍼를 사용할 수 있다.

  • AOP(Aspect Oriented Programming)


  • 관점지향 프로그래밍

  • Spring Web


  • 멀티파트 파일업로드기능,서블릿 리스너를 사용한 IoC컨테이너의 초기화 그리고 웹기반 어플리케이션 컨텍스트와 같은 기본적인 웹기반 통합기능들을 제공한다.webWork나 Struts와 함께 Spring을 사용할 때 이것은 그것들의 통합할 패키지이다.

  • Spring MVC


  • 웹 애플리케이션을 위한 Model-View-Controller(MVC)구현물을 제공한다. Spring의 MVC구현물은 어떤오래된 구현물이 아니다. 이것은 도메인 모델 코드와 웹폼사이의 분명한 구분을 제공하고 유효성체크와 같은 Spring프레임워크의 다른 모든 기능을 사용하도록 허용한다.

  • DI(Dependency Injection)


  • 참고(설명 잘 되어있음):http://warmz.tistory.com/750
  • 클래스와 클래스 간에 인터페이스를 통해 결합도를 낮춰 느슨한 결합을 유지하고 객체 스스로가 의존 객체를 생상하고 검색하는 대신 수동적으로 의존 관계를 주입하는 것을 의미한다.
  • 객체간의 의존관게를 객체 자신이 아닌 외부 조립기가 수행한다.
  • 제어의 역할 이라는 의미로 사용되었음.(Martin Fowler,2004)
  • "제어의 어떠한 부분이 반전되는가"라는 질문에 '의존 관계 주입'이라는 용어를 사용
  • 복잡한 어플리케이션은 비지니스 로직을 수행하기 위해서 두 개 이상의 클래스들이 서로 협업을 하면서 구성됨.
  • 각각의 객체는 협업하고자 하는 객체의 참조를 얻는 것에 책임성이 있음.
  • 이 부분은 높은 결합도와 테스트하기 어려운 코드를 양산함
  • DI를 통해 시스템에 있는 각 객체를 조정하는 외부 개체가 객체들에게 생성시에 의존관계가 주어짐
  • 즉,의존이 객체로 주입됨
  • 느슨한 결합이 주요 강점
  • 객체는 인터페이스에 의한 의존관계만을 알고 있으며, 이 의존관계는 구현 클래스에 대한 차이를 모르는 채 서로 다른 구현으로 대체가 가능

  • AOP(Aspect Oriented Programming

    OOP의 한계


  • OOP의 대표적인 상속은 컴파일시에 행동이 결정 되므로 실행시에 특징을 바꿀수 없다. 그리고 모든 서브클래스에서 동일한 코드 상속을 받게 될 경우 슈퍼클래스의 변경이 이루어 졌을때 일부 서브클래스에서 원치 않는 변경을 받아들여야만 한다. 상속은 전혀 유현하지 못한다. 이를 해결 하기 위해 구성이라는 기법을 사용한다. 구성은 상속의 모든 단점을 해결해 준다. 실행중 동적으로 행동을 바꿀 수 있으며 슈퍼클래스가 없으므로 의존도가 제가 된다. 하지만 이런 구성도 단점이 있다. 슈퍼클래스의 코드를 재사용 할 수 없고 구성 객체에게 위임 해야하는 번거로움이 있다.


  • AOP의 등장


  • 위에서 제기된 OOP의 한계를 보완하고자 OOP와 전혀 다른 개념인 AOP가 등장하였다. AOP는 OOP의 강력한 상속과 구성만으로 처치 곤란했던 여러곳에 흩어진 중보코드를 제거 하였다. AOP의 기본 개념은 횡단 관심사(CROSS-CUTTING)에 대한 모듈화 이다.
  • 기능을 핵심 비지니스 로직(핵심 관심사)과 공통 모듈(횡단 관심사)로 구분하고, 핵심 로직에 영향을 미치지 않고 사이사이에 고옹 모듈을 효과적으로 잘 끼워넣도록 하는 개발 방법이다. 공통 모듈(보안,로깅..)을 만든 후에 코드 밖에서 이 모듈을 비지니스 로직에 삽입 하는것이 바로 AOP적인 개발이다. 코드 밖에서 설정 된다는것이 핵심이다.


  • IoC(Inversion of Control

    제어의 역전이란?


  • 간단하게 보면 프로그램의 제어 흐름 구조가 바뀌는 것. 일반적인 프로그램은 시작되는 지점에서 다음에 사용할 오브제그를 결정,생성,호출 하는 작업을 반복한다. 이런 구조에서 각 오브젝트는 흐름을 결정하거나 사용 할 오브젝트를 구성 하는 작업에 능동적으로 참여한다.즉, 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조이다.

    반면에 IoC(Inversion of Control)은 제어의 흐름을 거꾸로 뒤집는다. 오브젝트는 자신이 사용 할 오브젝트를 스스로 생성 하거나 선택하지 않는다. 그리고 오브젝트가 어디서 어떻게 만들어 지고 사용되는지 알 수 없다. 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하는 것이다. 프로그램의 시작을 담당하는 main()을 제외하면 모든 오브젝트는 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.

  • 호출패턴개념도설명
    클래스 호출방식클래스내에 선언과 구현이 한몸이기때문에 다양한 형태로 변화가 불가능.
    인터페이스 호출방식구현클래스 교체가 용이하여 다양한 형태로 변화가능. 하지만 인터페이스 교체시 호출클래스도 수정해야함.
    팩토리 호출방식팩토리방식은 팩토리가 구현클래스를 생성하므로 클래스는 팩토리를 호출. 인터페이스 변경시 팩토리만 수정하면 됨. 호출클래스에는 영향을 미치지않음. 하지만 클래스에 팩토리를 호출하는 소스가 들어가야함.. 그것 자체가 팩토리에 의존함을 의미한다.
    IoC팩토리패턴의 장점을 더하여 어떠한것에도 의존하지 않는 형태가 됨. 실행시점에 클래스간의 관계가 형성이 된다.
    [출처]:http://www.javajigi.net/pages/viewpage.action?pageId=5813

    ORM(Object Relational Mapping)

    wiki : http://en.wikipedia.org/wiki/Object-relational_mapping


  • wiki 정의 : Object-relational mapping (ORM, O/RM, and O/R mapping) in computer software is a programming technique for converting data between incompatible type systems in object-oriented programming languages. This creates, in effect, a "virtual object database" that can be used from within the programming language. There are both free and commercial packages available that perform object-relational mapping, although some programmers opt to create their own ORM tools.
  • 데이터베이스에 OOP의 개념을 연결하는 프로그래밍 기술이다. 가상 데이터베이스 객체를 만드는 기술. 직접 테이블을 객체에 매핑하거나 XML형태의 SQL을 실행하여 처리를 수행하는 Framework 개발 모델


  • MVC(Model-View-Controller)

    디자인패턴

  • 템플릿 메소드 패턴(templet method pattern)
  • -상속을 통해 superclass를 확장. 변하지 않는 기능을 superclass로, 자주 변경되고 확장되는 기능들은 subclass에 만든다.

    -Super class에서는 미리 Abstract Class또는 Override가능한 method를 정의 해두고 이를 활용하여 템플릿 메소드를 만든다. 선택적으로 override할수 있도록 만들어둔 Method를 hook method라 한다.





  • ex)Super class

  • public abstract class AbstractDisplay { //상위 클래스
        public abstract void open(); //추상 메서드
              public abstract void print();//추상 메서드
              public abstract void close();//추상 메서드
        public final void dispaly(){ //템플릿 메서드
             open();
             for(int i = 0; i<5; i++){
             print();
             }
          close();
       }
     }





  • ex)Sub class

  • public class CharDisplay extends AbstractDisplay {
        private char ch;
             public CharDisplay(char ch) {
                super();
                this.ch = ch;
              }
              public void open() {
                 System.out.print("<<");
              }
              public void print() {
                 System.out.print(ch);
              }
              public void close() {
                 System.out.println(">>");
              }
      }
    [출처] 템플릿 메소드 패턴 - Templete Method Pattern|작성자 GemStone

  • 팩토리 메소드 패턴(factory method pattern)
  • 인스턴스를 생성하는 공장을 template method pattern으로 구성한 것이 Factory method pattern이 된다. Factory Method Pattern에서는 객체를 만드는 방법을 상위 클래스 측에서 결정하지만 구체적인 클래스 이름까지 결정하지 않는다. 구체적인 내용은 모두 하위 클래스에서 수행한다. 따라서 객체 생성을 위한 골격과 실제의 인스턴스 생성의 클래스를 분리해서 생각할 수 있다.





  • 유용한 경우
    1.구체적으로 어떤 클래스의 객체를 생성 해야할지 미리 알지 못할 경우 Factory Method Pattern이 유용하다. 구체적으로 생성될 객체는 하위 클래스에 의해 결정이 되며 하위 클래스는 계속 확장이 가능하다.
    2.Factory Method Pattern은 하위 클래스들에게 개별 객체의 생성 책임을 분산시켜 객체의 종류별로 객체 생성과 관련된 부분을 구지화 시킬때 유용하다.
  • 장점
    1.어떤 객체를 생성 할 것인지와는 무관하게 동일한 형태로 프로그래밍이 가능하다. 이것은 두개의 상위 클래스가 있기 때문에 가능하다.
    2.직접 생성자를 호출해서 객체를 생성하는 것보다 훨씬 유연하고 확장성 있는 구조이다.





  • 단점
    1.생성할 객체의 종류가 달라질때 마다 새로운 하위 클래스를 정의 해야한다. 이는 불필요하게 많은 클래스를 정의해야 한다는 문제점이 있다.

  • [참조:http://devsw.tistory.com/61]
    [예제:http://scotty83.tistory.com/entry/Factory-Method-Pattern]

  • 전략 패턴(strategy pattern)
  • 이해하기 쉽게 정말 설명 잘되있음 : http://kwakyc87.tistory.com/137

    Servlet



    • Servlet은 Java Server Technology의 일환으로 현재는 CGI의 효과적인 대안으로서 javaSoft가 주장하는 기술이다.


    • CGI(Common Gateway Interface)
    - 웹 상에서 서버와 상호연동하기 위한 일종의 규약이다. CGI의 개념은 웹에서 어떤 사용자가 어떤 요청을 웹서버에게 하면 웹 서버는 하나의 프로세스를 실행시킨다. 이 프로세스에 사용자가 어떤 요청을 했는지에 대한 정보가 넘어가고 프로세스가 정보를 가공한 뒤, 결과를 웹서버에게 넘겨주면 웹서버는 이를 다시 사용자의 브라우져로 보내준다.

    • CGI의 문제점
    - 사용자가 한 번의 요청을 할 때마다 웹서버가 프로세스를 하나씩 만든다. 사용자가 몇명 되지 않는다면 문제가 없지만, 대용량의 데이터베이스를 다루고 수많은 사용자가 사용하는 사이트라면 아무리 좋은 컴퓨터라고 해도 수많은 프로세스가 실행되고 죽는 과정에서 남아날 재간이 없다.

    • Servlet이란
    - CGI의 문제점을 해결하기 위해 많은 규약들이 등장하게 되었는데 Java에서 Servlet이라는 기술을 내놓았다.Servlet의 뜻은 server에서 돌아가는 applet 이라는 말이다. Servlet은 멀티쓰레딩을 이용하기 때문에 요구가 많아 지더라도 CGI보다 부하가 적고 빠르다.

    - 서버에서 수행되는 소형 프로그램으로 서버에 상주하는 프로그램을 deamon이라 한다.

    Etc...



    댓글 없음:

    댓글 쓰기

    태그