250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- python
- heapq
- HTTP
- 최소힙
- MSA
- 엔티티 그래프
- AVL트리
- spring
- 자료구조
- 멀티프로세서
- JVM
- 백준장학금
- Kruskal
- 운영체제
- 이분탐색이란
- 점근적 표기법
- 강화학습
- 연결리스트
- 알고리즘
- 프로세스
- SpringSecurity
- 완전이진트리
- posix
- jpa n+1 문제
- 최대 힙
- JPA
- 스케줄링
- 힙트리
- 연결리스트 종류
- 백준 장학금
Archives
- Today
- Total
KKanging
[Spring] DI 방법 본문
다양한 의존관계 주입 방법
- 생성자 주입
- 수정자 주입
- 필드 주입
- 일반 메서드 주입
생성자 주입
- 생성자를 이용해 의존 관계를 주입 받는 방법
- 특징
- 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다.
- 불변, 필수 의존관계에 사용
수정자 주입( setter 주입)
- setter 라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법
- 특징
- 선택, 변경 가능성이 있는 의존관계에 사용
- 자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.
필드 주입
- 특징
- 코드가 간결 하지만, 외부에서 변경이 불가능해서 테스트 하기 힘들다는 치명적인 단점이 있다.
- DI 프레임워크가 없으면 아무것도 할 수 없다
- 사용하지 않는걸 추천
- 애플리케이션의 실제 코드와 관계 없는 테스트 코드
- 스프링 설정을 목적으로 하는 Config 같은 곳에서만 특별한 용도로 사용된다.
일반 메서드 주입
- 굳이 이렇게 사용하나 싶다
생성자 주입을 추천
- 생성자 주입을 추천한다 이유는 다음과 같다
불변
- 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다.
- 오히려 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다.(불변해야 한다.)
- 수정자 주입을 사용하면, setXxx 메서드를 public으로 열어두어야 한다.
- 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일이 없다. 따라서 불변하게 설계할 수 있다.
누락
- 수정자를 통한 의존관계 주입은 컴파일 에러를 생산하지 않는다.
- 기본 실행은 컴파일 에러를 나타낼 수는 있지만 단위 테스트 같은 테스트는 컴파일 에러를 발생하지 않고 실행되기 때문에 에러를 잡기 힘들다.
롬복을 활용한 깔끔한 코드
위 처럼 코드를 짜는 것을 추천한다 하지만 뭔가 계속 의존관계를 설정할때마다 이렇게 하는것도 귀찮다.
그래서 Spring은 다음과 같은 기능을 지원한다.
생성자가 하나만 있을 때는 @AutoWired를 쓰지 않아도 하나 있는 생성자에 AutoWired를 적용한다.
근데 생성자 만드는 것도 귀찮다.
이렇게 하면 final 키워드를 쓴 필드 변수에 대한 생성자를 만들어준다.
코드가 훨 깔끔해졌다.
보충
롬복
롬복은 어노테이션 기반으로 개발자에게 편의를 제공하는 어노테이션이 많이 존재
따로 공부 추천
롬복 주의점
롬복을 사용하다 보면 위 같은 어노테이션을 많이 활용할 수도 있다.
하지만 위 어노테이션은 대도록이면 도메인 같은 Data 클래스나 일반적인 클래스에는 사용하지 않는걸
권한다는 여론이 많다
이유는 다음과 같다.
@AllArgsConstructor
public class Test{
private Integer t2;
private String t1;
}
public class TestClass{
public void Test(){
Test test = new Test("1" ,1);
}
}
위처럼 사용된다고 가정하자
근데 만약
@AllArgsConstructor
public class Test{
private String t2;
private Integer t1;
}
다음과 같이 변경되었다고 가정하자
그럼
public void Test(){
Test test = new Test("1" ,1);
}
위코드는 오류가 날 것이다.
따라서 웬만해서는 사용하는 것을 주의하자
'백엔드 > Spring framework' 카테고리의 다른 글
[spring test] TestContainer 로 Redis 의존성 해결하기 (0) | 2025.01.21 |
---|---|
JDK 프록시 , CGLIB 개념과 Spring AOP 가 CGLIB 를 채택한 이유 (0) | 2024.09.27 |
[Spring] 스프링 기초, 구조 분석 (0) | 2024.05.06 |