// 에드센스

스프링을 많이 써온건 아니지만 그래도 쓰긴 쓰고있는 이 시점에서 문뜩 의문이 들었다. 친구가 나에게 만약 "스프링이 뭐야?" 라고 물어온다면 나는 뭐라고 대답 할 것인가? 스프링을 써오면서 이게 뭔지 정확히 모르고 사용해온 것 같아서 스스로 부끄러움을 느꼈다. 그래서 한번 조사해보았다. 스프링 기본 원리를.

 

한 마디로 요약하면?

"IoC와 AOP를 지원하는 경량의 컨테이너 프레임워크"

 

이제 이 문장을 하나씩 뜯어보자

 

컨테이너가 뭘까?

컨테이너는 특정 객체의 생성과 관리를 담당하며 객체 운용에 필요한 다양한 기능을 제공한다. 애플리케이션 운용에 필요한 객체를 생성하고 객체 간의 의존관계를 관리한다는 점에서 스프링도 일종의 컨테이너라고 할 수 있다.

 

컨테이너의 종류

스프링에서는 BeanFactory와 이를 상속한 ApplicationContext 두 가지 유형의 컨테이너를 제공한다. BeanFactory는 스프링 빈을 관리하고 조회하는 역할을 담당한다. BeanFactory를 전부 상속받는 ApplicationContext는 메시지 소스를 활용한 국제화 기능, 환경변수, 애플리케이션 이벤트, 편리한 리소스 조회 와 같은 편리한 부가기능이 있다. BeanFactory를 직접 사용할 일은 거의 없으며 보통  Applicationcontext를 사용한다. 

 

출처: 김영한님의 스프링 핵심 원리

 

자 그럼 IoC는 뭘까?

애플리케이션 개발 시 중요한점 중에 하나는 낮은 결합도와 높은 응집도이다. 스프링의 IoC는 객체 생성을 자바 코드로 직접 처리하는 것이 아니라 컨테이너가 대신 처리하게 한다. 그리고 객체와 객체 사이의 의존관계 역시 컨테이너가 처리한다. 이처럼 프로그램의 제어 흐름을 개발자가 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)라고 한다.

 

의존성 주입

의존 관계란 객체와 객체간의 결합 관계이다. 한 객체에서 다른 객체의 변수나 메소드를 사용하려면 해당 객체의 레퍼런스 정보가 필요하다. DI기능을 사용하지 않고 순수 자바코드처럼 코드에서 new를 통해 객체를 직접 생성해서 사용하면 이는 높은 결합도를 가지게 된다. new를 사용하지 않고 의존성을 주입하는 방법은

 

1. XML을 통한 의존성 주입

2. 속성을 통한 의존성 주입

3. 어노테이션을 통한 의존성 주입

 

이 있는데 이중 3번에 대해서 3가지를 패턴을 소개하겠다.

 

1. 생성자 주입

@Component
public class SampleController {
    private SampleRepository sampleRepository;
 
    @Autowired
    public SampleController(SampleRepository sampleRepository) {
        this.sampleRepository = sampleRepository;
    }
}

 

2. 필드 주입

@Component
public class SampleController {
    @Autowired
    private SampleRepository sampleRepository;
}

 

3. Setter 주입

@Component
public class SampleController {
    private SampleRepository sampleRepository;
 
    @Autowired
    public void setSampleRepository(SampleRepository sampleRepository) {
        this.sampleRepository = sampleRepository;
    }
}

 

 

 

AOP는 뭘까?

직역하면 "관점지향프로그래밍"이다.

개발을 하다보면 코드 곳곳에서 공통적으로 요구되는 기능들이 있다. 예를들어 메소드들의 실행시간 로그라던가, 컨트롤러 호출 시 세션검사라던가 이런 기능을 구현하고 싶을때 모든 메소드마다 코드를 추가해가며 개발하기는 너무 비효율 적이기에 AOP라는 기능이 있는것이다. 

 

즉, AOP는 중복을 제거하기에 아주 효과적인 방법이다.

 

이또한 XML을 사용한 설정과 어노테이션을 사용한 설정이 있는데 나는 주로 후자를 많이 사용했다. (XML 너무 복잡해ㅠㅠ) AOP에 관해서는 나중에 따로 포스팅을 해보겠다.

 

 

오늘은 간단하게 스프링이 무엇인지에 대한 얕은 개념들을 알아보았는데 사실 너무 방대해서 눈감고 더듬는 그런 느낌이다. 언젠가 내가 알던 개념들이 한군대로 파파팍 모이며 스프링의 전체 모양을 이해하는 날이 빨리 오면 좋겠다. (1일 1포스팅만 해도 훨씬 일찍 올듯..)

 

 

참고:

https://asfirstalways.tistory.com/334

https://atoz-develop.tistory.com/entry/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI-Dependency-Injection%EC%9D%98-%EC%84%B8%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95

 

Spring 의 시작, 프레임워크의 구성요소와 동작원리

Spring Framework의 구성요소와 동작원리 POJO 스프링의 특징을 살펴보면 POJO라는 단어가 등장한다. POJO란 Plain Old Java Object로 직역하자면 평범한 옛날 자바 객체이다. 말 그대로 자바 객체인 것이다..

asfirstalways.tistory.com

 

+ Recent posts