Spring Framework 란? ( 스프링과 스프링 부트 차이 )
Spring Framework란?
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 : 스프링의 BeanFactory라는 팩토리 패턴의 구현체에서 bean이라는 스프링프레임워크가 관리하는 객체가 있는데 해당 클래스를 그러한 bean 객체로 두어 스프링 관리하에 두겠다는 Annotation.
@Autowired : 스프링 프레임워크에서 관리하는 Bean 객체와 같은 타입의 객체를 찾아서 자동으로 주입해주는 것. 해당 객체를 Bean으로 등록하지 않으면 주입해줄 수 없다.
다음과 같은 기능을 통해 MyService에 대한 bean을 생성하고 (Component 어노테이션을 통해) MyController에 있는 service 변수에 대입하게 됩니다.
스프링에 대해 간단 설명
스프링은 어플리케이션 개발을 하는데 결합도를 낮추는 방향의 개발방법을 제공함으로 인해 더욱 쉬운 개발이 가능해집니다. ( DIspatcher Servlet, ModelAndView 등등)
스프링 부트의 필요성
현재 모든 기능을 다 갖춘 스프링을 통해 개발하면서 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>
스프링 프로젝트의 의존성 관리
<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>
0 댓글