TIL

230314 [Spring] (Model / 의존성 주입)

하차모 2023. 3. 14. 17:28

1. Model 객체

  controller에서 html로 데이터를 보낼 때 model 객체를 사용한다.

  request.setAttribute()와 비슷한 역할을 한다.

@GetMapping("/test")
public String test(Model model) {

    //html로 데이터 보내기
    //model.addAttribute(보내는 이름, 데이터)
    model.addAttribute("name", "홍길동");
    model.addAttribute("age", "20");

    return "test";
}

 

2. IOC와 DI

  소프트웨어의 성능 향상과 수정 용이를 위해 성능 단위로 분해하는 것을 모듈화라고 하며, 각 기능을 모듈이라고 한다. 모듈의 독립성이 높을 수록 수정이 용이하고 재사용이 쉽다.

  모듈의 독립성은 응집도와 결합도에 의해 결정되는데 응집도는 높을수록, 결합도는 낮을수록 모듈의 독립성이 높다.

 

응집도를 높이고 -> AOP
결합도를 낮추자 -> IOC, DI

  IOC(Inversion Of Control : 제어의 역전) -> 객체를 생성하는 주체가 개발자에서 스프링으로
  DI(Dependency Injection : 의존성 주입) -> IOC를 실행한 개념

DI(의존성 주입)을 하는 방법
  1. 프로그램 실행 시 필요할 것 같은 객체는 모두 만들어 준다.
    1) 프로젝트 생성 시 기본 패키지 안에 있는 모든 클래스는 
       스프링이 자동으로 객체를 생성하는 후보가 된다(자격이 된다.)

    2) 객체 생성 어노테이션을 사용하여 객체를 생성한다.
    - 아래 네 가지 중 하나라도 붙어있는 클래스는 스프링이 객체를 자동 생성
      1) @Component -> 스프링 초창기 버전에 사용했음
      ------------------------------------------------------
      2) @Controller 
      3) @Service("만들어질 객체명 지정")

@Service
class MyServiceImpl{...}
-> MyServiceImpl myServiceImpl = new MyServiceImpl();

@Service("myService")
class MyServiceImpl{...}
-> MyServiceImpl myService = new MyServiceImpl();


      4) @Repository


  2. 만들어진 객체 중 필요한 객체를 의존성 주입시킨다.
    - 의존성 주입을 통해 객체를 생성하는 것도 어노테이션을 사용함
    1) @Autowired() - 자료형을 구분하여 객체의 의존성 주입을 시킨다.

@Component
class Board{...} -> Board board = new Board();

@Component
class Member{...} -> Member member = new Member();

//자료형 구분
@Autowired
private Member m; 
-> private Member m = member;
@Component
class Avante implements Car{...} -> Avante avante = new Avante();

@Component
class Sonata implements Car{...} -> Sonata sonata = new Sonata();

@Autowired
private Car c; // 오류 발생(자료형으로 구분 불가)


    2) @Resource() - 만들어진 객체명을 기준으로 의존성 주입을 시킨다.

@Component
class Avante implements Car{...} -> Avante avante = new Avante();

@Component
class Sonata implements Car{...} -> Sonata sonata = new Sonata();

//객체명으로 구분
@Resource(name="avante")
private Car c;