IT 면접족보/자바 면접족보

족보 정리 3탄(Spring 관련)

낙산암 2022. 3. 21. 23:28

스프링 버전대별 특징

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. 스프링 구동 순서

 

① 클라이언트가 해당 어플리케이션에 접근하면 접근한 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

 

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를 사용하자.

 

 

정리 

 

DI 개념

 

이번 포스트에서는 스프링의 핵심 기능중 하나인 DI(Dependecy Injection)에 대해 알아보고 예제를 작성해보겠습니다.

DI는 말 그대로 의존성을 주입시켜준다- 입니다. 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입을 시켜주는 방식인데요. 예제를 보며 알아가봅시다.

 

 

일단 A라는 객체에서 B, C라는 객체를 이용할 때 두가지 방법이 있습니다. 

첫번째 방법은 A객체가 B와 C객체를 New 생성자를 통해서 직접 생성하는 방법이고, (완제품)

두번째 방법 외부에서 생성 된 객체를 setter()나 생성자를 통해 사용하는 방법입니다. (조립)

 

첫번째 방법 예제를 보시면 MainClass는 Cats를 의존하고 있고, MainClass에서 직접 Cats클래스를 생성해서 사용합니다. 




스프링 에서의 IoC (제어 역전)

IoC 란 오브젝트의 생성, 사용 및 생명주기의 관리까지 제어권이 바뀌었다는 의미입니다. 즉, 제어권을 스프링 프레임워크가 담당한다는 의미입니다. 

 

IoC 개념을 사용하지 않았을 때는 아래 그림과 같이 개발자가 객체를 직접 신규로 생성해야 합니다.

IoC에서는 개발자가 객체를 직접 생성하지 않습니다. 프레임워크가 객체를 생성, 관리합니다. 의존성 주입을 하게 되면, 아래 그림과 같이 역방향으로 객체를 주입이 됩니다. 

스프링에서 IoC를 담당하는 컨테이너를 빈 팩토리 또는 애플리케이션 콘텍스트라고 부르며, 컨테이너는 단순한 DI 작업 외에 여러 가지 기능을 하게 됩니다.

 

빈(Bean)

스프링 프레임워크에서 관리하는 객체이다. 좀 더 정확히는, IoC 컨테이너에 저장되고 관리하는 객체이다.

 

IoC 컨테이너

빈객처를 관리하는 저장소