일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- javaJVM
- 격파르타비전공자
- 프로그래머스
- java 자료구조 활용
- 항해99후기
- java참조자료형
- 컴파일
- java list 출력
- 비전공자sqld
- java map
- 격파르타합격후기
- java알고리즘
- 코딩부트캠프후기
- java set 출력
- 인터프린터언어
- java map 저장
- java최솟값구하기
- java map 출력
- 노베이스부트캠프
- 격파르타장점
- java list 저장
- java set 저장
- 작은수제거하기
- java기본자료형
- 격파르타후기
- 프로그래머스제일작은수
- 항해15기
- java알고리즘문제풀이
- sqld자격증합격
- javaJRE
- Today
- Total
코딩과 결혼합니다
스프링 입문 : 스프링 빈과 의존관계 본문
개발자가 직접 객체를 생성하고 관리하는 것에는 여러 가지 불편함을 초래할 수 있다.
첫 번째로 코드 간의 강한 결합성을 가지게 되어, 하나의 변화가 전체적인 코드 변경을 요구하는 경우가 많아진다.
예를 들어 A클래스가 B클래스를 사용하는데, 이 클래스를 직접 new 연산자를 통해 생성한다면, B클래스가 변경되면 A클래스도 함께 변경해야 한다. 이는 유지보수를 어렵게 만든다.
두 번째는 테스트가 어려워질 수 있다. 테스트를 위해 실제 객체를 생성하거나, 테스트를 위한 별도의 코드를 작성해야 할 수도 있다. 이는 테스트의 복잡성을 증가시키며, 효율성을 저하시킬 수 있다.
세 번째는 DI를 사용하면, 필요에 따라 다양한 객체를 주입받아 사용할 수 있다. 그러나 직접 객체를 생성하면, 해당 객체만을 사용해야 하기 때문에 코드의 재사용성이 감소하게 된다.
따라서 DI를 활용하여 이러한 불편함을 최소화하고, 코드의 유연성, 테스트 용이성, 재사용성을 높이는 것이 좋다.
스프링 빈을 등록하는 두 가지 방법
1. 컴포넌트 스캔과 자동 의존관계 설정
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
- @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
- @Controller, @Service, @Repository 등의 애노테이션은 @Component를 포함하며 위와 같이 동작한다.
- 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.
- 이렇게 스프링이 개발자 대신에 객체 의존관계를 관리하고 주입해 주는 것을 DI, 의존성 주입이라고 한다.
2. 자바 코드로 직접 스프링 빈 등록하기
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
애노테이션을 사용하지 않고 스프링 빈을 등록하는 방법이다.
이 두 가지 방법은 각각의 장단점이 존재한다.
3. 장단점
1) 애노테이션 기반의 자동 설정 방법
- 애노테이션을 클래스 위에 붙이기만 하면 자동으로 빈으로 등록되어 편리하고 간단하다.
- 개발자는 직접 빈의 생성과 관리를 신경 쓰지 않아도 되므로 생산성을 높일 수 있다.
- 빈의 생성과 관리를 스프링이 해주기 때문에 설정이나 생명 주기 등을 세부적으로 제어하기 어렵다.
2) 직접 코드로 빈을 등록하는 방법
- 복잡한 빈 설정이 필요한 경우에 유용하며, 빈의 생성과 주입 과정을 명확하게 알 수 있어 유지보수에 도움이 된다.
- 의존해야 할 클래스가 변경될 경우 컴포넌트 기반으로 작성한 경우 수정해야 할 코드가 많다. 하지만 직접 코드로 빈을 등록할 경우에는 설정파일만 수정해 주면 된다.
- 빈을 직접 코드로 등록하면, 코드가 복잡해지고 작성해야 할 코드량이 많아진다.
의존 관계를 추가하는 방법
1. 생성자 주입
@Service
public class SomeService {
private final SomeRepository someRepository;
public SomeService(SomeRepository someRepository) {
this.someRepository = someRepository;
}
}
이 방법은 불변성을 보장해 준다. 필드 주입이나 세터 주입을 사용하면, 주입받은 객체를 변경할 수 있다. 그러나 생성자 주입을 사용하면, 한 번 주입받은 객체를 변경할 수 없다. 이는 객체의 상태를 예측하기 쉽게 하며, 버그 발생 가능성을 줄여준다.
다음으로 Null 안정성을 보장한다. 생성자를 통해 의존성이 모두 주입되므로, Null을 참조할 위험이 없다. 필드 주입이나 세터 주입을 사용할 경우에는 주입받는 필드가 Null 상태로 남아있을 수 있다.
**스프링 4.3 이후부터 생성자가 하나만 있는 경우 @Autowired 어노테이션을 생략해도 자동으로 의존성이 주입된다.
2. 필드 주입
@Service
public class SomeService {
@Autowired
private SomeRepository someRepository;
}
클래스 내부의 필드에 직접 @Autowired 어노테이션을 사용하여 의존성을 주입하는 방법이다. 이 방법은 간결하고 직관적이다.
3. 세터 메소드 주입
@Service
public class SomeService {
private SomeRepository someRepository;
@Autowired
public void setSomeRepository(SomeRepository someRepository) {
this.someRepository = someRepository;
}
}
선택적인 의존성이 있는 경우에 유용하며, 필요에 따라 의존성을 변경할 수 있다.
'2세 > Spring' 카테고리의 다른 글
스프링부트 쓰면서 알게된 스프링의 초간단 편리한 설정 (0) | 2024.02.05 |
---|---|
spring 유용한 단축키 모음 (0) | 2024.02.05 |
null을 처리하는 방법 (0) | 2024.02.04 |
스프링 입문 : 정적 컨텐츠, MVC, API (0) | 2024.02.04 |
스프링 입문 : 라이브러리 살펴보기 (0) | 2024.02.03 |