일반적인 제어권
사용할 의존성은 직접 생성
class OwnerController {
private OwnerRepository owners = new OwnerRepository();
}
Inversion of Control
사용할 의존성을 다른 곳에서 주입을 받는다. 사용할 의존성의 타입만 맞으면 된다.
class OwnerController {
private OwnerRepository owners;
public OwnerController(OwnerRepository repo){
this.owners = repo;
}
}
class OwnerControllerTest{
@Test
public void create(){
OwnerRepository repo = new OwnerRepository();
OwnerController controller = new OwnerController(repo);
}
}
의존성 주입
스프링이 관리하는 Bean으로 등록하면 필요한 타입의 Bean을 스프링의 IoC 컨테이너가 주입을 해준다.
IoC 컨테이너
Bean을 만들고 엮어주며 제공 ApplicaionContext, BeanFactory를 이용한다.
( ApplicationContext가 BeanFactory를 상속 받는다.)
Bean으로 등록하는 방법
@Controller, @Bean 등 의 annotation을 이용한다. 의존성 주입은 Bean끼리만 한다.
IoC를 사용하는 이유
Singleton Pattern을 이용하여 인스턴스 하나를 Application 전반에서 계속해서 재사용
Bean
IoC 컨테이너가 관리하는 객체, ApplicationContext가 만들어서 그 안에 담고 있는 객체 annotation을 통해 Bean에 등록 했어도 직접 인스턴스를 만들었으면 Bean이 아니다
Bean을 등록하는 방법
Component Scanning
@Component annotation을 이용
@Repository, @Service, @Controller 모두 @Component annotation을 포함
@ComponentScan annotation이 붙어 있는 위치에서 부터 모든 하위 패키지의 모든 클래스를 확인 후 @Component annotation이 붙어 있는 클래스를 찾아 Bean으로 등록해 준다.
//ComponentScan이 붙어 있어 하위 폴더에 찾아서 bean에 등록
@SpringBootApplication(proxyBeanMethods = false)
public class PetClinicApplication {
public static void main(String[] args) {
SpringApplication.run(PetClinicApplication.class, args);
}
}
직접 XML이나 자바 설정 파일에 등록
SampleContrller을 Bean으로 등록하기
다음과 같은 SampleController을 Bean으로 등록하기 위해서는 Config 파일을 만들고 @Configuration과 @Bean을 이용해 Bean으로 등록 할 수 있다.
public class SampleController {
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SampleConfig {
@Bean
public SampleController sampleController() {
return new SampleController();
}
}
Dependency Injection
필요한 의존성을 어떻게 받아 올 것인가
의존성 주입 방법
@Autowired / @Inject를 이용 생성자, 필드 Setter에 붙일 수 있다.
생성자를 이용
생성자에 @Autowired를 붙여 의존성을 주입 받을 수 있다. 생성자가 하나이고 생성자가 주입 받는 변수들이 Bean으로 등록되어 있으면 @Autowired를 생략가능하다. 생성자를 이용한것을 권장
@Controller
class OwnerController {
private final OwnerRepository owners;
private VisitRepository visits;
@Autowired
public OwnerController(OwnerRepository clinicService,
VisitRepository visits) {
this.owners = clinicService;
this.visits = visits;
}
}
필드를 이용
@Controller
class OwnerController {
@Autowired
private final OwnerRepository owners;
@Autowired
private VisitRepository visits;
}
Setter를 이용
@Controller
class OwnerController {
@Autowired
public void setVisits(VisitRepository visits) {
this.visits = visits;
}
private VisitRepository visits;
}
AOP Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이다. 의미는 다음과 같이 메소드 a, b, c 안에 공통된 AAA, BBB와 각각의 기능이 있다. 이때 AAA BBB를 묶어 별도의 메소드로 빼낸것을 의미한다.
class A {
method a() {
AAA
a함수이다 그렇다
BBB
}
method b() {
AAA
b함수이다
BBB
}
}
class B {
method c(){
AAA
B클래스의 c함수이다
BBB
}
class A {
method a() {
AAA
a함수이다 그렇다
BBB
}
method b() {
AAA
b함수이다
BBB
}
}
class B {
method c(){
AAA
B클래스의 c함수이다
BBB
}
class AAABBB {
method aaabbb(JoinPoint point) {
AAA
point.execute()
BBB
}
AOP를 구현하는 방법