Spring 프레임워크 활용(1)

Hyunsoo Kim·2024년 5월 7일
0

스프링

목록 보기
1/13
post-thumbnail

KOTRA 강의를 기반으로 정리된 문서입니다.

Spring Framework

스프링 프레임워크 공식문서
스프링 프레임워크 깃허브

  • 스프링 프레임워크는 Java 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크다.
  • 프로그램을 가동하기 위한 기반 서비스는 프레임워크에서 제공하므로, 개발자는 어플리케이션 레벨 비즈니스 로직에만 집중할 수 있다.
  • spring 프레임워크가 configuration model을 제공하는 이유는 프레임워크가 대신 객체를 생성하여 개발자가 인터페이스와 구현클래스를 직접 객체생성하지 않기 위해서다. 다만, XML이나 Annotation을 통해 프레임워크가 생성해야 하는 클래스의 정보를 알려주긴 해야 한다.
  • 프레임워크가 생성한 객체를 Spring bean, Spring bean은 모두 Singleton Object이다.

특징

** 볼드체는 강의에서 직접 다루는 기술입니다.

  • Core technologies: dependency injection, events, resources, i18n(국제화 기능), validation, data binding, type conversion, SpEL, AOP(관점지향프로그래밍).
  • Testing: mock objects, TestContext framework, Spring MVC Test, WebTestClient.
  • Data Access: transactions, DAO support, JDBC, ORM, Marshalling XML.
  • Spring MVC and Spring WebFlux web frameworks.
    spring MVC : Synchronous & Blocking, Tomcat 엔진
    spring webflux: Asynchronous & Non-Blocking, Netty 엔진 (Event Loop 기능 제공)

cf) Synchronous: 순서 보장, Asynchronous: 순서가 보장되지 않음
cf) Blocking: 요청을 보낸 이후 응답이 올 때까지 기다림
cf) Non-Blocking : 요청을 보낸 이후 기다리지 않고 원래 수행해야 하는 일을 진행하기


IoC와 Spring DI

IOC 컨테이너

  • 스프링 프레임워크도 Bean Factory를 통해 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능을 제공하고 있다.

bean factory 관련 문서


(1) DI

  • 객체 간의 의존관계를 Bean 설정 정보를 바탕으로 프레임워크에서 자동으로 연결해주는 것이다.
  • 예를 들어 'A'라는 객체가 'B'를 호출할 때, B 객체를 생성하여 객체 레퍼런스를 A에 주입한다.
public class Hello {
	String name;
    Printer printer;
    
    public Hello() { }
    
    public void setName(String name){
    	this.name = name;
    }
    
    public void setPrinter(Printer printer) {
    	this.printer = printer;
    }
<bean id = "hello" class = "myspring.di.xml.Hello">
	<property name="name" vlaue ="Spring" />
    <property name="printer" vlaue ="printer" />
</bean>

<bean id="printer"
	class="myspring.di.xml.StringPrinter" .>

여기서 bean의 name="printer"public void setPrinter 메소드의 'setPrinter'를 지칭한다.

(2) Singleton

  • 싱글톤 패턴은 특정 클래스가 단 하나의 인스턴스를 생성하여 사용하기 위한 패턴이다.
  • 사용 이유: 커넥션 풀, 스레드 풀, 디바이스 설정 객체 같은 경우 인스턴스를 여러 개 만들게 되면 불필요한 자원을 사용하게 된다. 따라서 객체를 한 번만 생성하여 이를 공유하고 사용하기 위해 싱글톤 패턴을 사용한다.

의존관계 활용 전략

전략 1 : xml 파일 단독 설정

<!-- StringPrinter 클래스를 Spring Bean으로 지정 -->
	<bean id="strPrinter" class="myspring.di.xml.StringPrinter" />
	
	<!-- ConsolePrinter 클래스를 Spring Bean으로 지정 -->
	<bean id="conPrinter" class="myspring.di.xml.ConsolePrinter" />
	
	<!--  Hello 클래스를 Spring Bean으로 설정  -->
	<bean id="hello" class="myspring.di.xml.Hello" scope="singleton">
		<!--  setName("Spring")  -->
		<property name="name" value="Spring"/>
		<!--  setPrinter(new StringPrinter())  -->
		<property name="printer" ref="strPrinter"/>
	</bean>
  • 모든 bean을 명시적으로 xml에 등록하는 방법이다.
  • 생성되는 모든 bean을 xml에서 확인할 수 있다는 장점이 있으나, 개수가 많아지면 관리하기 번거로울 수 있다.
  • 여러 개발자가 같은 설정파일을 공유해서 개발하다 보면 충돌이 일어나기도 한다.
  • DI에 필요한, 적절한 setter 메서드 또는 constructor 가 코드 내에 반드시 존재해야 한다.

전략 2 : xml과 어노테이션 혼합 설정

@Component("helloBean")
public class HelloBean {
	
	@Value("어노테이션")
	String name;
	
	@Autowired
	@Qualifier("stringPrinter")
	PrinterBean printer;
	
	List<String> names;

	public HelloBean() {
		System.out.println(this.getClass().getName() + "Constructor Called..");
	}

	public HelloBean(String name, PrinterBean printer) {
		System.out.println(this.getClass().getName() + "Overloaded Constructor Called..");
		this.name = name;
		this.printer = printer;
	}

	public List<String> getNames() {
		return this.names;
	}

	public void setNames(List<String> list) {
		this.names = list;
	}


	public String sayHello() {
		return "Hello " + name;
	}

	public void print() {
		this.printer.print(sayHello());
	}

}
	<!--  Hello 클래스를 Spring Bean으로 설정  Constructor Injection-->
	<bean id="helloCons" class="myspring.di.xml.Hello" scope="singleton">
		<constructor-arg name="name" value="생성자Injection" />
		<constructor-arg name="printer" ref="conPrinter" />
		<property name="names">
			<list>
				<value>DI</value>
				<value>AOP</value>
				<value>MVC</value>
			</list>
		</property>
	</bean>
	
	<!-- Component Scanning -->
	<context:component-scan base-package="myspring.di.annot" />
	
	<!-- values.properties 파일 위치 설정 -->
	<context:property-placeholder location="classpath:values.properties"/>
  • Bean으로 사용될 클래스에 특별한 어노테이션을 부여해 주면 이런 클래스를 자동으로 찾아서 Bean으로 등록한다.
  • @Component 어노테이션이 선언된 클래스를 자동으로 찾아서 Bean으로 등록해 주는 방식을 빈 스캐닝이라고 한다.
  • 어노테이션을 부여하고 자동 스캔으로 Bean을 등록하면 xml 문서 생성과 관리에 따른 수고를 덜어주고 개발 속도를 향상시킬 수 있다.

전략 3 : 어노테이션 단독 설정

@Configuration
@ComponentScan(basePackages = {"myspring.di.annot"})
@PropertySource(value = "classpath:values.properties")
public class HelloBeanConfig {
	
	@Bean("nameList")
	public List getNames() {
		return Arrays.asList("SpringFW", "SpringBoot");
	}

}
  • Spring JavaConfig 프로젝트는 xml이 아닌 자바 코드를 이용해서 컨테이너를 설정하는 기능을 제공한다.
  • @Configuration 어노테이션과 @Bean 어노테이션을 이용해서 스프링 컨테이너에 새로운 빈 객체를 제공할 수 있다.
  • Spring 3.0부터는 어노테이션을 이용한 Bean의 등록 및 Bean들 간의 연결 설정을 자바 코드 내부에 하므로 xml을 전혀 사용하지 않는다.

annotation 공식 문서

profile
다부진 미래를 만들어가는 개발자

0개의 댓글