Full Stack Dev. Study- Spring Framework

김영빈·2021년 4월 4일
0

Full Stack Dev. Study

목록 보기
6/8

Spring Framework

Java 학습에 이어서 스프링 프레임워크의 기본인 spring triangle에 대해서 간단히 정리해보았다.
강의자료는 백기선님의 예제로 배우는 스프링 입문 (개정판)을 참고하였다.

Spring IoC

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 끼리만 가능하다.

Bean

Ioc Container가 관리하는 객체이다.
Bean으로 만드는 방법은 2가지가 있는데 Component Scan annotation을 사용하거나 직접 bean으로 등록해주는 방법이 있다.

  • @Component Scan
    @Controller 를 예시로 들면 @Controller는 내부적으로 @Component를 사용하는데 이 Component를 통해서 bean으로 등록한다.
    이와 같은 방식을 라이프사이클 콜백이라고 한다.
    라이프사이클 콜백 : @Component가 붙은 class를 찾고 그 class의 instance를 만들어서 bean으로 등록하는 annotation 처리기
  • 직접 bean 등록 (Java Bean Configuration file 만들기)
    @Configuration 과 @Bean 을 통해서 만든다.

DI(Dependency Injection)

의존성 주입을 하는 방법은 3가지가 있다.

  • 생성자로 주입하는 법(Spring에서 권장하는 방법)
    4.3 버전 이전에는 @Autowired 를 붙여야 했지만 4.3 이후 버전부터는 생성자가 1개이고 파라미터가 모두 Bean 객체라면 @Autowired를 생략 가능하다.
    @Autowired // 4.3 버전 이후부터 생략 가능
	public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
		this.owners = clinicService;
		this.visits = visits;
    }
  • field로 바로 주입하는 방법
    @Autowired private OwnerRepository repo;
  • Setter에 @Autowired 명시
    @Autowired
    public void setOwner(Owner owner) {[
    	this.owner = owner;
    }

AOP (Aspect Oriented Programming)

동일하게 사용되는 부분이 많을 경우 이를 한 번에 제어하는 방법이다.

@Transactional은 Spring AOP가 사용하는 애노테이션이다.
AOP의 구현 방법은 3가지가 있는데 Compile, Byte code 조작, 프록시 패턴이다.

  • Compile 방법 : compile 할 때 A.java -> (AOP) -> A.class 의 순서로 진행하는 방법으로 AspectJ가 제공하여 실제 코드에는 없지만 AOP를 통해 공통된 부분을 삽입하여 준다.
  • Byte code 조작 : A.java -> A.class -> (AOP) -> memory 의 순서로 진행하는 방법으로 A.class를 사용할 때 class 로더가 클래스를 읽어와서 memory에 올리기 직전에 조작하는 방법이다.
  • 프록시 패턴 : 디자인 패턴으로 AOP와 같은 효과를 내는 방법이다. 이의 예시가 앞서 언급했던 @Transactional이다.

PSA (Portable Service Abstraction)

환경의 변화와 관계없이일관된 방식의 기술 환경을 제공하는 추상화 구조를 말한다.

예를 들어 원래 라우팅 작업을 위해서는 servelet 기반으로 코딩을 해야하지만 이를 내부단으로 맡기고 개발자는 Annotation (@GetMapping, @PostMapping 등)을 통해서 routing을 할 수 있게 된다. 이 때 비슷한 코드로 서버를 바꿀 수 있는데 Tomcat, Netty 등으로 변경이 가능하다고 하여 Portable 이 붙게 되었다. 원래 Netty 기반으로 서버를 동작하게 하려면 Tomcat의 방식과는 많이 다르지만 Spring이 제공하는 Web MVC PSA를 사용해서 Netty를 비슷한 코드로 실행할 수 있다.

profile
초보 개발자

0개의 댓글