Spring 의존성 주입과 제어역전

주가희·2023년 12월 4일

noSQL
프론트 랭귀지는 다를 수 있음
직접적으로 sql은 쓰지 않을 수 있음

프론트 백앤드 둘 다 가능 자바스트립트
엔진이 다름 프론트 : 리액트 등등
백엔드 : ?

package com.example.di_aop.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

//view가 없음 , 리턴타입이 문자열
//프로그램의 결과물을 view로 던지는게 아니고 클라이언트한데 객체를 보냄
//클라이언트는 객체를 이해 못함
//공인된 xml,json 포멧 으로 보내줘야함 
//자바객체 -> 다른 랭귀지 (C#) 이해못함 
//객체를 xml문자 포맷으로 보내주면 xml을 다시 C#객체로 바꿀 수 있다
//자바스크립트가 나온 후에 json 
//json 방식을 사용 왜냐 그렇게 방대한 데이터를 가지고 오지 않으니까


@RestController
public class DIController {
	@GetMapping("/home")
	public A home() {

		return new A();
	}
}

class A{
	public int x;
	public int y;
}

서로간에 호출 -> 의존
s2가 s1에 의존
딸 아빠로 생각
딸이 아빠를 호출 (용돈달라고)

아빠가 있어야 딸이 있음(강한 결함)
아빠가 완성되어 있어야함 => s2가 완성되어 있어야 함

학생이 강사한테 의존
강사가 있어야 학생이 태어나는건 아님(약한 결합)

협업이 중요해지면서 모듈화 -> 약한결합으로 만들어져야함

완전의존적인 코드

Cat이 완성되지 않으면 Person이 에러남

여기서 의존성을 줄인다는건 -> 디커플링

new 뒤에는 무조건 생성자가 옴 -> 결합도가 높아짐

Cat이 없다는건

  1. 인터페이스를 만들어줌
package com.example.di_aop.s2;

public interface Animal {
	void move();
}

Animal 인터페이스가 있기때문에 Cat 이 dog로 바껴도 Person class의 코드가 바뀌지 않아도 됨 -> 결합도가 낮아짐

new 연산자를 없앤다 -> 외부에서 주입한다

API - Animal, Cat, Person 을 묶에서 주는 것(패킹)을 jar파일

자바객체지향을 어디서 썻는지 -> 의존성을 낮추기 위해 사용(인터페이스 문법)

  1. DI 디펜던시인젝션
    스프링을 사용하면 알아서 해줌 스프링의 큰 역할 1.DI
    스프링 MVC -> 서블릿 코드 안쓰려고
    mybatis -> jdbc 안쓰려고
    log 어쩌구 - System.out.print 안쓰려고
package com.example.di_aop.s1;

import com.example.di_aop.s2.Animal;

//딸
public class Person {
	Animal a;	
	public void walk() {
		//Cat과 결합도를 낮추기 위해 Cat데이터 타입 사용X <-- interface로 해결
		a.move();
	}
	
	public Person() {}
	//Cat과 결합도를 낮추기 위해 Cat()생성자 사용 X
	//cat에 의존하지 않기 때문에 null point 발생가능
	//호출하는 곳에서 DI를 사용할 수 있도록 생성자를 제공
	public Person(Animal a) {
		this.a = a;	//cat 을 주입할 수 있도록 코드추가
	}
}
package com.example.di_aop.s1;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.di_aop.s2.Cat;

@RestController
public class PersonController {
	@GetMapping("/person")
	public String Person() {
		Person p = new Person(new Cat());//생성자를 통해서 DI
		p.walk();
		return "yes";
	}

}

Spring에서
interface를 통해서 접근해야한다는건 변함 없음
대신 생성자, setter 대신 @Autowired사용

주입될 객체가 이미 존재해야한다(Spring에서는 bean)

Component 가 붙어있는 클래스
Component 애노테이션 -> 컨트롤러, 서비스, 레파지토리(대신 Mapper)

Spring에도 dao가 있어야하지만 mybatis를 사용하기 때문에 Mapper사용

Spring : DI, AOP(관점지향프로그램 특정 메소드가 호출되기 전에 호출할 수 있고 후에 호출할 수도 있음 왜 안쓰냐 1.SMVC에는 필터가 있어서 -> 또, 웹에서는 특정한 메소드를 호출할 일이 거의 없음 대부분 doGet, doPost를 가로채니깐.. 2.AOP를 자동으로 구현할 수 있는 API가 있음 intercepher인터셉트)
SpringMVC : 서블릿 안쓰려고
MB

필터는 서블릿을 가로챔
인터셉터는 컨트롤러를 가로챔
둘 다 요청을 가로챔

AOP는 메소드를 가로챔
AOP관련 라이브러리

org.springframework.boot
spring-boot-starter-aop

  
profile
주웅

0개의 댓글