Header

Spring Framework 란? ( 스프링과 스프링 부트 차이 )

Spring Framework 란? ( 스프링과 스프링 부트 차이 )



Spring Framework란?


가장 대중적인 응용 프로그램 개발 프레임워크입니다.

의존성주입(DI), 제어의 역전(Ioc), 관점 지향 프로그래밍(AOP)가 주요 특징입니다. 이를 통해 SW의 결합도를 낮추는 방향으로 프로그램을 개발할 수 있습니다. 또한 이로인해 단위테스트가 용이해집니다. 

모든 기능을 종합제공하는 경량화 솔루션입니다. 대규모 데이터 처리 및 트랜젝션이 동시에 여러 사용자에게 행해지는 큰 규모의 환경을 개발할 때 적합합니다. 

경량 컨테이너로 자바 객체(Bean)을 직접 담고 관리합니다. 객체 생성, 소멸 등의 라이프사이클을 직접 관리하며 Spring 컨테이너로부터 필요한 객체를 가져와 사용합니다.




IoC ( 제어의 역전 )



일반적인 프로그램은 

객체 생성 -> 의존성 객체 생성 -> 객체 내 메소드 호출

이를 통해 객체들이 프로그램 흐름을 결정하고 객체 구성에 직접 참여합니다. 즉 사용자가 프로그램을 제어합니다.


하지만 Ioc의 경우 역입니다. 자기가 사용할 객체를 선택하지 않을 뿐더러 자신이 어디서 만들어지고 사용되는지 모르게 됩니다. 권한을 다른 대상에 위임함으로 제어권한은 특별 객체에 의해 만들어집니다.




AOP ( 관점 지향 프로그래밍 )


 


 아주 강력한 기능입니다. 관점이 키 포인트입니다. 기존 프로젝트에 로깅이나 보안을 설정하고 싶을 때, 기존 로직에는 수정을 가하지 않고 AOP를 활용하여 추가가 가능합니다. 호출 직전이나, 메소드 리턴 직후, 예외가 발생할 경우 등 여러 상황에서 사용이 가능합니다.


대부분 소프트웨어 개발 프로세스에서 사용하는 방법은 OOP(Object Oriented Programming) 입니다. 

OOP는 객체지향 원칙에 따라 관심사가 같은 데이터를 한곳에 모아 분리하고 낮은 결합도를 갖게하여 독립적이고 유연한 모듈로 캡슐화를 하는 것을 일컫습니다. 


하지만 이러한 과정 중 중복된 코드들이 많아지고 가독성, 확장성, 유지보수성을 떨어 뜨립니다. 이러한 문제를 보완하기 위해 나온 것이 AOP입니다.




 무분별하게 중복되는 코드를 한 곳에 모아 중복 되는 코드를 제거 할 수 있어지고 공통기능을 한 곳에 보관함으로써 공통 기능 하나의 수정으로 모든 핵심기능들의 공통기능을 수정 할 수 있어 효율적인 유지보수가 가능하며 재활용성이 극대화시킵니다.




DI ( 의존성 주입 )


 의존성 주입이란 객체가 서로 의존하는 관계가 되게 하는 것입니다. 하나의 객체가 어떠한 다른 객체를 사용하고 있음을 의미합니다. 


Ioc 프레임워크에서의 DI란 각 클래스 사이에 필요로 하는 의존 관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것입니다.


DI 없을 경우
@RestController

public class MyController {

    private MyService service = new MyService();



    @RequestMapping("/welcome")

    public String welcome() {

        return service.retrieveWelcomeMessage();

    }

}

 

DI 있는 경우
@Component

public class MyService {

    public String retrieveWelcomeMessage(){

       return "Welcome to InnovationM";

    }

}

@RestController

public class MyController {

    @Autowired

    private MyService service;



    @RequestMapping("/welcome")

    public String welcome() {

        return service.retrieveWelcomeMessage();

    }

}

Component와 Autowired를 통해 결합도를 쉽게 낮출 수 있습니다.


@Component : 스프링의 BeanFactory라는 팩토리 패턴의 구현체에서 bean이라는 스프링프레임워크가 관리하는 객체가 있는데 해당 클래스를 그러한 bean 객체로 두어 스프링 관리하에 두겠다는 Annotation.
@Autowired : 스프링 프레임워크에서 관리하는 Bean 객체와 같은 타입의 객체를 찾아서 자동으로 주입해주는 것. 해당 객체를 Bean으로 등록하지 않으면 주입해줄 수 없다.

 

다음과 같은 기능을 통해 MyService에 대한 bean을 생성하고 (Component 어노테이션을 통해) MyController에 있는 service 변수에 대입하게 됩니다.




스프링에 대해 간단 설명


스프링은 어플리케이션 개발을 하는데 결합도를 낮추는 방향의 개발방법을 제공함으로 인해 더욱 쉬운 개발이 가능해집니다. ( DIspatcher Servlet, ModelAndView 등등)




여기서 DAO는 데이터베이스 접근 객체로 DB와 연결됩니다.

Controller는 Servlet입니다.

Servlet을 통해 동적 웹 개발이 가능해집니다.


Model

Model에서는 데이터처리를 담당하는 부분입니다. Model부분은 Serivce영역과 DAO영역으로 나누어지게됩니다.
Model에서는 View와 Controller 어떠한 정보도 가지고 있어서는 안됩니다.

Controller

Controller에서는 View에 받은 요청을 가공하여 Model(Service 영역)에 이를 전달한다. 또한 Model로 부터 받은 결과를 View로 넘겨주는 역할을 합니다. Controller에서는 모든 요청 에러와 모델 에러를 처리하며 View와 Controller에 정보를 알고 있어야합니다.


Model의 Service영역은 자신을 어떠한 Controller가 호출하든 상관없이 정해진 매개변수만 받는다면 자신의 비즈니스 로직을 처리할 수 있어야합니다.
즉, 모듈화를 통해 어디서든 재사용이 가능하여야 한다는 뜻입니다.
 

스프링 부트의 필요성



현재 모든 기능을 다 갖춘 스프링을 통해 개발하면서 Transaction, DataSource, Entity, Session 등을 설정하는데 많은 어려움이 있고 Spring Mvc를 사용하여 세팅하는데 많은 시간이 걸립니다.


 

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/views/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

<mvc:resources mapping="/webjars/**" location="/webjars/"/>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/my-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>


 

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="${db.driver}" />
    <property name="jdbcUrl" value="${db.url}" />
    <property name="user" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

해당 이슈는 스프링부트의 자동설정을 통해, 모든 내부 디펜던시를 관리할 수 있습니다. 따라서 스프링부트를 사용할 경우 단지 어플리케이션만 실행하면 됩니다. 예를 들어, Hibernate jar가 classpath에 존재한다면 dataSource로 자동설정됩니다. 그 외에 미리 설정된 Starter 프로젝트를 제공해줍니다. Starter는 편리한 dependency 세트입니다. Spring과 Hibernate를 사용하기 위해선 spring-boot-starter-data-jpa의존성만 추가하면 됩니다. 


스프링 프로젝트의 의존성 관리
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>4.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.0.2.Final</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

 

스프링 부트 프로젝트의 의존성 관리
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

위의 의존성 추가를 통해 여러가지 패키지들을 자동으로 불러오게 됩니다. (jdbc, annotation, handler, bind, logging, tomcat 등등) 따라서 dependency 관리 및 호환성을 생각할 필요가 없습니다.





댓글 쓰기

0 댓글