kafka 스터디를 하면서 producer와 consumer를 spring boot로 구현하는 경우가 많다고 알고있는데 spring은 과거 web개발 프로젝트 때 사용을 해봤지만, spring boot는 새로 배워야할거 같아서 개발자 이동욱님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스라는 책도 읽고있다. 책이 실습 형식으로 구성되어있어 어렵지 않아 spring boot의 기초를 배우는데는 좋다. 하지만, Spring 사용이 3년이 지나다보니 AOP,IOC,DI 등 spring의 기본 개념과 JAVA의 Annotation이 생각이 나지 않아 글로 정리 하려고 한다.
1. Annotation(@) 이란?
어노테이션은 메타 데이터의 일종으로 이 코드가 어떤 용도로 사용될까 이 클래스는 어떤 역할을 하게 할까 라는 정보를 라벨링하는것으로. Spring에서 어노테이션은 AOP(관점 지향 프로그래밍)을 편리하게 구성 할 수 있게 해주며 정리 하자면 소스코드에 붙히는 라벨링과 같다. Spring은 이 라벨을 보고 내부적으로 코드를 생성해줘 개발자는 비즈니스 로직에만 집중 할 수 있도록 해준다.
2. AOP(Aspect Oriented Programming) 이란?
관점 지향이라고하면 말이 좀 어려운데 나는 관점보다는 기능이라고 이해하면 더 편한것 같다. AOP는 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높혀주는 프로그래밍 기법이다. AOP는 핵심 기능과 공통 기능을 분리하여 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용할 수 있도록 만들어 준다. 예를 들어 내가 데이터를 가져오는 ETL코드를 작성했다고 하면 그 ETL처리의 데이터를 검증하는 코드를 ETL핵심 로직과 분리하여 만들어 데이터 검증 코드가 변경이 되어도(데이터 기준 계산 변경 sum -> avg) ETL 기능을 하는 코드는 수정하지않아도 된다. Spring은 핵심 코드가 수행되는 앞이나 뒤에 공통 코드를 실행 시킬 수 있도록 해준다.
3. IoC(Inversion of Control)
IoC란 한글로 번역하면 제어의 역전이라고 하는데 쉽게 말해 제어권이 바뀌었다 라고 할 수 있다. 그러면 어떤 제어가 어디에서 어디로 바뀌었다는 걸까? 원래 자바에서 객채를 생성하고 객체간의 의존관계를 연결하는 제어권은 개발자가 가지고 있었다. 하지만 Spring에서는 이러한 제어권을 Spring이 가져가 객체의 생성 및 생명주기 까지 관리한다. 이렇게 Spring이 객체의 제어권을 가져가 개발자는 객체 생성에 대해 신경 쓰지않고 비즈니스 코드에만 집중하여 변경에 유연한 코드 구조를 만들 수 있도록 해준다.
4. DI(Dependency Injection)
DI란 한글로 번역하면 의존성 주입이라고 하는데 여기서 의존이란 무었일까? 의존이란 객체 간의 의존 관계를 의미하는데 의존 관계란 A 객체와 B 객체간에 참조가 되었다는 말이다. A가 B에 의존관계가 있다면 B가 바뀐다면 A에도 영향이 가는 구조이다. Spring에서 DI를 하는 방법은 아래와 같다.
- Field Injection : 필드에 @Autowired 어노테이션 붙히기.
- Constructor based Injection : 생성자 생성으로 의존성 주입으로 현재 spring에서 가장 권장하는 방법이다.
- Setter Based Injection : Setter 메소드에 @Autowired 어노테이션 붙히기.
DI를 보면 객체생성을 Spring에서 해주고 객체간 의존성을 주입해주는데 DI가 바로 위에서 설명한 IoC를 구현하는 방식중 하나로 Spring에서는 IoC 프로그래밍 모델 구현은 DI라는 방식을 통해서 구현하고 있는것이다.