[Spring] DI를 활용한 스프링 3계층 구현

GaramFlow·2023년 11월 5일
0

DI를 활용한 스프링 3계층 구현해보기

  • DI를 통해서 스프링 3계층을 구현해본다.
  • 구현해보면서 각 계층의 특징에 대해서 알아본다.
  • DI에 대해서 알아본다.

1) DI를 통한 스프링 3계층

  • 스프링에서 Controller / Service / Repository를 간단하게 구현해본다.
  • 구현 시, DI (Dependency Injection) 을 통해서 계층 간 의존성을 주입한다.

2) 구현해보기

(1) Controller

  • Thymeleaf를 사용하고 있음
  • Controller 계층은 사용자의 요청을 처리하고 응답을 반환하는 역할을 한다.
  • Service 계층의 빈(Bean)을 주입받아서 사용한다.
@Controller
public class MainController {
    @Autowired
    TestService testService;

    @GetMapping("test")
    public String main (Model model) {
        model.addAttribute("data", testService.find());
        return "test";
    }
}

(2) Service

  • Service 계층은 해당 애플리케이션의 비지니스 로직을 구현한다.
  • 데이터 액세스 계층인 Repository 계층한테 주입받아서 데이터를 처리하고 관리한다.
@Service
public class TestService {
    @Autowired
    TestRepository testRepository;

    public String find() {
        String data = testRepository.find();
        return data;
    }
}

(3) Repository

  • Repository 계층은 데이터베이스와 상호작용을 하는 계층이다.
@Repository
public class TestRepository {
    public String find() {
        return "TEST";
    }
}

3) DI를 통한 3계층 구현 설명

  • IoC 컨테이너에 빈(Bean)으로 등록되어 있어야 의존성 주입을 할 수 있다.
    • @Controller, @Service, @Repository 어노테이션을 통해 스프링 빈으로 등록된다.
  • @Autowired를 사용하면 IoC 컨테이너가 해당 객체를 찾아서 자동으로 주입해준다.
  • 빈으로 정상적으로 등록되있고 DI도 작동하고 있다면, Controller > Service > Repository > Service > Controller 흐름이 작동하게 된다.

4) DI 구현 세가지 방법

(1) 생성자 주입

  • 생성자를 통해 의존성을 주입받아 클래스의 필드에 할당한다.
  • 스프링 4.3 이상부터는 생성자가 하나만 있을 경우엔 @Autowired 어노테이션 생략이 가능하다.
@Component
public class Car {
    private final Engine engine;

    @Autowired
    public Car(Engine engine) {
        this.engine = engine;
    }
}

(2) 필드 주입

  • 필드에 직접 @Autowired 어노테이션을 사용하는 방법이다.
  • 방법은 간편하지만 테스트가 어렵고 유연하지 않다.
@Component
public class Car {
    @Autowired
    private final Engine engine;
}

(3) 세터 주입

  • 세터 메소드를 통해 의존성을 주입한다.
  • 선택적인 의존성 주입에 유용하다.
  • 객체를 불변 상태로 유지할 필요가 없는 경우 유용하다.
  • 클래스가 변경 가능 상태(mutable)가 된다.
@Component
public class Car {
    private final Engine engine;

    @Autowired
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}

2023/11/06 작성
2023/11/14 내용 수정 및 예시 추가

profile
간단한 지식 저장 및 공유를 위한 블로그입니다.

0개의 댓글