성장일기 : 문과생의 개발 여정 (งᐖ)ว ( ᐛ )و

의존성 주입 본문

백엔드개발/Spring

의존성 주입

hyemi_flora 2024. 3. 14. 08:30

의존성

  • 하나의 클래스를 실행하기 위해 필요한 다른 클래스
  • 자바에서는 의존 관계를 구현하기 위해 생성자를 사용한다
  • 생성자를 사용하는 경우 유지보수 비용이 많이 발생한다

의존성 주입

  • 선언만 해놓으면 알아서 해당 클래스의 인스턴스를 채워주는 방식
  • 의존성을 외부에서 주입하여 객체간의 결합도를 낮출 수 있다
  • 스프링에서 의존성 주입을 활용하기 위해서는 반드시 기본 생성자가 구현되어 있어야한다

Java Bean Object 자바빈 객체

  • 데이터 클래스를 만들 때 계속해서 사용하던 방식
  • 필드값(속성)의 접근제어자는 private 이어야한다
  • 각 필드에 대한 접근은 Getter / Setter 를 활용해야한다
  • 기본 생성자가 반드시 존재해야 한다
  • 자바빈 스타일 객체는 자바 생태계에 속한 다양한 프레임워크, API들의 표준임으로 반드시 지키는 것이 좋다

스프링의 의존성 주입

  • 컨텍스트에 객체를 등록해 놓는다 (root-context)
  • 스프링이 컨텍스트에 등록된 객체로 인스턴스를 미리 만들어 놓는다 (싱글톤 활용)
  • 만들어진 인스턴스가 필요한(대입할) 변수가 있다면 해당 인스턴스를 제공한다 (즉 컨텍스트에 등록된 객체를 스프링이 적재적소에 분배)

의존성 주입을 위한 어노테이션들

@Component : 컨텍스트에 컴포넌트 스캔을 통해 수거해갈 수 있는 대상이 된다
@Controller : MVC 패턴에서 컨트롤러 역할을 수행하는 컴포넌트 들을 표시한 어노테이션
@Repository : MVC 패턴에서 모델 역할을 하는 컴포넌트들을 표시한 어노테이션
@Service : MVC 패턴에서 비지니스 로직 역할을 수행하는 컴포넌트들을 표시한 어노테이션
@Autowired : 컨텍스트에 등록된 컴포넌트 중에 알맞은 것을 요청하는 어노테이션

  • 생성자를 사용하지 않고 스프링이 대신 인스턴스를 생성하여 주입하기 때문에 클래스 간의 결합도가 낮아져 유지보수가 용의해진다

컨텍스트에 빈(Bean) 직접 등록하기

  • context:component-scan 을 통해 컴포넌트들을 컨텍스트에 등록할 수 있다
  • <beans: bean>으로 스캔을 통하지 않고 클래스를 컨텍스트에 직접 등록할 수도 있다.
    두 내용 모두 servlet-context 통해서 확인가능
  • 스캔을 통하지 않고 클래스를 컨텍스트에 등록할 수 있다
  • 컨텍스트에 등록된 자바 객체를 빈이라고 부른다
  • 컨텍스트에 등록한 자바 객체들을 싱글톤 디자인 패턴을 사용해 등록된다

싱글톤 (Singleton)

  • 어플리케이션 내에서 단 하나의 인스턴스만 가지고 있다는 것을 보장해주는 디자인 패턴

HomeController.java

package com.ezen.springmvc;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.ezen.springmvc.model.Cook;

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @Autowired //생성자를 사용하지 않아도 스프링에서 수거해간 후 그 클래스 바탕으로 인스턴스 만들어서 대입해준것
    Cook cook; // = new Cook();
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute("serverTime", formattedDate );
        model.addAttribute("cook", cook);
        System.out.println(cook);
        return "home";
    }

}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
    <h1>Hello world!</h1>

    <p>The time on the server is ${serverTime}.</p>
    <p>${cook}</p>
</body>
</html>

Cook.java

package com.ezen.springmvc.model;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
//@Component 
// 어노테이션이 사용되어 이 클래스를 Spring 빈으로 선언, Spring이 해당 클래스의 인스턴스를 관리하도록 지시하는 것 
// 컴포넌트 추가해야 JSP에서 수거해서 생성자를 만들어준다 (?)
public class Cook {
    @Autowired
    Dish dish; //= new Dish();
    @Autowired
    Food food; //= new Food();

    private Cook() {} // 접근제어하면서 막아도 동작쓰한다.

    @Override
    public String toString() {
        return String.format("%s/%s", food, dish);
    }

}

// web.xml에 모든것을 등록해놓고 필요할때 찾아 사용한다

Dish.java

package com.ezen.springmvc.model;

import org.springframework.stereotype.Repository;

@Repository
//@Component
public class Dish {

}

Food.java

package com.ezen.springmvc.model;

/*@Component*/
public class Food {

}

Food2.java

package com.ezen.springmvc.model;

import org.springframework.stereotype.Repository;

@Repository
//@Component
public class Food2 extends Food{

}

'백엔드개발 > Spring' 카테고리의 다른 글

MVC 디자인 패턴, 모델 속 요소들  (0) 2024.05.22
SPRING Framework  (0) 2024.03.23
메이븐 (Maven)  (1) 2024.03.14
스프링 프레임워크  (1) 2024.03.14
Spring - 설치 및 세팅  (1) 2024.03.14