[Spring Boot] DI 구현 방법 3가지

2023. 5. 26. 20:04·개발/Spring Boot
728x90
반응형

DI를 구현하는 방법은 필드주입, 세터 주입, 생성자 주입으로 3가지가 있다.

이 3가지에 대해서 간단하게 정리하려고 한다.

 

먼저 DI를 하면 외부에서 의존성을 주입받기 때문에

(1) 테스트가 용이해지고

(2) 객체간 결합도를 낮추고

(3) 코드의 재사용성을 높인다.

 

 

1. 필드 주입

@Controller
public class FoodController {
	
    @Autowired 
    private FoodService foodService;
}

필드에 @Autowired 어노테이션만 붙여주면 의존성이 주입된다.

코드가 간결하지만 프레임워크에 의존적이고 외부에서 수정이 불가하다.

외부에서 수정이 불가하다는 것은 테스트 코드 작성시 객체를 수정수 없다는 말이 된다.

 

 

2. 세터 주입

@Controller
public class FoodController {
    private FoodService foodService;
    
    @Autowired
    public void setFoodService(FoodService foodService) {
    	this.foodService = foodService;
    }
}

세터는 어쩔수 없이 public으로 해야 한다.

세터주입에서 세터의 목적은 DI이다.

즉, 의존성을 주입할때 세터를 사용해야 하는것이다.

하지만 public으로 되어있는 세터는 의존성을 주입할때 이외에도 사용될수가 있다는 문제가 있다.

 

3. 생성자 주입

@Controller
public class FoodController {
	private final FoodService foodService;
    
    @Autowired
    public FoodController(FoodService foodService){
    	this.foodService = foodService;
	}
}

생성자는 처음 객체를 생성할때에만 실행되므로 불변성을 유지하면서 의존성을 주입받을 수 있다.

또한 객체끼리 서로 의존성을 가지고 있는 순환참조를 방지할수 있다.

필드 주입보다 코드가 길어보이지만 Lombok의 @RequiredArgsConstructor 어노테이션으로 생성자 코드를 생략할 수 있다.

추가로 테스트를 할 때 용이하다.

 

그래서 생성자는 필드 주입, 세터 주입의 단점들을 극복하는 주입 방법이라고 생각한다.

 

 

 

참고

https://dev-coco.tistory.com/70

https://programforlife.tistory.com/111

 

728x90
반응형

'개발 > Spring Boot' 카테고리의 다른 글

[Spring Boot] 오버로딩 언제 할 수 있을까  (0) 2023.06.11
[Spring Boot] Mockito란?  (1) 2023.05.31
[Spring Boot] dotenv(.env) 때문에 날려버린 2일  (0) 2023.05.24
[Spring Boot] 어노테이션 정리  (0) 2023.05.17
[Spring Boot] Setter vs Constructor vs Builder  (0) 2023.05.16
'개발/Spring Boot' 카테고리의 다른 글
  • [Spring Boot] 오버로딩 언제 할 수 있을까
  • [Spring Boot] Mockito란?
  • [Spring Boot] dotenv(.env) 때문에 날려버린 2일
  • [Spring Boot] 어노테이션 정리
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    React
    도커
    go
    ERC721
    js
    html
    프로그래머스
    컨테이너
    nodejs
    erc20
    30일챌린지
    CSS
    node
    30일 챌린지
    하이퍼레저
    mysql
    블록체인
    명령어
    node.js
    go언어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[Spring Boot] DI 구현 방법 3가지
상단으로

티스토리툴바