728x90

[Spring 이해하기 5] Spring Bean (스프링 객체)

 

 

[1] Spring Bean이란?

: Spring Framework가 관리하는 클래스의 인스턴스(Instance)를 Spring Bean이라 함
: Spring Bean 인터페이스와 클래스 POJO(Plain Old Java Object)로 정의됨

 

 

1. Spring Bean 생성

  • XML 설정 파일
    <bean id=”serviceImpl” class=”com.dongjoo.ex.service.impl.ServiceImpl”>

    • id - Atrribute: Bean 식별자
    • class - Atrribute Bean 객체의 구현 클래스 타입의 전체 경로

  • @Configuragtion 설정 클래스
    @Configuration
    public void AppConfiguration(){}​
  • 빈 설정 - @Bean 어노테이션이 붙여진 메소드로 정의 
    //ServiceImpl(클래스)의 객체를 반환
    @Bean
    ServiceImpl serviceImpl(){
    	return new ServiceImpl();
    }
    
    //Service(인터페이스)를 구현한 ServiceImpl 객체를 반환
    @Bean
    Service serviceImpl(){
    	return new ServiceImpl();
    }
    • 메소드 이름: 빈 객체 명
    • 메소드 리턴 타입: 빈 객체의 타입
    • 빈 메소드: 빈 객체 구현 클래스의 인스턴스를 반환

 

  •  

2. IoC Container
: 빈 생성관리, 인스턴스 의존성 관리를 담당한다
: Spring Bean의 인스턴스를 생성하기 위해서는 먼저 생성된 Bean 인스턴스를 관리하는 IoC Container가 필요하다

  • ApplicationContext 인터페이스
    : IoC Container를 표현함

  • Application Context
    : IoC container를 자체를 의미함

 

 

3. Application context 생성 방법

  • ClassPathXmlApplicationContext 클래스
    ApplicationContext ctx = new ClassPathXmlApplicationContext(“servlet-context.xml”);
    • servlet-context.xml
      : Java CLASSPATH에서 지정된 설정 파일


  • FileSystemXmlApplicationContext 클래스
    ApplicationContext ctx = new FileSystemXmlApplicationContext(“src/servlet-context.xml”);
    • servlet-context.xml
      : 파일 시스템의 절대 경로 및 상대 경로로 지정된 설정 파일

  • AnnotatonConfigApplicationContext 클래스
    ApplicationContext ctx= new AnnotationConfigApplicationContext(AppConfiguration.class);​
     
    •  AppConfiguration.class
      : Spring Bean 설정 클래스

  • Bean 호출(Call)
    Service service = (Service)ctx.getBean(“service”);
    • Service(인스턴스)의 빈을 가져온다.
    • Spring Bean 클래스는 항상 매개변수가 없는 디폴트 생성자를 요구한다. "구현 해야 된다"

 

4. Bean Scope (영향 범위)
:
Spring Bean 인스턴스가 생성될 때 생성되는 Scope를 설정 가능

  • singleton
    : ApplicationContext 컨테이너당 하나의 인스턴스 생성 - "default"

  • prototype
    : getBean()메소드가 호출될 때마다 하나의 인스턴스 생성

  • request
    : HTTP request 범위 안에서 인스턴스 생성

  • session
    : HTTP Session 범위 안에서 인스턴스 생성

  • global-session
    : 전역 HTTP session 범위 안에서 인스턴스 생성
    //xml
    <bean id=”service” class=”com.dongjoo.ex.service.Service” scope=”prototype”>
    
    //java
    @Bean
    @Scope(“prototype”) //parameter(범위) 변경하여 사용가능
    Service service(){
    	return new Service();
    }
     

 

 

5. Bean의 Life Cycle(생명주기)

: 일반 Java 클래스의 인스턴스를 생성할때 생성자(Constructor)가 호출되고 소멸될때 소멸자 (Finalize)가 호출된다
: Spring Bean도 생성과 소멸의 메소드를 지정할 수있다. 

  • init-method
    : 인스턴스 초기화시 호출되는 메소드 

  • destroy-method
    : 인스턴스 소멸시 호출되는 메소드
    <bean id=”service” class=”com.dongjoo.ex.service.Service” scope=”prototype”
    init-method=”init” destroy-method=”destroy”/>
  • Factory Method Pattern(팩토리 메소드 패턴): Bean을 생성해주는 Factory를 활용  "주로 Singleton 인스턴스 생성시 사용"
    //xml - Bean 인스턴스 생성
    <bean id=”service” class=”com.dongjoo.ex.service.impl.ServiceImpl” factory-method=”getInstance”/>
    
    //클래스
    public class ServiceImpl implements Service{
    	private ServiceImpl(){}
    
    	private Static class FactoryHolder{
    		static Service instance = new ServiceImpl();
    	}
    
    	private static Service getInstance(){
    		return FactoryHolder.instance;
    	}
    }
    • Spring Bean은 default가 Singleton 객체로 생성되기 때문에 사실상 선언이 그닥 별로 필요없다.

 

 

6. Spring Bean vs Java Bean

  • Spring Bean
    : IoC Container, application context 안에서 생성 및 관리되는 Java 클래스의 인스턴스 - "IoC Container 내부에 존재"

  • Java Bean
    : IoC Container, application context에서 관리되지 않고 외부에서 new 연산자를 사용하여 인스턴스를 생성하는 빈 - "IoC Container 외부에 존재"

 

: java 클래스의 인스턴스(instance)를 모두 Spring Bean으로 만들수 있지만 Service Layer, Repository Layer에 포함되는 클래스만하는 것을 권장한다 

 

      "Spring Bean 클래스로 사용하면 IoC Container에 과 부하(Over Load) 방지"

      "Domain 클래스(DTO), Mode클래스, Entity클래스 는 Spring Bean으로 만들자"

 

 

728x90
728x90

[Spring 이해하기 4] Dependency Injection (Spring 삼각형 1 - 의존 주입)

 

 

[4] Dependency 

 

1. Dependency Problem

System 개발의 크게 두 가지 어려움이 있다. 첫 번째는 시스템의 여러 구성 요소들의 연결 복잡성이고, 두 번째는 요구사항이 변경될 때 프로그램을 수정하기 어려움이다. 

 

System은 여러 클래스로 구성되어 있고 의존성(dependency)이 매우 강하다  "Tightly Coupling"

B가 A에 의존한다 (출처: scientecheasy)

      "A클래스에서 B클래스의 객체를 생성하여 사용하는 것을 ‘의존한다’고 하는데 이에 대한 문제점은 B클래스가 변경 되면 A클래스 역시 변경되어야 하기 때문이다."

이러한 의존성들을 제거하는 것이 System의 연결 복잡성과 변경의 어려움을 극복하는 데 가장 중요하다.

 

 

  • 의존성 제거 방법 - "의존 주입(Dependency Injection) 의 필요성"
    • 인터페이스의 도입
      • A 클래스와 B 클래스 사이에 인터페이스(interface)를 두어 직접적인 의존성을 제거하여 느슨한 관계를 만든다 - "loosely-coupling"

      • 인터페이스(interface)를 변경하지 않는 범위에서 B 클래스 변경해도 A 클래스에 영향을 주지 않는다

      • 하지만 A 클래스에서 B 클래스의 인스턴스(instance)를 생성하는 것은 여전히 의존적이다 - "인스턴스 생성을 제거해야 의존성을 제거 할 수 있다"

      • A 클래스의 인스턴스(instance)가 생성될 때, B 클래스의 인스턴스(instance) 역시 A에 저장(주입,injection )되어야 한다 

      • 또한 A 클래스의 인스턴스를 생성하기 위한 별도의 클래스가 필요하다.

              "의존 주입(Dependency Injection) 필요" 

 

 

2. Dependency Injection(DI, 의존 주입)
: Spring Framework 에서는 IoC Container을 통해 외부에서 객체(Object)를 생성하여 필요한 클래스(Class)에 주입(Injection)하므로써 의존성(Dependency)을 만들 수 있다
: Spring Triangle로 불리 울 정도로 주요한 기능이다.

       "Spring Framework를 포함하는 대부분의 Application Framework는 IoC Container를 제공한다"

      "DI를 통해 Framework가 Code를 제어하는 IoC(Inversion of Control, 제어의 역전)를 가능하게 한다"

Spring Triangle

  • IoC Container
    : SW System에 포함되어 있는 모든 클래스(구성 요소)의 인스턴스를 관리하고 이들 인스턴스 사이의 의존성을 주입하는 역할을 하는 SW의 구성요소

 

 

728x90
728x90

[Spring 이해하기 3] Framework란?

 

 

[3] Framework란?

: 소프트웨어의 특정한 클래스에 대하여 재 사용할 수있는 설계로 구성된 클래스의 집합이다.  "재 사용"

: 프레임워크는 설게를 추상적인 클래스로 분리하고 그들의 관계를 정의함으로써 아키텍처적인 가이드를 제공  "Abstraction"

 

"개발자는 Framework로부터 추상적인 클래스를 구성하여 Application에 서브 클래스들을 생성함으로써 Application에 대한 Framework를 커스터마이징 할 수 있다"

 

 

1. Framework 장점(Pros)

  • 모듈화(Modularization)
    : 인터페이스 뒤에 은닉시키는 캡슐화를 활용한 구현을 통해 모듈화를 강화한다. 프레임워크의 모듈화는 설계 및 구현 변경의 영향을 최소화하면서 Code Quality를 높인다.


  • 재 사용성(Reusability)
    : 프레임워크의 인터페이스를 통해 반복적으로 사용되는 컴포넌트를 정의함으로써 재사용성을 높인다.

          "재 개발과 그에 대한 유효성검사를 회피가능 및 개발 생산성을 높인다"


  • 확장성(Extensibilty)
    :프레임워크의 다형성을 통해 인터페이스를 확장할수 있다. 확장성은 커스터마이징의 필수사항이고 이를 통해 어플리케이션의 가변성을 분리 가능하다.

 

 

 

2. Framework IOC(Inversion Of Control)

  • IOC(Inversion Of Control, 제어의 역전)
    : Framework 에서 Application Code로 제어 흐름이 이동한다
    : 프레임워크 코드가 전체 어플리케이션의 Process Flow을 제어(Control)하고, 이벤트 발생 시 다형성을 통해 어플리케이션이 확장한 메소드를 호출하면서 제어(Control)가 프레임워크로부터 어플리케이션으로 거꾸로 흐르게 한다.

          "개발자 마음대로 코드구현하는 것이 아니라, Framework에 맞추어 Code를 생성하여 Application을 만든다."

 

 

 

3. Framework 형성 순서
: 가이드라인 -> 패턴 -> 템플릿 -> 프레임워크

  • 가이드라인(Guideline)
    : 첫 개발의 지침


  • 패턴(Pattern)
    : 가이드라인을 경험에 의해 형식화한 것
    : 반복적인 문제들을 설명하고 그에 대한 방안의 핵심을 설명한 것


  • 템플릿(Template)
    : 패턴 적용을 자동화 한 것


  • 프레임워크(Framework)
    : 템플릿을 컴파일된 형식으로 발전시킨 것

 

 

 

4. Framework 기반 Application

  • 어플리케이션 레이어(Application Layer) 종류
    • 도메인 프레임워크(Domain Specific F/W)
      • 특정한 비즈니스 도메인을 대상으로 하는 프레임워크 컴포넌트로 구성됨
      • 특정한 비즈니스 도메인의 모든 어플리케이션에 공통된 비즈니스 지식을 구현

    • 범용 프레임워크(cross-domain framework)
      • 비즈니스 도메인과 관계없이 대부분의 어플리케이션에서 공통으로 발견될 수 있는 컴포넌트와 서비스로 구성됨
      • Struts, Spring, Spring.Net, Entity Framework(Microsoft) 가 존재 함 

 

  • 프레임워크 레이어(Framework Layer) 종류
    • 어플리케이션 프레임워크 레이어(Application framework layer)


    • 시스템 프레임워크 레이어(System/Foundation Framework layer)
      : 어플리케이션과 어플리케이션 프레임워크에 프로그래밍 모델 제공
      ex. .Net(Microsoft) , COM/DCOM, J2EE(SUN), CORBA(OMG)

 

 

 

5. Framework Development
: 프레임워크의 개발은 대상 어플리케이션에서 공통성(Commonality)과 가변성(Variability)을 분석하는 것

 

  • Common Spot
    : 공통성이 반복해서 나타나는 위치
    : Application 중 하나의 기능구성이 반복된다면 개발자는 어플리케이션으로부터 Common Spot을 추출하여 프레임워크 레이어에 있는 Component로 패키징할 수 있음

    • Framework' Common Spot
      : 코드의 재사용성 향상
      : 프레임워크 컴포넌트에서 구현됨

  • Hot Spot
    : 어플리케이션에서 가변적인 위치
    : Framework를 커스터마이징 할 수 있는 위치
    : Hot Spot어플리케이션이 커스터마이징하여 채워지도록 비워둔다. 
    :
    고유 기능을 Hot Spot에 구현하면서 프레임워크가 각 어플리케이션 마다 서로 다른 Action을 하게 함

    ex. SAP - Userexit, Jave - Abstract Extends, Implementations

 

 

6.  Framework의 종류

  • 화이트 박스 프레임워크(White-Box Framework)
    :
    추상 클래스로 구성된다. 

    • Hook Method
      : 추상 클래스(Abstract Class)의 메소드들 중 자식클래스(Child Class)에서 구현되는 메소드로써 애플리케이션 고유의 로직을 구현하는 Hot Spot 역할 

    • Template Method
      : 추상 클래스(Abstract Class)의 메소드들 중 자식클래스(Child Class)에서 구현되지 않은 메소드로써 특정 작업의 프로세스 흐름을 기술하는 Common Spot 역할


            "구현은 쉽지만 유연성이 부족"
            "템플릿 메소드에 프로세스가 고정되어 있다"
            "프로세스를 변경할 때 프레임워크의 해당 컴포넌트를 변경 시키거나 아예 새로운 컴포넌트를 새로 개발필요"
            "개발자만 알고있다"

 

 

  • 블랙 박스 프레임워크(Black-Box Framework)
    : 화이트 박스 프레임워크의 문제점을 해결하기 위해 Hot Spot 을 인터페이스로 구현한 F/W
    : Common Spot은 매개 변수로 Hot Spot의 인터페이스를 받는 방식으로 구현됨


    "블랙 박스 프레임워크는 세부사항을 은닉시키는 컴포넌트로 구성되어있기에 내부 코드를 알 필요가 없다"
    "개발하기 어렵지만 유연성이 좋다"

 

 

  • 그레이 박스 프레임워크(Gray-Box Framework) 
    : 화이트박스와 블랙박스의 장단점을 합쳐 적용
    : 블랙 박스 구현의 어려움 및 화이트 박스의 유연성 부족 극복

    • 인터페이스를 구현한 클래스에서 프레임워크의 디폴트 기능(Hot Spot)이 구현 된다.
      또한 이 메소드를 재정의하는 클래스를 만들어 또 다른 Hot Spot을 사용가능

    • Common Spot을 정의한 클래스에서 인터페이스를 구현한 클래스(impl.java)를 Aggregation하여 프레임워크의 공통성을 제어 가능

 

728x90
728x90

[Spring 이해하기 2] Spring Framework & 관리 도구 개요

 

 

[2] Spring Framework 개요

: 2002, Java 플랫폼을 위한 Application Framework으로 출시  "Open Source"

 

1. Spring Framework  모듈 구성

  • Core Container
    : IOC(Inversion Of Control)와 DI(Dependency Injection) 제공

  • Web
    : Spring MVC와 Spring Mobile 지원

  • Data Access/Integration
    : 데이터베이스 접속을 위한 JDBC와 ORM(JPA,Hibernate) 프레임워크 및 JPA 통합 방법을 제공

  • Spring Security
    : 인증과 권한 등의 보안 기능 제공

  • Spring Web Services
    : SOAP, API, Rest 등의 웹 서비스를 제공

  • Spring For Android
    : 안드로이드 App 개발을 위한 Spring Framework의 확장 기능 제공


2. 개발 기본 도구 

 

  • 프로젝트 관리 도구

    - Apache Ant
    : 2000, Java 프로젝트 빌드 도구로써 프로젝트를 자동으로 빌드하고 서버에 배포하는 과정을 자동화 시켜주는 기능을 제공, Apache Ivy를 통합을 통해 네트워크상에서의 의존성 관리 기능을 제공

    - Apache Maven
    : 2004, Ant의 단점(작업 수행시 모든 명령을 작성)을 극복하기 위해 Maven은 작업 대상 제공을 통해 호출만 하는 방식, 의존성을 갖는 모든 모듈들을 네트워크상에서 다운로드 가능

    - Gradle
    : 2012, XML(Ant, Maven)을 사용하지 않고 JVM 언어 중 하나인 Groovy를 기반으로 DSL(Domain Specific Language)를 언어로 사용 - "간단명확한 빌드 스크립트를 작성가능"

 

  • 테스트 자동화 도구
    : 테스트의 종류로는 단위 테스트(Unit test), 통합테스트(Integration test),시스템 테스트(System test), 인수 테스트(Acceptance test)등으로 구분 된다.


    "애자일 방법론 중 하나인 테스트 주도개발(TTD: Test-Driven Development)이 있을 정도로 테스트는 중요하다"


    - 단위 테스트(Unit test)
    : 특정 코드 단위(기능, function)가 제대로 동작하는지를 증명하기 위해 수행하는 테스트
    (단위기능에 대한 정합성, 결함 여부, 기능성 등을 테스트)
    ex). JUnit

 

728x90
728x90

[Spring 이해하기 1] Java Web Application

 

 


[1] Java EE Application 플랫폼
: 엔터프라이즈 애플리케이션 (웹 애플리케이션 관련 기술 표준사양 정의)

1. Java EE 플랫폼의 'Application Server"

  • 컨테이너 모델(Container Model) 제공
    : 컨테이너는 컴포넌트가 실행되는 환경
  • 컨테이너(Container)
    : 트랜잭션 관리, 보안, 상태 관리, 프로세스 및 스레드, 시스템 리소스 관리, 데이터베이스 연결 풀링 및 캐싱 등 엔터프라이즈 환경에서 요구되는 필수적인 서비스를 제공

    "개발자는 단순히 갖다 쓰면된다."
    "서술적 프로그래밍 모델 (Declare programming model: 코드를 작성하지않고 서술로 프로그래밍을 한다.)"

2. JAVA EE Application Server(WAS)
: 웹 컨테이너(Web Container)와 EJB 컨테이너(EJB Container)로 구성 됨

  • 웹 컨테이너(Web Container)
    : 웹 어플리케이션과 관련있는 것(웹 프로그래밍의 base)으로 서블릿과 JSP, JSF(Java Server Faces), Web service, 보안, request dispatching, 동시성(Concurrency), 라이프사이클 관리, 네이밍, 트랜잭션, 전자우편 등의 API를 포함하여 웹 컴포넌트가 사용할수 있게 도와준다.

    ex.)
    Tomcat

  • EJB 컨테이너(EJB Container)
    : EJB 컴포넌트, 엔터프라이즈 빈(bean)을 관리 및 구현하는데 사용되는 API를 포함한다.
    (대부분 Spring Framework로 대체 하여 쓴다.)

    ex.) WebLogic(Oracle), WebSphere(IBM), JBoss Application Server(Open source)

3. 클라이언트 시스템(Client System)
: 애플리케이션 클라이언트 컨테이너로 구성 됨

 

4. 웹 컴포넌트 (Web Component)
: 서블릿, JSP, JSF로 구현된 웹 페이지로 구현될 수 있다.

      "클라이언트가 웹서버에 HTTP요청을 보내고, 서블릿을 구현한 웹 서버는 이 요청을 HttpServletRequest 객체로 변환함"
      "이 객체는 웹 컴포넌트(Web Component)로 전달되어 자바 빈 컴포넌트나 데이터베이스와 연동되어 동적인 컨텐츠를 생성함"
      "웹 컴포넌트는 HttpServletResponse 객체를 생성하고, 웹 서버는 이 객체를 HTTP 응답으로 변환하여 클라이언트에게 전달함"

 

5. JSP(Java Server Page)

: HTML의 정적인 컨텐츠로써 서블릿의 동적인 컨텐츠 생성 기능을 포함하는 기술

  • JSP의 단순함(Pros)
    : JSP는 자동으로 서블릿으로 변환되고 정적인 HTML은 서블릿의 Service 메소드에서 출력 스트림으로 출력됨.
    : 이러한 변환은 JSP가 페이지가 처음 요청될 때만 수행되고 그 후부터는 컴파일된 JSP페이지가 실행되어 실행 속도를 빠르게 한다. "ASP.NET 탄생의 원동력"

  • 언어: JSP 스크립팅 언어를 사용한다. "JSP + Spring MVC 프레임워크를 가장 많이씀"

6. JPA(Java Persistence API)
: JAVA EE Application Server(WAS)가 Standard Persistence Solution이라 정의하고 있다.

  • Persistence(지속성)
    : 프로그램의 실행종료나 셧다운이 되도 State가 지속되는것을 말한다. (DB Insert & Update & Delete)

  • ORM(Object-Relational Mapping)
    : 객체 모델과 관계 모델 사이의 임피던스(impedence) 불일치(부정합)문제를 해결한다.

  • java EE & java SE환경 둘다 사용가능 

    ex.) Hibernate, EclipseLink, Apache OpenJPA, DataNucleus

 

[2] 웹 어플리케이션 아키텍처

1. Model 1
: 단순히 JSP(프레젠테이션 로직, 비즈니스 로직 혼합)와 JDBC만을 사용하여 웹 애플리케이션을 개발하는 방식
"작업 분리 및 유지보수가 어렵다"

 

 

2. Model 2

: MVC(Model View Controller)패턴을 웹 개발에 적용해 구현하는 방식.

  • Model
    : 사용자가 입력하거나 데이터베이스로부터 가져온 데이터를 관리하는 역할 "java bean"
  • View
    : 모델의 정보를 웹에 표시하고 사용자로부터 정보를 입력받는 역할 "view"
  • Controller
    : 비즈니스 로직을 구현하고 모델과 뷰를 통제하는 역할 "servlet"

3. Web Server & Web Application Server(WAS) - "미들 웨어"

  • 웹 서버(Web Server)
    : 웹 서버는 정적인 웹페이지만 처리(프레젠테이션 로직)
    ex. HTML, CSS, JavaScript, Jquery

  • Web Application Server(WAS)
    : 정적인 웹 페이지를 제외한 동적인 웹페이지와 비즈니스 로직, 데이터 액세스 로직 및 다른 조직의 애플리케이션 시스템과의 연동 등을 구현

  • 웹 서버와 WAS의 중간 단계
    : Web service, REST service, JMS(Java Message Service), Java RMI(Remote Method Invocation) 등의 기술로 상호 작용한다. ESB(Enterprise Service Bus)를 활용하여 서비스를 제공가능.


4. Layered Architecture (레이어 아키텍처)

  • Presentation Layer
    : Spring MVC와 JSP로 UI와 프레젠테이션 로직 구현

  • Service Layer
    : Spring과 Spring Web Services를 사용하여 서비스 제공 비즈니스로직 구현

  • Repository layer
    :DAO(Data Access Object)패턴을 이용한 Spring Data JPA, Hibernate, mybatis를 활용한 데이터 액세스 로직을 구현

  • Presentation layer 와  Service layer의 중간 단계
    : DTO(Data Transfer Object)패턴을 적용하여 데이터 전송을 위한 Domain 클래스 구현

  • Service layer와 Repository layer의 중간 단계
    : 데이터베이스 입출력 Entity 클래스 구현

 

 

5. 클래스 분리 (Class)
: 서비스의 내부구조 유출과 어노테이션의 중복을 막기 위해 클래스(Class)는 분리되어야한다. "보안성 강화"

  • Domain Class
    : Client와 Service layer 사이를 처리 "DTO 패턴 적용"

  • Entity Class
    : 데이터베이스로부터 입출력되는 Entity를 처리

  • Model Class
    : 데이터베이스의 테이블의 구조를 처리

 

728x90

+ Recent posts