2 분 소요


  1. 개발 환경 준비 1)
  2. Spring IoC 1) 2)
  3. Spring MVC 1) 2) 3)
  4. Database 활용
  5. View Template 1) 2) 3) 4) 5)
  6. AOP / Filter / Interceptor
  7. File Upload / Download

Spring IoC (제어 역전; Inversion of Control)

  • 제어권이 framework에게 있어 필요에 따라 Spring framework가 사용자의 코드를 호출

  • Spring Container
    bean의 생명주기를 관리한다.

imgSpring Container

  • BeanFactory
    객체 생성과 검색에 대한 기능을 정의하는 interface이다. Spring의 IoC를 담당하는 핵심 컨테이너이다.
  • ApplicationContext
    위의 BeanFactory interface를 상속하는, 기능이 더욱 추가된 interface이다. 자원 처리 추상화나 메시지, 프로필, 환경변수 등을 처리할 수 있는 기능을 추가로 제공하고 있어 BeanFactory보다 더 자주 사용된다.
  • AnnotationConfigApplicationContext
    ApplicationContext interface를 구현한 클래스로 @Configuration 어노테이션이 붙은 클래스를 이용하여 설정 정보를 읽어와 bean객체를 생성, 관리한다.
  • ClassPathXmlApplicationContext
    ApplicationContext interface를 구현한 클래스로 classpath의 XML파일에서 설정 정보를 읽어온다.

Bean 생성 및 주입

1) @Congiguration 어노테이션 클래스에서 직접 등록

  • 메서드 자체를 bean객체로 등록하는 방법

- @Configuration 작성

  • @Configuration
    해당 클래스가 Spring 설정에 사용되는 클래스라는 것을 의미한다. 클래스 이름은 자유롭게 지정 가능하다.
  • @Bean
    해당 메서드가 생성한 객체를 Spring이 관리하는 bean객체로 등록한다. 메서드 명: bean객체의 이름으로 지정, 구분할 때 사용한다. 메서드의 매개변수는 bean에 등록된 객체가 있다면 자동으로 전달한다.

file\src\main\java\com\example\demo\config\BeanConfig.java

Java

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {
    @Bean
    public String bean1(){
        return "첫번째 빈";
    }
}

- main method 수정

  • getBean()
    생성된 bean객체를 검색할 때 사용된다.

file\src\main\java\com\example\demo\DemoApplication.java

Java

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.example.demo.config.BeanConfig;

@SpringBootApplication
public class DemoApplication {
	public static void main(String[] args) {
		// 클래스1 변수명 = new 클래스1();
		// 변수명.메서드()  ... 와 결과적으로 같은 형태
		ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
		String s = (String) context.getBean("bean1");
		System.out.println("bean 생성1 : " + s);

		SpringApplication.run(DemoApplication.class, args);
	}
}

2) XML 파일에서 정보를 읽어와 등록

- xml 파일 작성

file\src\main\resources\bean2.xml

XML

1
2
3
4
5
6
7
<?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="bean2" class="java.lang.Integer">
        <constructor-arg value="2324" />
    </bean>
</beans>

- main method 수정

file\src\main\java\com\example\demo\DemoApplication.java

Java

1
2
3
4
5
6
7
8
9
10
11
...

import org.springframework.context.support.ClassPathXmlApplicationContext;

...

        ApplicationContext context2 = new ClassPathXmlApplicationContext("classpath:bean2.xml");
        int i = (int) context2.getBean("bean2");
        System.out.println("bean 생성2 : " + i);

...

3) @ComponentScan으로 @Component를 탐색해서 등록

  • @ComponentScan
    Component를 스캔해준다

Spring Boot의 main메서드가 포함된 패키지에 붙는 @SpringBootApplicaiton 어노테이션을 Crtl + 클릭으로 들어가보면 @ComponentScan도 포함되어 있음을 확인할 수 있다. 따라서 해당 클래스가 포함된 package의 하위 package에 대해 스캔하여 빈으로 등록한다. 이 범위를 벗어난 컴포넌트를 빈으로 등록하기 위해 @ComponentScan으로 범위를 지정할 수 있다.

  • basePackage
    스캔을 시작할 루트(최상위) package를 정해준다.
  • basePackageClasses
    설정된 클래스의 package로부터 모든 하위의 package에 대해 component를 스캔한다.

- @Configuration 수정

file\src\main\java\com\example\demo\config\BeanConfig.java

Java

1
2
3
4
5
6
7
...

@Configuration
@ComponentScan(basePackages = "com.example.demo.config")
public class BeanConfig {

...
  • class 자체를 검색할 수도 있다

Java

1
2
3
4
5
...

@ComponentScan(basePackageClasses = Bean3.class) //또는 BeanConfig.class

...

- Bean으로 등록할 클래스 작성

file\src\main\java\com\example\demo\config\Bean3.java

Java

1
2
3
4
5
6
7
8
9
10
package com.example.demo.config;

import org.springframework.stereotype.Component;

@Component
public class Bean3 {
    public String run(){
        return "세번째 빈";
    }
}

- main method 수정

file\src\main\java\com\example\demo\DemoApplication.java

Java

1
2
3
4
5
6
7
...

ApplicationContext context3 = new AnnotationConfigApplicationContext(BeanConfig.class);
Bean3 b = (Bean3) context3.getBean("bean3"); // 클래스가 컴포넌트화 되면서 첫문자가 소문자가 됨
System.out.println(b.run());

...

Stereo Type Annotation

  • Spring에서 기본적으로 제공하는 어노테이션이다.
  • 특수한 기능을 가지고 있다.
  • 자주 사용되는 대표적인 4종류
    1. @Controller: 요청과 응답을 처리하는 클래스에 사용한다.
    2. @Service: 비지니스 로직을 구현한 클래스에 사용한다.
    3. @Repository: Persistence 역할을 하는 클래스에 사용한다.
    4. @Component: 위 3가지 어노테이션의 상위(부모) 객체이다.

실습

  1. 프로젝트 생성(이름: basic)
  2. 2번째 pdf 파일의 bean 생성 실습 적용

Reference

댓글남기기