스프링 프레임워크의 특징

yanju·2022년 12월 2일
0
post-thumbnail

스프링은 다른 프레임워크에 비해 다음과 같은 특징을 가진다.

  • 경량 컨테이너로서 자바 객체를 직접 관리한다. 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
  • 스프링은 Plain Old Java Object 방식의 프레임워크이다. 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
  • 스프링은 제어 반전(IoC : Inversion of Control)을 지원한다. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
  • 스프링은 의존성 주입(DI : Dependency Injection)을 지원한다. 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
  • 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원한다. 따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
  • 스프링은 영속성과 관련된 다양한 서비스를 지원한다. iBATIS나 하이버네이트 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
  • 스프링은 확장성이 높다. 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.

경량 컨테이너

스프링 자체가 가볍거나 작은 규모의 코드로 이루어진 것은 아니다.

스프링은 20여개의 모듈로 세분화되고 복잡하고 방대한 코드를 가진 프레임워크다.

경량화는 기존 Java EE 기술의 불필요한 복잡함에 반대되는 개념에서 시작된다.

EJB는 무거운 자바 서버(WAS)가 필요했고, 다루기 힘든 설정파일, 패키징, 불편한 배포의 단점이 있다.

스프링은 톰캣과 같ㅌ은 단순한 서버 환경에서도 동작하고, 단순한 개발환경으로도 엔터프라이즈 애플리케이션 개발하는데 충분하다.

또한 기존 EJB 등의 프레임워크에서 만든 코드에 비해 코드량이 적고 단순하다

POJO 방식의 프레임워크

  • EJB 예시
    File : HelloBean.java
    
    package tests;
    /**
     * Bean implementation class for Enterprise Bean: Hello
     */
    public class HelloBean implements javax.ejb.SessionBean {
    	private javax.ejb.SessionContext mySessionCtx;
    	/**
    	 * getSessionContext
    	 */
    	public javax.ejb.SessionContext getSessionContext() {
    		return mySessionCtx;
    	}
    	/**
    	 * setSessionContext
    	 */
    	public void setSessionContext(javax.ejb.SessionContext ctx) {
    		mySessionCtx = ctx;
    	}
    	/**
    	 * ejbActivate
    	 */
    	public void ejbActivate() {
    	}
    	/**
    	 * ejbCreate
    	 */
    	public void ejbCreate() throws javax.ejb.CreateException {
    	}
    	/**
    	 * ejbPassivate
    	 */
    	public void ejbPassivate() {
    	}
    	/**
    	 * ejbRemove
    	 */
    	public void ejbRemove() {
    	}
    	
    	public java.lang.String message;
    	
    	
          //business methods
    
          // all users can call getMessage()
          public String getMessage() {
              return message;
          }
    
          // all users can call setMessage() but only few users can set new message.
          public void setMessage(String s) {
        	
            // get  bean's caller using getCallerPrincipal()
            java.security.Principal principal = mySessionCtx.getCallerPrincipal();     
            java.lang.String  callerId= principal.getName();
    
            // check if  bean's caller is granted Mgr role
            boolean isMgr = mySessionCtx.isCallerInRole("Mgr");
    
            // only set supplied message if caller is "bob" or caller is granted Mgr role
            if ( isMgr || callerId.equals("bob") )
                message = s;
            else 
                message = "Hello";
          }
    
    }
  • 스프링 빈 예시
    @Configuration
    public class HelloConfiguration {
        @Bean
        public HelloController sampleController() {
            return new SampleController;
        }
    }

IOC 컨테이너

IOC 컨테이너는 스프링의 가장 중요하고 핵심적인 기능이다.

자바의 리플렉션을 이용해서 객체의 생명주기를 관리하고 의존성 주입을 통해 각 계층이나 서비스들간의 의존성을 맞춘다.

이러한 기능들은 주로 환경설정을 담당한는 configuration 파일에 의해 설정되고 수행된다.

의존성 주입

의존성이란 한 객체가 다른 객체를 사용할 때 의존한다고 한다.

아래 그림에서 Store 객체는 Pencil 객체를 의존한다.

public class Store {

    private Pencil pencil;

}

두 객체 간의 의존성을 맺어주는 것을 의존성 주입이라고 한다.

AOP 프로그래밍

스프링은 로깅이나 보안, 트랜잭션 등 핵심적인 비즈니스 로직과 관련이 없으나 여러 곳에서 공통적으로 쓰이는 기능들을 분리하여 개발해 실행 시에 서로 조합할 수 있는 AOP를 지원한다.

참고

https://ko.wikipedia.org/wiki/스프링_프레임워크

0개의 댓글