[Spring] 스프링 프레임워크란?

서양갱·2021년 11월 18일
0

스프링이란?

자바 엔터프라이즈 개발을 편리하게 해주는 오픈소스 경량급 어플리케이션 프레임워크

어플리케이션 프레임워크

특정 계층이나 기술, 업무 분야에 국한되지 않고 전 영역을 포괄하는 범용적인 프레임워크
개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 둡니다.

일반적으로 라이브러리나 프레임워크는 특정 업무 분야나 한 가지 특화된 목표를 가지고 만들어졌습니다.

전 영역에 일관된 프로그래밍 모델을 제공해, 개발을 편리하게 해주는 프레임워크

경량급

코드에 불필요하게 등장하던 프레임워크와 서버환경에 의존적인 부분을 제거해주기 때문에 경량급이라고 칭합니다.

Spring 은 EJB의 단점을 보안해서 나온 프레임워크
이전, EJB(Enterprise JavaBeans)의 경우, spring과 같이 분산 처리, 트랜잭션, ORM인 Entity Bean까지 다양한 기능을 제공

하지만, 하나의 기능을 구현하기 위해 클래스간 상속, 인터페이스의 구현 등 클래스 간 의존도가 커지는 상황이 생김

EJB 의 단점

  • 설정의 어려움
  • 비즈니스 로직에 특정 기술이 종속 됨
  • EJB의 동작을 위해서, 무거운 자바 서버(WAS) 가 필요
  • 고가의 제품으로 구성된 개발환경에서만 개발 가능

그로인해, POJO (Plain Old Java Object) 인, 일반 자바 클래스를 활용해 단순하지만 EJB에서 제공했던 기술들을 제공하는 Spring을 창시합니다.

스프링 주요 특징

컨테이너 역할을 수행

스프링 컨테이너는 객체의 사이클을 관리하고, 컨테이너로부터 필요한 객체를 가져와 사용 가능

의존성 주입 ( DI : Dependency Injection )

객체가 의존하는 또 다른 객체를 외부에서 선언하고 이를 주입받아 사용하는 것

public class PetOwner{
	private AnimalType animal;
    
    public PetOwner(){
    	this.animal = new Dog();
    }
}

PetOwner는 AnimalType에 의존성을 가짐
생성자를 통해 Dog 객체를 생성했기 때문이다.

이 경우, 의존성의 위험함이 따라온다.

  • Tight Coupling이 생기며, AnimalType 객체 변경 시, PetOwner 객체도 변경된다.
  • 하나의 모듈이 변경되면 의존한 다른 모듈까지 변경되어야 한다.
  • Unit Test 작성에 어려움이 생긴다.

의존성을 줄이기 위한 방법

  • setter Injection

    • setter 메소드를 통해 의존관계에 있는 객체 주입
    • property 태그를 통해 의존관계에 있는 bean을 주입
  • Construction Injection

    	- 생성자를 통해 의존관계에 있는 객체 주입
    • constructor arg 태그를 통해 의존관계에 있는 객체를 생성자를 통해 주입

예시

package Coffe;

public class Employee {
	
	public Coffee coffee;
	public Employee(Coffee coffee) {
		this.coffee = coffee;
		
	}
	public void takeout() {
		coffee.howmuch();
		
	}
}

현재 Employee는 Coffee와 의존성이 존재하며, 생성자를 통해 의존관계를 주입받고 있다.

package Coffe;

public interface Coffee {
	public void howmuch();
		
}
package Coffe;

public class Americano implements Coffee{
	String price;
	
	public void setPrice(String money) {
		this.price = money;
		
	}
	
	public void howmuch() {
		
		System.out.println("아메리카노의 가격은 " + price);
		
	}
	
}
package Coffe;

public class latte implements Coffee{
	String price;
	
	public void setPrice(String money) {
		this.price = money;
		
	}
	
	public void howmuch() {
		
		System.out.println("라떼의 가격은 " + price);
	}
}

다음과 같이 Coffee를 상속 받는 Latte, Americano 클래스가 생성되었다.

applicationCtx.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="americano" class="Coffe.Americano">
		<property name = "price"  value = "1000"> </property>
	</bean>
	
	<bean id="latte" class="Coffe.latte">
		<property name = "price"  value = "3000"></property>
	</bean>
	
	<bean id = "employee" class = "Coffe.Employee">
		<!-- 내가 먹고 싶은 커피 객체를 지정한다. -->
		<constructor-arg ref = "americano"></constructor-arg>
		 
	</bean>
</beans>  

위와 같이 xml을 통해서 americano, latte 객체를 생성하며 employee객체에 constructor-arg 태그를 통해서 americano 객체를 생성자를 통해 의존성 주입을 해준다.

@Autowired
스프링에서 DI를 위해 사용되는 어노테이션이다.
Bean 인스턴스가 생성된 후, @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입된다.
@Autowired는 변수, Setter, 생성자, 일반 메서드에 적용 가능하며, property, constructor-arg 태그와 동일 역할을 한다.

관점 지향 프로그래밍 ( AOP : Asepct-Oriented Programming )

트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리한다.

개발자가 비즈니스 로직에만 집중 가능하게 해준다.

POJO 지원 ( POJO : Plain Old Java Object )

객체간의 관계를 구성할 때, 일반적인 Java 코드를 이용해 객체를 구성할 수 있음
객체 구성시, 특정 인터페이스를 구현하거나, 특정 클래스 상속 미필요

스프링 프레임워크 구조

0개의 댓글

관련 채용 정보