스프링은 자바 프로그램에 대해 도움을 주는 프레임워크다. 내가 생각하기엔 좀 특이한 개념들이 있다. 이러한 개념들로 처음에는 스프링 자체에 대해서 이해하기 어려웠지만 이 개념들을 이해하고 나니 왜 스프링이 자바 프레임워크의 대표가 되었는지 이해가 되었다.
IoC (Inversion of Control)
먼저 스프링을 관통한다고 생각하는 개념이다. 기존 자바에서는 객체등을 개발자들이 직접 만들고 관리했지만 스프링은 다르다. 스프링은 자체적으로 스프링이 이러한 객체들을 만들고 관리해준다. 이들을 스프링 빈이라고 부르며 이들에 대한 제어권이 스프링에게 있다. 그래서 이러한 제어에 대한 권리가 개발자가 아닌 스프링에게 있다. 제어의 역전이 일어났다. 외부에서 프레임워크나 스프링 빈이 담겨있는 컨테이너에 담아 객체들을 즉 스프링 빈을 관리하고 이를 용이하게 해준다. 프로그램의 흐름을 담당하는 부분이 완전히 역전되었다!
DI (Dependency Injection)
이러한 과정들은 의존성 주입이라는 의미를 가진 DI를 통해 일어난다. 의존성이라는 말이 어렵게 느껴졌다. 의존성이라는 말은 그냥 사용한다라고 생각하면 될 것 같다. 객체를 사용한다 = 객체의 메서드, 필드를 사용한다라는 의미고 객체의 생성 먼저해야 일어날 수 있는 일들이다.
위의 과정을 생각해보면 당연히 제어권이 스프링에게 있으니 우리는 의존성을 주입당하는 역할이며 스프링이 의존성을 주입하는 역할을 한다!
@Autowired : 필드 마련@Autowired : 생성자// 필드로 주입
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public String findProduct() {
return productRepository.findProduct();
}
}
// 생성자 방법
@Autowired
ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
import org.springframework.stereotype.Service;
@Service
public class ProductService {
public String findPruduct() {
return "NoteBook!";
}
}
@RequestMapping(value = "", method = RequestMethod.GET)
public String findProduct() {
ProductService productService = new ProductService();
return productService.findPruduct();
}
이렇게 두 클래스를 만들어서 서비스를 만들어서 컨트롤러와 연결햇다. 그런데 이러면 현재는 우리가 제어를 하고 있다. 이러한 일들을 스프링에게 넘기기 위해 스프링을 사용하기 때문에 스프링에게 넘겨보자. 그런데 어떻게 넘길까?
즉, 어떻게 스프링에서 관리하는 객체인 스프링 빈으로 등록할 수 있을까?
@Component 방법과 @Configuration 방법이 있다.
또한 등록된 빈을 사용하게 주입해줘!를 위해 @Autowired를 사용하면 된다.
@Component
스프링의 컴포넌트 스캔 기능을 활용하여 해당 클래스를 스프링 빈으로 등록하는 역할을 한다. 즉, @Component 어노테이션이 붙은 클래스는 스프링에서 관리되는 빈으로 등록되어 다른 빈들과 의존성 주입 등을 통해 사용될 수 있다. 그리고 @Service, @Controller, @Repository 등의 계층에서 사용되는 어노테이션들에 들어가보면 이 Componenet가 등록되어 있어서 @Component를 통해 스프링 빈으로 쉽게 등록할 수 있다.
@Configuration
public class ApplicationConfiguration {
@Repository
public ProductRepository productRepository() {
return new ProductRepository();
}
}
위처럼 임포트를 해주자!
@Configuration
특정 시스템에서 데이터의 의미를 나타내는 설정 파일인 .xml 확장자를 가진 파일들이 있다. 이 어노테이션은 '스프링님 사실 이 클래스는 설정 파일(.xml)인데 제가 자바로 써둔거에요'라는 의미다.
코드를 뜯어보니 답은 @Component이 @Configuration에 있다. 사실 둘은 같은 @Component 어노테이션 덕분에 실행이 되는 것이었다.
둘 다 @Component를 통해서 스프링 빈으로 등록이 되는 것이었다.하지만 차이가 있다. 근데 이 Repository는 원래 DB랑 연결할 때 사용하는 클래스다. 그렇기 때문에 기본적으로 필요한 예외처리가 등록되어있다. @Controller와 @Service 또한 이러한 특성들이 포함되어 있다. 이렇게 모든 코드들의 이유가 필요하다. 이런 편의성을 제공해주는 어노테이션을 공부해보고 사용해보는 습관을 들이자!