본문 바로가기

준비중

토비의 스프링 vol2 필요한 부분 공부하기(1)

반응형

해당 내용은 토비의 스프링을 참조하여 공부한 내용을 작성했습니다.

 

스프링 애플리케이션에서는 오브젝트 생성과 관계설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 독립된 컨테이너가 담당한다.

이를 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서 IoC 라고 부른다.

그래서 스프링 컨테이너를 IoC 컨테이너라고도 한다.

 

IoC 컨테이터의 가장 기초적인 역할은 오브젝트를 생성하고 이를 관리하는 것이다.

스프링 컨테이너가 관리하는 이런 오브젝트는 빈(Bean) 이라고 부른다. IoC 컨테이너가 필요로 하는 설정 메타정보는 바로 이 빈을 어떻게 동작하게 할 것인가에 관한 정보다.

 

스프링 IoC 컨테이너는 각 빈에 대한 정보를 담은 설정 메타정보를 읽어들인 뒤에, 이를 참고해서 빈 오브젝트를 생성하고

프로퍼티나 생성자를 통해 의존 오브젝트를 주입해주는 DI 작업을 수행한다.

이 작업을 통해 만들어지고, DI로 연결되는 오브젝트들이 모여서 하나의 애플리케이션을 구성하고 동작하게 되는 것이

IoC 컨테이너의 역할이다.

 

스프링 빈을 등록하는방법에는 XML 방식을 이용하는 방법도 있지만 본인은 주로 빈으로 사용될 클래스에 특별한 애노테이션을 부여해주면 이런 클래스를 자동으로 찾아서 빈으로 등록해주는 방식을 이용한다.

특정 애노테이션이 붙은 클래스를 자동으로 찾아서 빈으로 등록해주는 방식을 빈 스캐닝을 통한 자동인식 빈등록 기능이라고 하고,

이런 스캐닝 작업을 담당하는 오브젝트를 빈 스캐너 라고 한다.

 

@Component 와 같은 스테레오타입 애노테이션을 이용하면 이를 구현할 수 있다.

@Component
public class BeanHello {

}

 

* 스테레오타입 애노테이션의 종류

@Repository

- 데이터 액세스 계층의 DAO 또는 레포지토리 클래스에 사용된다.

DataAccessException 자동변환과 같은 AOP의 적용 대상을 선저하기 위해서도 사용된다.

 

@Service

- 서비스 계층의 클래스에 사용된다.

 

@Controller

- 프레젠테이션 계층의 MVC 컨트롤러에 사용된다. 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정된다.

 

스프링은 코드를 이용해서 오브젝트를 생성하고 DI를 진행하는 방식으로 만들어진 오브젝트를 빈으로 쓸 수 있는 방법을 제공한다.

즉, 자바 코드에 의한 빈 등록 기능이다.

자바 코드에 의한 빈 등록 기능은 하나의 클래스 안에 여러 개의 빈을 정의할 수 있다. 

또 애노테이션을 이용해 빈 오브젝트의 메타정보를 추가하는 일도 가능하다.

게다가 그 정의를 담고 있는 클래스 자체가 자동인식 빈의 대상이 되기 때문에 XML을 통해 명시적으로 등록하지 않아도 된다.

빈 설정 메타정보를 담고 있는 자바 코드는 @Configuration 애노테이션이 달린 클래스를 이용해 작성한다.

클래스에 @Bean이 붙은 메소드를 정의할 수 있는데, 이 @Bean 메소드를 통해 빈을 정의할 수 있다.

 

@Configuration
public class exampleBeanConfig {
@Bean
public ExampleBean exampleBean(){ //@Bean이 붙은 메소드 하나가 하나의 빈을 정의한다. 메소드 이름이 등록되는 빈의 이름이 된다.
return new ExampleBean(); //자바 코드를 이용해 빈 오브젝트를 만들고, 초기화한 후에 리턴에 준다. 컨테이너는 이 리턴 오브젝트를 빈으로 활용한다.
}
}

 

@Configuration과 @Bean이 붙으면 스프링 컨테이너가 인식 할 수 있는 빈 메타정보 겸 빈 오브젝트 팩토리가 된다.

 

 

이번에는 빈 오브젝트 사이의 DI를 위한 의존관계 메타정보를 작성하는 방법을 알아보자.

 

@Autowired는 XML의 타입에 의한 자동와이어링 방식을 생성자, 필드, 수정자 메소드, 일반 메소드의 네가지로 확장한 것이다.

 

첫번째로는 필드 방식입니다.

@Autowired 애노테이션이 부여된 필드를 만들어주면 스프링이 자동으로 DI 해주도록합니다.

public class Hello {
@Autowired
private Auto auto;

필드의 타입이 Auto 이므로 현재 등록된 빈에서 Auto 타입에 대입 가능한 빈을 찾는다. 대입 가능한 빈 후보가 하나 발견되면,

auto 필드에 자동으로 DI 될 것이다.

 

두번째로는 수정자 방식입니다.

@Autowired 애노테이션이 부여된 수정자를 만들어주면 스프링이 자동으로 DI 해주도록합니다.

public class Hello {
private Auto auto;

@Autowired
public void setAuto(Auto auto){
this.auto = auto;
}

세번째로는 생성자 방식입니다.

@Autowired 애노테이션을 이용하면 생성자의 모든 파라미터에 타입에 의한 자동 와이어링이 적용된다.

public class Hello implements  hello {
    private final Auto auto;

    @Autowired
    public Hello(Auto auto){
        this.auto = auto;
    }
}

@Autowired는 단 하나의 생성자에만 사용할 수 있다는 제한이 있다. 여러개의 생성자에 @Autowired가 붙으면 어느 생성자를 이용해서 DI 해야 할지 스프링이 알 수없기 때문이다.

수정자 또는 필드를 이용한 DI 방식보다는 생성자 주입을 선호한다면 @Autowired를 사용하면 된다.

 

필드방식의 경우 대부분 test code에서만 사용하며 주로 수정자나 생성자 방식을 이용하면 된다.

또한 의존관계 설정에 있어서 @Autowired는 스프링에서 가장 유연하면서 가장 강력한 기능을 가진 의존관계 설정 방법이다. 타입에 의한 자동와이어링은 변경되기 쉬운 이름에 의한 자동와이어링이나 명시적인 의존관계 설정보다 편리하다. 때로는 같은 타입이 여러개 존재해서 @Qualifier를 쓰거나 어쩔 수 없이 @Resource를 사용해야 하지만 대개는 클래스나 인터페이스당 하나의 빈이 등록되므로 @Autowired만으로 충분하다.

 

기본적으로 스프링의 빈은 싱글톤으로 만들어진다. 애플리케이션 컨텍스트마다 빈의 오브젝트는 한 개만 만들어진다는 뜻이다. 사용자의 요청이 있을 떄마다 매번 애플리케이션 로직을 담은 오브젝트를 새로 만드는 건 비효율적이기 때문이다. 

애플리케이션 로직을 담은 오브젝트는 대부분 싱글톤 빈으로 만들면 충분하다.

 

이렇게 마무리 하겠습니다.

반응형

'준비중' 카테고리의 다른 글

자바 복습하기 (연산자, 조건문과 반복문편)  (0) 2023.07.31
자바 복습하기 (변수편)  (0) 2023.07.30
ios와 aws  (0) 2023.07.11
토비의 스프링 vol2 필요한 부분 공부하기(2)  (0) 2023.07.05
Spring Security + jwt  (0) 2023.06.30