Java 학습에 이어서 스프링 프레임워크의 기본인 spring triangle에 대해서 간단히 정리해보았다.
강의자료는 백기선님의 예제로 배우는 스프링 입문 (개정판)을 참고하였다.
Ioc(Inversion of Control) : 제어권이 역전되었다
원래는 자기가 사용할 의존성은 자기가 만들어서 new OwnerRepository() 이런식으로 사용했는데 단순히 private OwnerRepository repo;
처럼 선언만하고 누군가 생성자를 통해서 OwnerController 밖에서 사용할 수 있게 생성자를 통해 받아준다.
class OwnerController {
private OwnerRepository repo; // 선언만!
public OwnerController(OwnerRepository repo) {
this.repo = repo;
}
}
위와 같이 의존성을 관리하는 일은 더이상 OwnerController가 하지 않고 밖에서 해주게 된다. 이를 IoC 라고 한다.
의존성 관리에 대해 알기 위해서 먼저 Bean을 설명하자면 Bean은 spring이 관리하는 '객체'로써 spring이 Bean을 주입해주고 이를 의존성 관리라고 한다.
Spring Ioc Container 는 Bean factory 또는 application context 인데 이는 bean을 만들고 bean 사이의 의존성을 엮어주며 container가 가지고 있는 bean들을 제공해주는 역할도 한다.
단, 모든 class가 bean으로 등록되는 것은 아니며 의존성 주입은 bean 끼리만 가능하다.
Ioc Container가 관리하는 객체이다.
Bean으로 만드는 방법은 2가지가 있는데 Component Scan annotation을 사용하거나 직접 bean으로 등록해주는 방법이 있다.
의존성 주입을 하는 방법은 3가지가 있다.
@Autowired // 4.3 버전 이후부터 생략 가능
public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
this.owners = clinicService;
this.visits = visits;
}
@Autowired private OwnerRepository repo;
@Autowired
public void setOwner(Owner owner) {[
this.owner = owner;
}
동일하게 사용되는 부분이 많을 경우 이를 한 번에 제어하는 방법이다.
@Transactional은 Spring AOP가 사용하는 애노테이션이다.
AOP의 구현 방법은 3가지가 있는데 Compile, Byte code 조작, 프록시 패턴이다.
환경의 변화와 관계없이일관된 방식의 기술 환경을 제공하는 추상화 구조를 말한다.
예를 들어 원래 라우팅 작업을 위해서는 servelet 기반으로 코딩을 해야하지만 이를 내부단으로 맡기고 개발자는 Annotation (@GetMapping, @PostMapping 등)을 통해서 routing을 할 수 있게 된다. 이 때 비슷한 코드로 서버를 바꿀 수 있는데 Tomcat, Netty 등으로 변경이 가능하다고 하여 Portable 이 붙게 되었다. 원래 Netty 기반으로 서버를 동작하게 하려면 Tomcat의 방식과는 많이 다르지만 Spring이 제공하는 Web MVC PSA를 사용해서 Netty를 비슷한 코드로 실행할 수 있다.