[Spring] Spring의 특징

mingsso·2023년 10월 17일
0

SpringBoot

목록 보기
1/11

1️⃣ 제어 역전(IoC)

일반적인 자바 개발의 경우, 개발자가 직접 객체를 제어해야 했다
(new 연산자를 통해 객체 생성, 의존성 주입, 초기화 등등)

의존성 주입

  • 의존성은 두 클래스 간의 관계를 말함 강한결합과 약한결합
    두 객체가 강한 결합을 이루고 있다면, 강한 의존성을 가지고 있다고 볼 수 있음
  • 주입은 생성자나 메소드 등을 통해 외부에서 생성된 객체를 전달받는 것
    ex)
class CPU {}

public class Computer {
    private CPU cpu;
   
    public void setCPU(CPU cpu) {
        this.cpu = cpu;
    }
}
  • 즉, 의존성 주입은 "의존 관계에 있는 클래스의 객체를 외부로부터 생성하여 주입받는 것"을 의미함


하지만 제어 역전을 특징으로 하는 스프링은,
사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 '외부'에 위임
여기서 '외부'란 스프링 컨테이너(=IoC 컨테이너)를 의미함


즉, 객체의 관리를 컨테이너에 맡겨 개발자에서 컨테이너로 객체의 제어권이 넘어간 것을 제어 역전이라고 한다

제어 역전을 통해 의존성 주입, 관점 지향 프로그램 등이 가능해진다



2️⃣ 의존성 주입(DI)

위에서도 언급했지만, 의존성 주입은 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 말한다

스프링에서 의존성을 주입받는 방법은 3가지가 있다

1) 생성자를 통한 의존성 주입

@Controller
public class DIController {
	(private final) MyService myService;
    
    @Autowired
    public DIController(MyService myServie) {
    	this.myService = myService;
    }
    
    @GetMapping("/di/hello")
    public String getHello() {
    	return myService.getHello();
    }
}

✨스프링 공식 문서에서 권장하는 방식
생성자로 의존성을 주입할 때 final로 선언할 수 있어, 의존성을 주입받는 객체의 불변성을 보장할 수 있음

2) 필드 객체 선언을 통한 의존성 주입

@Controller
public class FieldInjectionController {
	@Autowired
    private MyService myService;
}

코드가 간단하지만 외부에서 변경하기 힘들고, 객체지향적으로 좋지 않음

3) setter 메서드를 통한 의존성 주입

@Controller
public class SetterInjectionController {

	MyService myService;
    
	@Autowired
    public void setMyService(MyService myService) {
    	this.myService = myService;
    }
}

setter 메소드가 public이라 어디서든 수정이 가능함



3️⃣ 관점 지향 프로그래밍(AOP)

AOP는 '관점'을 기준으로 묶어 개발하는 방식으로, OOP를 더욱 잘 사용하도록 돕는 개념이다
여기서 '관점'이란 어떤 기능을 구현할 때 그 기능을 '핵심 기능'과 '부가 기능'으로 구분해 하나의 관점으로 보는 것을 말한다

  • 핵심 기능: 비즈니스 로직을 구현하는 과정에서 비스니스 로직이 처리하려는 목적 기능
  • 부가 기능: 핵심 기능인 비즈니스 로직 사이에 로깅 처리를 하거나 트랜잭션을 처리하는 코드 등

OOP 방식은 핵심 기능을 구현한 두 로직에 동일한 코드가 포함되게 된다

AOP 방식은 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 모듈화해 삽입할 수 있다


이러한 AOP를 구현하는 방법은 크게 3가지가 있다

  • 컴파일 과정에서 삽입하는 방식
  • 바이트코드를 메모리에 로드하는 과정에 삽입하는 방식
  • 프락시 패턴을 이용한 방식 (스프링이 사용하는 방법) -> 추후 보충






참고자료

도서 '스프링 부트 핵심 가이드'
https://velog.io/@damiano1027/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-%EC%A0%9C%EC%96%B4%EC%9D%98-%EC%97%AD%EC%A0%84
https://krapoi.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CJAVA-%EC%9D%98%EC%A1%B4%EC%84%B1%EC%A3%BC%EC%9E%85DI%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://dev-coco.tistory.com/70

profile
🐥👩‍💻💰

0개의 댓글