Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

To Dare Is To Do!

Spring 3계층 속 DI 본문

Spring

Spring 3계층 속 DI

Nick_Choi 2023. 11. 5. 09:46

 

지난번 Controller만을 구현하여 위의 결과를 출력해 보고 Controller 속에서 활용된 어노테이션들을 살펴보았다.

 

이번에는 Controller 뿐만이 아니라 Service, Repository 등 클라이언트와 데이터베이스 사이의 과정을 모두 구현하고 각 계층이 스프링으로부터 어떻게  의존성이 주입되는지 확인해 보려고 한다.

 

먼저 의존성, 즉 객체가 주입되기 위해서는 Spring 컨테이너의 관리를 받는 객체(스프링 빈)가 되어야 하며 스프링 빈으로 등록하는 방법에는 @Component@Configuration + @Bean 조합이 있다.

 

뒤의 예시는 @Component를 활용한 예시이다.

 

@Component

TestController의 @Controller 어노테이션을 뜯어보면 이 어노테이션이 @Component를 포함하고 있다는 것을 확인할 수 있다.

 

마찬가지로 TestService와 TestRepository 속 @Service@Repository@Component를 포함하고 있어 spring 컨테이너가 관리하는 객체(스프링 빈)로 등록되어 의존성 주입의 준비를 마친다.

 

이렇게 스프링 빈으로서 등록했으면 이제 의존성 주입 요청을 해주면 된다.

의존성 주입을 요청하는 방식은 3가지가 있지만 이번 예시에서는 @Autowired만 활용해 보려고 한다.

 

@Autowired를 통한 DI

package com.example.demo.Controller;

import com.example.demo.Service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

//@RestController
@Controller
public class TestController {

    @Autowired
    TestService service;

    //@RequestMapping(value="/test", method= RequestMethod.GET)
    @GetMapping("/test")
    @ResponseBody
    public String hello() {
        return service.getData();
    }
}

다음은 TestController의 service 필드에 @Autowired를 통해 TestService를 할당하여 DI를 수행한 예시이다.

 

@Autowired 어노테이션은 'service' 필드에 붙어 스프링 컨테이너에게 TestService 주입을 요청하는 역할을 맡는다.

요청을 받은 스프링 컨테이너는 자신에게 'TestService'라는 객체가 등록되어 있는지 찾아보고 @Service를 통해 'TestService'가 스프링 빈으로 등록되어 있었다는 것을 확인한 후 의존성 주입을 완료한다.

 

같은 과정을 통해 TestService의 repository 필드에 TestRepository를 주입해 줄 수 있다.

package com.example.demo.Service;

import com.example.demo.Repository.TestRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TestService {

    @Autowired
    TestRepository repository;

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

 

이렇게 각 계층에 필요한 의존성 주입을 완료했다면 메소드에서 주입받은 객체를 사용할 수 있게 된다.

이를 통해 클라이언트가 TestController에게 요청을 보내면 TestService를 거쳐 TestRepository 속 메소드를 통해 반환받은 값을 다시 TestService를 통해 TestController가 받아 json 기반의 HTTP Body 내용으로 클라이언트에게 보내줄 수 있게 된다.

package com.example.demo.Repository;

import org.springframework.stereotype.Repository;

@Repository
public class TestRepository {

    public String find() {
        return "TEST";
    }
}

'Spring' 카테고리의 다른 글

DTO vs VO vs Entity  (0) 2023.11.07
HTTP Method  (1) 2023.11.06
직접 만들고 뜯어본 Controller  (1) 2023.11.03
스프링의 꽃, 3계층  (0) 2023.10.31
DI와 IoC  (0) 2023.10.31