● Beans
빈은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트.
즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈을 관리한다.
빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
빈은 클래스의 등록 정보, Getter/Setter 메서드를 포함하며, 컨테이너에 사용되는 설정 메타데이터로 생성된다.
스프링 빈을 사용하는 이유는 스프링 간 객체가 의존관계를 관리하도록 하는 것이 가장 큰 목적이고 객체가 의존관계를 등록할 때 스프링 컨테이너에서 해당하는 빈을 찾고 그 빈과 의존성을 만들게 된다.
스프링 컨테이너에 어노테이션을 통해 빈을 등록하는 방법
1. @Bean 어노테이션을 통한 빈 등록 (메서드 레벨)
2. @Configuration 어노테이션을 통한 빈 등록
3. @Component 어노테이션을 통한 빈 등록 (클레스 레벨)
4. xml에 직접 등록
@Bean의 경우 메서드에 붙여 해당 메서드를 통해 반환되는 객체를 Bean으로 관리할 때 사용한다.
@Component는 클래스에 붙여 해당 클래스 타입을 기반으로 빈을 관리하도록 한다.
@Repository, @Service, @Controller 등의 어노테이션들은 @Component를 이미 포함한다.
@Component를 통해 등록된 빈은 다른 곳에서 @Autowired를 사용해 의존성을 주입할 수 있다.
< 빈 등록 실습하기 >
< xml에서 직접 등록 >
root-context.xml에서 bean을 만들어본다.
root-context.xml에서는 모든 서블릿이 공유할 수 있는 Bean들이 모인 공간으로 공통 bean을 설정할 수 있다.
JSP와는 관련없는 객체(Bean)를 설정하고 스프링 MVC 설정과 관련된 여러 처리를 담당하게 된다.
간단히는 View와 밀접하지 않은 정보를 기술하는 xml 파일이다.
생성된 빈을 확인 할 수 있다.
해당 코드를 복사 붙여넣기 하여 실행하면 bean이 하나 더 만들어진 것을 확인 할 수 있다.
● Di
Di란 Dependency Injection으로 의존성 주입이라고 한다.
의존성 주입은 스프링 컨테이너에서 객체 Bean을 먼저 생성해두고 생성한 객체를 지정한 객체에 주입하는 방식이다.
DI를 사용함으로써 의존성 주입을 통해 객체간의 의존성을 줄여주게 된다.
왜냐하면 객체 자체가 코드 상에서 객체 생성에 관여하지 않아도 되기때문에 객체 사이의 의존도를 낮출수 있고 스프링 컨테이너에서 객체의 생명주기를 관리하며 객체의 의존관계 또한 관리해준다. 또한, 의존성 주입을 사용하면 유연하고 확장성이 뛰어난 코드 작성이 가능해진다.
< 실습하기>
Di패키지를 만들어준다.
그 안에 DiTests라는 JUnit Test Case를 만들어 준다.
JUnit 을 사용하는 테스트 클래스에는 RunWith, ContextConfiguration 어노테이션이 붙는다.
● ContextConfiguration 이란?
클래스 테스트가 테스트용 DI정보를 어디서 가져와야 하는지 지정할 때 사용하는 어노테이션이다.
생성된 스프링 컨테이너에 스프링 빈을 추가하기 위해서는 application-context.xml 파일과 같은 설정 파일을 읽어야 하는데, 이런 설정파일을 로드하는 어노테이션이다.
만약 스프링 컨테이너가 필요 없다면, 즉, 스프링 빈 팩토리에서 빈을 로드하는 것이 아닌, 직접 new로 객체를 생성해가며 테스트 코드를 작성할 것이라면 위의 어노테이션을 제거해도 된다.
● RunWith 이란?
말 그대로 SpringJUnit4ClassRunner.class를 실행한다는 것이고, 이 클래스는 내부적으로 스프링 컨테이너를 생성해준다.
maven repository에서 spring-test를 다운 받아준다.
pom.xml에 붙여넣기 해준다.
여기서 스프링의 버전과 맞춰주기 위해 위에서 설정한 springframework-version을 연결시켜준다.
그리고 scope를 제거하고 maven update를 해준다.
그리고 DiTests로 가서 빨간줄 뜬 코드를 ctrl + shift + o 를 눌러 없애준다.
● @Autowired
Autowired란?
필요한 의존 객체의 '타입'에 해당하는 빈을 찾아 주입한다.
- 생성자 주입
- 수정자(setter) 주입, 혹은 메서드 주입
- 필드 주입
이 3가지 경우에 Atowired를 사용할 수 있다. 그리고 Autowired는 기본 값이 true이기 대문에 의존성 주입 할 대상을 찾지 못한다면 애플리케이션 구동에 실패한다.
1) 생성자 주입
클래스의 생성자에 @Autowired를 붙여 해당 클래스 타입의 필드들을 찾아 등록하도록 한다.
생성자가 하나일 경우 어노테이션을 붙이지 않아도 해당 생성자를 자동 주입의 대상으로 인식한다.
2) setter주입, 메서드 주입
메서드에 @Autowired를 붙여 해당 클래스 타입의 빈을 찾아와 의존성을 주입한다.
생성 시점 이후에 메서드를 호출하여 의존성을 변경할 수 있으나 필드가 외부에서 변경될 수 있다는 점과 의존성이 필요한 시점에 주입되지 않을 수 있다는 위험이 존재한다.
3) 필드 주입
가장 간단하게 주입하는 방법으로 필드에 @Autowired를 붙여 의존성을 주입하는 방법이다.
코드는 가장 간결하나 수정자 주입과 마찬가지로 필드가 final이 아니므로 변경될 여지가 있다.
메서드와 필드 주입 시의 메서드, 필드의 접근제어자는 private도 가능하다.
여기서는 필드 주입식으로 @Autowired를 사용한다.
이때 Beans에서 만든 변수명과 동일하게 적어야한다.
DiTests.java에서 테스트를 위한 함수를 작성하고 실행해본다.
두번째 Bean도 확인해본다.
root-context.xml 에 가서 Beans 안에 값을 넣어본다.
Beans Graph에서 Beans를 확인해본다.
그리고 DiTest에서 함수 beantest에 커서를 올려 Junit test를 실행시켜보면 해당 값이 출력되는 것을 확인 할 수 있다.
< @Configuration을 통한 빈 등록 >
component-scan을 root-context.xml에서 작성한다.
● component-scan 이란?
: 빈으로 등록 될 준비를 마친 클래스들을 스캔하여, 빈으로 등록해주는 것
빨간줄을 없애주기 위해 Namespaces를 해줘야 한다.
Namespaces에 들어가 context를 체크하고 저장해준다. 그러면 빨간 줄이 사라지게 된다.
config 패키지를 com.example.app 안에 만들어준다.
그리고 그 안에 PersonDtoBeanconfig 클래스를 만들어 준다.
@Configuration이란?
Spring에서 Bean을 수동으로 등록하기 위해서는 설정 class 위에 @Configuration을 추가하고 @Bean을 사용해 수동으로 빈을 등록 할 수 있다.
이때 메서드 이름으로 빈의 이름이 결정된다. 그러므로 중복된 빈 이름이 존재하지 않도록 주의해야 한다.
일반적으로 의존성 주입을 위해 @Configuration을 사용한다.
springContainer는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록하게 된다.
● Configuration 역할
- Bean을 등록할 때 싱글톤이 되도록 보장해준다.
- 스프링 컨테이너에서 Bean을 관리할 수 있게 된다.
즉, @Bean 만 사용하면 스프링 빈으로 등록은 되지만 싱글톤이 유지되지 않는다.
@Configuration 어노테이션을 사용한 후 root-context.xml에 가서 bean을 확인해본다.
그러면 personDtoBeanConfig bean이 생성된 것을 확인 할 수 있다.
build()로 변수 안에 값을 넣어준다.
그리고 personBean의 person04의 이름을 personBean으로 바꿔 봤다.
그러면 Bean에서 person04의 이름이 personBean으로 변경된 것을 확인 할 수 있다.
DiTests로 가서 만든 person03과 personBean의 값을 출력시켜본다.
- ApplicationContext이란?
ApplicationContext는스프링 컨테이너라고 한다. ApplicationContext는 BeanFactory 인터페이스의 하위 인터페이스로 BeanFactory를 상속받아 구현되어졌다. 즉, ApplicationContext는 BeanFactory에 부가기능을 추가한 것이다.
BeanFactory는 스프링 컨테이너의 최상위 인터페이스로 스프링 빈을 관리하고 조회하는 역할을 한다.
ApplicationContext는 BeanFactory + 부가 기능(국제화 기능, 환경 변수 관련 처리, 애플리케이션 이벤트, 리소스 조회)을 가진다.
applicationContext를 만들어 출력시켜본다.
그러면 해당 위치가 출력되는 것을 확인 할 수 있다.
applicationContext로 만든 변수들을 beanTests_2에서 출력시켜본다.
그러면 해당 값들이 출력되는 것을 확인할 수 있다.
참조 : https://jaehee329.tistory.com/28, https://ittrue.tistory.com/221#google_vignette, https://blogshine.tistory.com/551, https://tlatmsrud.tistory.com/36
'IT수업 > STS3' 카테고리의 다른 글
IT 수업 19주차 (116) 파라미터 (0) | 2024.04.30 |
---|---|
IT 수업 19주차 (115) Bean, controller (0) | 2024.04.30 |
IT 수업 19주차 (113) Junit 테스트(lombok, @Builder, 로그레벨) (0) | 2024.04.29 |
IT 수업 19주차 (112) lombok 설치 (0) | 2024.04.29 |
IT 수업 19주차 (111) 한글 깨짐 방지 (0) | 2024.04.29 |