ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Spring] Spring Framework란?
    Spring/개념 정리 2020. 4. 16. 18:45

    1. Spring Framework란?

    SpringFramwork(이하 스프링)란 요즘 Java 개발자라면 반드시 알아야할 표준 프레임워크로 자리잡았으며, 스프링은 다양한 영역에서 사용되고 있습니다. 

     

     Java를 사용해 앱을 개발할 때 Maven이나 Gradle과 같은 빌드 도구를 사용하게 되고, 이 빌드 도구의 특징은 의존 모듈 관리에 있습니다. Maven의 경우는 중앙 리파지터리라고 불리늕 서버로부터 필요한 Jar파일을 다운로드 받아 의존 모듈을 관리합니다. 

     

     스프링 개발팀은 스프링에 포함된 jar파일 및 스프링에서 필요로하는 jar파일을 하나의 파일로 묶어서 배포가힉 보다는, Maven 중앙 리파지터리를 통해서 스프링 모듈을 배포하고 있습니다. 이를 설명해주는 예로 아래와 같이 DI기능을 사용할 때 의존 설정을 Maven의 pom.xml파일에 추가해주면 됩니다. 

    <dependencies>
    	<dependency>
        	<groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
    </dependencies>

    이 Maven 설정을 통해 spring-context-5.2.5.RELEASE.jar 파일 및 spring-context 모듈이 의존하고 잇는 다른 모듈을 다운로드 받아 사용할 수 있는 것입니다.

     

     단, 스프링을 사용하기 위해서는 Maven의 의존 설정에 대한 이해가 요구되지만, 저는 Maven의 기초 사용법에 대한 지식은 따로 설명하지 않겠습니다. 혹시나 스프링을 사용하고자 하시는 분은 Maven 기초사용법에 대한 학습을 미리 하시는 것을 추천드립니다. 

     

    2. Spring Framwork의 주요 모듈

    스프링은 제공하는 기능에 따라 별도의 모듈로 분리되어 있으며, 그 목록은 아래와 같습니다. 

    Module name Description 
    spring-beans 스프링 컨테이너를 활용해 객체를 생성
    spring-context 객체 생성, 라이프 사이클 처리, 스키마 확장 등의 기능 제공
    spring-aop

    AOP 기능을 제공.

    (AOP = Aspect Oriented Programming) 

    spring-web

    웹 개발에 필요한 기능을 제공. 

    ex) REST 클라이언트, 데이터 변환처리, 파일 업로드 지원 등

    spring-webmvc 스프링 기반 MVC 프레임워크. 웹 어플리케이션 개발에 필요한 Model, View, Controller 구현을 제공.
    spring-websocket 스프링 MVC에서 웹 소켓 연동을 처리할 수 있도록 한다.
    spring-oxm XML과 Java 객체 간의 맵핑을 처리하기 위한 API 제공
    spring-tx 트랜젝션 처리를 위한 추상 레이어 제공.
    spring-jdbc 손쉬운 JDBC 프로그래밍을 위한 템플릿 제공.
    spring-orm 하이버네이트, JPA, Mybatis 등과의 연동을 지원.
    spring-jms JMS 서버와 메시지를 쉽게 주고 받을 수 있도록 하기 위한 템플릿. 
    spring-context-support
    스케줄링, 메일발송, 캐시연동, 벨리시티 등 부가기능을 제공.

     

    3. Spring DI(의존주입)를 사용한 객체 생성

     스프링의 가장 기본적인 기능은 객체를 생성하고 초기화해 필요한 곳에 제공하는 것입니다. 이러한 것을 가능하게 하는데 가장 중요한 개념이 DI(Dependency Injection)이라는 설계 패턴입니다. 스프링은 기본적으로 DI를 깁나으로 동작하기 때문에, 스프링을 사용하기 위해서는 DI에 대한 이해가 필수라고 할 수 있습니다. 

     

    3-1 Dependency(의존)란?

     DI는 의존에 대한 설계 패턴이며, 의존한다는 것이란 특정 기능을 수행하기 위해 다른 클래스, 타입을 필요로 할 때를 말합니다. 타입에 의존한다는 것은 해당 타입의 객체를 사용한다는 것을 뜻합니다. DI를 사용하지 않는 경우로 의존 객체를 직접 생성하는 방식이 있는데, 이런 경우는 개발 효율을 낮출 수 있습니다. 

     

    3-2 DI의 활용

     DI는 의존 객체를 직접 생성하는 방법이 아닌 의존 객체를 외부로부터 전달받는 방식입니다. 스스로 객체를 생성하지 않고 외부에서 의존하는 객체를 주입한다는 것을 의미합니다. 이처럼 DI를 사용하면 다른 객체를 사용할 때와 같은 코드의 변경이 필요할 때 조립기의 코드만 수정하면 됩니다. 여기서 조립기는 스프링을 말하며, 이에 대한 내용은 추후 설명하겠습니다. 

     그리고 DI를 사용함으로써 생기는 또다른 장점은 의존하는 클래스의 구현이 완성되어 있지 않더라도 테스트가 가능하다는 점입니다. DI는 의존하는 객체를 외부에서 넣어주는 방식이기 때문에, 가짜 객체를 주입할 수있습니다. 이러한 점은 개발 효율의 향상을 가져다 줄 수 있습니다. 실제로 테스트 코드를 작성할 때 가짜 구현 객체를 많이 사용하며, 가짜 객체가 필요할 때마다 임의의 클래스를 만드는 것은 번거로운 일이기 때문에 간단한 코드로 가짜 구현 객체를 만들어주는 다양한 테스트 프레임워크가 존재합니다. 

     

    3-3 의존 객체 전달 방법 : 생성자 방식

    생성자 방식은 생성자를 통해서 의존하는 객체를 전달받는 방식이며 아래와 같이 구현할 수 있습니다.

    public class Camel {
    	private Aimal animal
    	
    	public Camel(Animal animal) {
    		this.animal=animal;
    	}	
    }
    

     

    생성자 방식의 장점은 객체를 생성하는 시점에 의존하는 객체를 모두 전달받을 수 있다는 점이 있으며, 전달받은 파라미터가 정상인지 확인하는 코드를 생성자에 추가할 경우 객체 생성 이후에는 객체가 사용 가능한 상태임을 보장할수 있습니다. 

     하지만 생성자 방식에서는 생성자에 전달되는 파라미터의 이름만으로는 실제 타입을 알아내기 힘드며, 생성자에 전달되는 파라미터의 개수가 증가할수록 코드의 가독성이 떨어진다는 단점이 있습니다.

     

    3-4 의존 객체 전달 방법 : 프로퍼티 설정 방식

    프로퍼티 설정 방식은 의존 객체를 전달받기 위해 메소드를 사용하는 방식이며 아래와 같이 구현할 수 있습니다. 

    public class Camel {
    	private Aimal animal
    	
    	public setAnimal(Animal animal) {
    		this.animal=animal;
    	}	
    }
    

    프로퍼티 설정 방식에서는 set 메소드를 주로 사용하며, 이것은 Java Bean의 영향을 받기 때문입니다. 

     프로퍼티 설정 방식의 장점은 어떤 의존 객체를 설정하는지 메소드의 이름만으로 알 수 있다는 점입니다. 

     하지만 객체를 생성한 후 의존 객체가 모두 설정되었다고 보장할 수 없기 때문에 사용 불가능 상태일 수 있다는 단점이 있습니다. 

     

    4. 스프링과 DI 컨테이너

     앞서 DI는 스프링의 핵심 기능 중 하나라고 설명했습니다. 스프링은 객체를 생성하고 각 객체를 연결해주는 조립기의 역할을 수행합니다. 자세한 설명은 아래의 코드를 통해 하겠습니다.

    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.GenericXmlApplicationContext;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String config ="classpath:applicationCtx.xml";
    		AbstractApplicationContext ctx = new GenericXmlApplicationContext(config);
    		Animal animal = ctx.getBean("animal", Animal.class);
    		animal.use();
    		
    		ctx.close();
    		
    	}
    
    }

     위 코드에서 GenericXmlApplicationContext 클래스는 조립기 기능을 구현한 클래스이며, 이 조립기에서는 생성할 객체가 무엇이고, 각 객체를 어떻게 연결하는지에 대한 정보는 XML파일(applicationCTX.xml)에 정의되어 있습니다. 

    GenericXmlApplicationContext클래스는 XML파일에 정의된 설정 정보를 일겅와 객체를 생성하고 각각의 객체를 연결한 뒤 내부적으로 보관하게됩니다.

     생성한 객체를 보관하기 때문에 스프링을 객체 컨테이너, 스프링 컨테이너라고도 부릅니다. 스프링 컨테이너가 생성해서 보관하는 객체를 스프링 Bean 객체라고 부르며, 이는 일반적인 Java 객체와 동일합니다. 스프링 컨테이너에 저장된 객체를 사용하고 싶을 경우 위 코드에서 사용한 getBean 메소드를 사용하게 됩니다. 

     

    4-1 스프링 컨테이너의 종류

     스프링 컨테이너의 종류로는 BeanFactory와 ApplicationContext 두가지 타입의 컨테이너가 있습니다. 

     BeanFactory 계열의 인터페이스만 구현한 클래스는 단순히 컨테이너에서 객체를 생성하고 DI를 처리해주는 기능만을 제공합니다. 하지만 스프링을 사용하는 이유는 DI 컨테이너 때문만은 아니기 때문에 다른 부가기능을 사용하려면 ApplicationContext 계열을 사용해야 합니다. 그렇기 때문에 BeanFactory 계열을 사용하기 보단 ApplicationContext 계열을 사용하는 것이 일반적입니다. 

     

    댓글

Camel`s Tistory.