[Spring] 스프링의 특징

Ash·2021년 1월 16일
0
post-custom-banner

1. 경량 컨테이너

2. POJO(Plain Old Java Object)

- 일반적인 Java코드를 사용해 관계를 구성할 수 있다.

3. IoC(Inversion of Control)

- 스프링 프레임워크에서는 개발자들이 필요한 부분을 개발하여 '끼워넣기' 방식으로 완성한다.
- 완성된 코드는 개발자가 아닌 프레임워크의 내부에서 결정된 대로 최종 호출이 이루어지게 되는데 이 현상을 바로 "제어의 역행" 이라고 한다.

4. DI(Dependency Injection)

- IoC가 일어날 때 스프링이 Bean들 간의 의존 관계를 관리할 때 사용된다. (스프링이 Bean들 간의 연결 관계를 짓기 때문에 필요한 객체를 스프링이 알아서 주입해준다.)
- 스프링 프레임워크에서는 의존적인 객체를 직접 생성/제어하지 않는다.

MemberController 에 MemberService 가 주입되고, MemberService에 MemberRepository가 주입된다.

의존성 주입의 종류

  1. Constructor Injection(권장방법)
  • 장점
    - 테스트코드 작성시 생성자를 통해 의존성 주입이 용이하다.
    - 의존성 주입 대상 필드를 final로 선언할 수 있다.(불변 객체)
@Controller
public class SearchController {
    private final MovieService movieService;

    public SearchController(MovieService movieService) {
        this.movieService = movieService;
    }
}
  1. Setter Injection
@Controller
public class SearchController {
	private MovieService movieService;
    public void setMovieService(MovieService movieService) {
        this.movieService = movieService;
    }   
}
  • 장점
    - 의존성이 선택적으로 필요한 경우 사용된다.
    - Constructor-Based와 함께 사용하면 선택적으로 필요한 의존성을 나눠서 주입할 수 있다.
  • 단점
    - final 사용 불가
  1. Field Injection
    - Spring 4.3부터는 생성자가 1개인 경우 @Autowired를 사용하지 않아도 된다.
@Controller
public class SearchController {
	@Autowired
	private MovieService movieService;

}
  • 장점
    - 간단하다.
  • 단점
    - 의존 관계가 눈에 띄지않고 복잡해질 수 있다.
    - final 사용 불가

"Field Inject is not recommend"

Intellij IDE에서 @Autowired를 사용하는 경우 "Field Inject is not recommend" 라는 경고를 볼 수 있다. Spring 팀에서도 Constructor Injection을 권고하고 있는데 그 이유는 다음과 같다.
1. 테스트코드 작성이 쉽다.

  1. final 선언이 가능하기 때문에 불변성을 유지할 수 있다.

    • 실행 중 객체가 변하는 것을 막을 수 있다.
    • NullException과 같은 오류를 컴파일 시 방지할 수 있다.
  2. 한 클래스에 많은 의존성을 갖고 있는 경우 Constructor Injection 의 경우 생성자의 인자 수가 많아지므로 리팩토링을 통해 코드의 품질을 높힐 가능성이 높다.

  3. 순환 참조 오류가 발생하는 경우 컴파일 시 막을 수 있다.

5. AOP(Aspect-Oriented Programming)

6. MVC(Model View Controller)

7. Batch

8. Transaction Management Framework

profile
기록남기기👩‍💻
post-custom-banner

0개의 댓글