본문 바로가기
개발/Java&Spring

간단 Spring 동작 원리

by ahoy~ 2020. 7. 8.

IOC(Inversion of Control)

"내가 쓸 놈은 내가 만들어 쓸께...." 일반적으로 의존성에 대한 제어권이 역전되는 것을 뜻하게 됩니다.

class OwnerController{
    private OwnerRepository repo;

    public OwnerController(OwnerRepository repo){
        this.repo=repo;//누군가가 주입한 repo를 사용하게 됩니다.
    }

    //이후에 repo사용
}

IOC 컨테이너

Spring에서 IOC컨테이너는 ApplicationContext(BeanFactory)를 뜻하게 됩니다.
이 ApplicationContext는 bean을 만들고 엮어주며 제공하게 됩니다.
기존에 Spring에서는 web.xml을 통해 내가 만들 IOC컨테이너와 빈을 설정해주기도 하였는데 Spring Boot로 넘어오게 되면서 이마저도 자동화되어 직접 볼 일은 많이 없습니다.
앞으로의 이야기는 Spring Boot3이상에서를 기준으로 얘기를 하도록 하겠습니다.

빈(Bean)

빈을 등록하는 방법

1. Component Scan을 이용

Annotation은 원리 주석과 같아 아무 역할이 없습니다.
Component Scan이 프로세서 역할을 하여 Annotation을 읽어들여 빈으로 등록하여 줍니다.
Annotation중 @Component, @Repository, @Service, @Controller가 달린 class는 빈으로 등록이 되게 됩니다.(사실 @Component가 빈으로 등록되는 Annotation이고 나머지는 @Component가 붙어있어 빈이 되는 구조입니다.)

직접 빈을 등록하는 방법

코드로 살펴보도록 하겠습니다.

@Configure//@Bean을 만들 때 @Configure 클래스 안에서 만들어야 합니다.
public class Application{
    @Bean
    public String changgun(){//changgun이라는 이름의 Bean이 등록된다.
        return "changgun";
    }
}
>@Controller//오로지 Bean만이 Bean을 주입받을 수 있기 때문에 Bean을 사용할 클래스도 Bean이여야합니다.
public class Controller{
    @Autowired
    String changgun;//changgun이라는 Bean을 사용할 수 있다.
}

의존성 주입(Dependency Injection i.e. DI)

@Autowired/@Inject

생성자나 필드, setter에 @Autowired/@Inject를 사용하면 주입이 가능합니다.
Bean클래스에 생성자가 1개이고 생성자의 parameter들이 다 Bean인 경우 자동으로 주입을 해줍니다.(@Autowired가 없더라도)

JPA사용시

public interface Repository extends Repository와 같이 JPA 인터페이스를 상속하면 JPA에서 자동으로 빈으로 만들어 줍니다.

AOP(Aspect Oriented Programming)

흩어진 코드를 한 곳으로 모으자!는 것이 AOP입니다.

class A{
    method a(){
        \\\
        a
    }
    method b(){
        \\\
        b
    }

에 AOP를 적용해봅시다.

class A{
    method a(){
        a
    }
    method b(){
        b
    }
}
class B{
    method \(pointer){
        \\\
        pointer.print()
    }
}

코드가 훨씬 명확해 졌습니다.
이런 AOP는 Proxy Pattern과 Byte coding으로 구현이 가능한데 Spring은 Proxy Pattern을 사용합니다.
주로 @Transactional에서 AOP를 사용합니다. 메소드가 호출되기 전에 Transaction을 시작하고 메소드가 끝나면 Transaction을 Commit하고 메서드 중간에 에러가 발생하면 Transaction Rollback을 하게됩니다.

전체적인 Spring의 주요 기능이였습니다.~

'개발 > Java&Spring' 카테고리의 다른 글

Java에서의 예외 처리  (0) 2020.10.05

댓글