스프링 버전대별 특징
Spring 3.2.x
- Java 5 기능
- @Async annotation을 활용한 비동기 메서드 호출 지원
- 하나의 Spring.jar 로 지원하던 것을 spring-core, sprint-web 등으로 나눔
- Java 클래스로부터 @Configuration @Bean 등 annotation을 통해 DI 지원 받기 가능
- RestTemplate 이용 가능
- 16.12.31 지원 종료
Spring 4.3.x (Spring boot 1.5)
- Java 8 지원
- @Autowired 지원
- custom-annotation 가능
- Bean 관리 용이(@Order, @Lazy annotation)
- Framework 레벨에서 테스트 유틸리티 지원 (AopTestUtils, ReflectionTestUtils 개선)
- 20.12.31 지원 종료
Spring 5.x (Spring boot 2.0.0 ~ )
- Java 8을 기본으로 지원, 제네릭/람다로 가독성 향상
- @Nullable, @NotNull 지원. 컴파일타임에서 Null을 다룰 수 있음
- Spring web flux
- JDK9와 호환
- Kotlin 지원
- Junit 5 지원
- Spring boot 2.1.0부터 Spring 5.1 버전 지원. Java 11 지원
2. 스프링 구동 순서
![](https://blog.kakaocdn.net/dn/ciManm/btrwJWeIeyC/sblQHsw7Kutmm3eHYk4gg1/img.png)
① 클라이언트가 해당 어플리케이션에 접근하면 접근한 URL 요청을 DispatcherServlet이 가로챔
DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'appServlet' processing POST request for [/project_domain/main]
② RequestMappingHandlerMapping이 해당 요청을 처리할 컨트롤러를 찾음
DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Looking up handler method for path /main
Request Mapping Handler : @Controller("/url") // 어노테이션으로 매핑 BeanNameMapping Handler : <class-url></class- // 클래스 이름으로 매핑
③ DefaultListableBeanFactory 가 mainContoller 를 쓰면 된다고 알려줌
DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'mainController'
④ RequestResponseBodyMethodProcessor가 servlet-context.xml 에 선언해놓은 MessageConverter을 이용하여 요청 바디(파라미터)를 읽음
DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor - Reading [java.util.Map<java.lang.String, java.lang.Object>] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@11eb521a]
[Spring] @Autowired vs @Resource vs @Inject - 차이
🧐 @Autowired, @Resource, @Inject을 사용하는 이유
의존 주입을 위해 사용한다.
특정 Bean 기능을 수행하기 위해 기능에 필요한 특정한 Bean을 참조해야 하는데,
이 때 특정 Bean에 자동 연결을 위해 위 어노테이션들을 사용한다.
😊 @Autowired vs @Resource vs @Inject
![](https://blog.kakaocdn.net/dn/ZlUzD/btrwn3Gstmj/SJ9N3UKeKa1zuWF7NrndHK/img.png)
public class Animal{}
@Component
public class Dog implements Animal{}
@Component
public class Cat implements Animal{}
차이
@Autowired
//찾는 순서
//타입 -> 이름 -> @Qualifier -> 실패
//타입 기준 -- Dog 타입으로 연결
private Dog cat
@Resource
//찾는 순서
//이름(cat)-> 타입 ->Qualifier -> 실패
private Dog cat
@Inject
//찾는 순서
//타입 -> @Qualifier-> 이름 -> 실패
private Cat dog
👉 @Autowired의 특징
- Spring Framwork에만 존재하기 때문에 타 프레임워크에서 사용 불가능하다.
- 필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입
- @Autowired는 기본적으로 특정 빈을 찾지 못하면 예외를 던진다.
- 이 때 @Autowired의 required 속성값을 false로 지정해 빈을 못 찾더라도 그냥 치나치게 해줄 수 있다.
@Autowired( required = false )
※ 만약 타입을 기준으로 IoC 컨테이너에 호환 타입이 여럿 존재하거나 그룹형이 아닐 때
@Primary, @Qualifier를 통해 특정한 빈에 우선권을 부여 할 수 있다.
@Autowired
@Qualifier("example")
👉 @Resource의 특징
- 자바 측에서 @Autowired를 참고 해 만든 어노테이션.
- javax.annotation에 속해 있음.
- 이름을 통한 검색 방식이기 때문에, POJO가 여럿일 때 대상이 모호하지 않고, 명확하다.
- @Autowired + @Qualifier
👉 @Inject의 특징
- 자바 측에서 @Autowired를 참고 해 만든 어노테이션
- javax.annotation에 속해 있음.
- 타입을 통한 검색방식
- 타입이 같은 POJO가 여럿일 때 커스텀 어노테이션(custom annotation)을 작성해야한다.
※ 위 @Qualifier는 @Autowired의 @Qualifier와는 전혀 다르다.
👍 어느 어노테이션을 사용해야 할까?
😎 @Autowired는 스프링 프레임워크에서 나왔기 때문에, 다른 프레임워크로 변환 할 때 호환이 안된다.
따라서 타 프레임워크로도 호환을 원한다면 @Resource, @Inject를 사용하자.
😎 이름을 통해 검색 방식을 사용하고 싶으면 @Resource를 사용하고,
타입을 통해 검색 방식을 사용하고 싶으면 @Autowired, @Inject를 사용하자.
정리
![](https://blog.kakaocdn.net/dn/beNLjb/btrwJv9tbEZ/oclMz46Ggl78tcbfcKHcK1/img.png)
DI 개념
이번 포스트에서는 스프링의 핵심 기능중 하나인 DI(Dependecy Injection)에 대해 알아보고 예제를 작성해보겠습니다.
DI는 말 그대로 의존성을 주입시켜준다- 입니다. 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입을 시켜주는 방식인데요. 예제를 보며 알아가봅시다.
일단 A라는 객체에서 B, C라는 객체를 이용할 때 두가지 방법이 있습니다.
첫번째 방법은 A객체가 B와 C객체를 New 생성자를 통해서 직접 생성하는 방법이고, (완제품)
두번째 방법은 외부에서 생성 된 객체를 setter()나 생성자를 통해 사용하는 방법입니다. (조립)
첫번째 방법 예제를 보시면 MainClass는 Cats를 의존하고 있고, MainClass에서 직접 Cats클래스를 생성해서 사용합니다.
스프링 에서의 IoC (제어 역전)
IoC 란 오브젝트의 생성, 사용 및 생명주기의 관리까지 제어권이 바뀌었다는 의미입니다. 즉, 제어권을 스프링 프레임워크가 담당한다는 의미입니다.
IoC 개념을 사용하지 않았을 때는 아래 그림과 같이 개발자가 객체를 직접 신규로 생성해야 합니다.
![](https://blog.kakaocdn.net/dn/byfNHz/btrwJ8ThW3x/K93JquqnkaUGQdR9gR9cp0/img.png)
IoC에서는 개발자가 객체를 직접 생성하지 않습니다. 프레임워크가 객체를 생성, 관리합니다. 의존성 주입을 하게 되면, 아래 그림과 같이 역방향으로 객체를 주입이 됩니다.
![](https://blog.kakaocdn.net/dn/cg3bO5/btrwJDzeY3y/bEkEuo25iUWwuEoZAkA4uK/img.png)
스프링에서 IoC를 담당하는 컨테이너를 빈 팩토리 또는 애플리케이션 콘텍스트라고 부르며, 컨테이너는 단순한 DI 작업 외에 여러 가지 기능을 하게 됩니다.
빈(Bean)
스프링 프레임워크에서 관리하는 객체이다. 좀 더 정확히는, IoC 컨테이너에 저장되고 관리하는 객체이다.
IoC 컨테이너
빈객처를 관리하는 저장소
'IT 면접족보 > 자바 면접족보' 카테고리의 다른 글
추상 클래스 와 인터페이스 차이 (0) | 2024.01.22 |
---|---|
일타의 명언 (0) | 2022.04.18 |
자바의 메모리(JVM) 영역 (0) | 2022.03.10 |
자바 수업 정리 -210105_030_화_css:position,float | JSP:쿠키(30일 차) (0) | 2021.01.06 |
자바 수업 정리 -css:속성 | JSP:내장객체,redirection,forward(29일 차) (0) | 2021.01.05 |