출처) 인프런 스프링 입문 강의
1) 컴포넌트 스캔 & 자동 의존 관계 설정
controller가 service, repository 사용할 수 있게 의존관계를 추가해야함
MemberController 생성
이렇게 @Controller 어노테이션만 있어도 (안에 아직 코드를 작성하지 않았어도)
springboot가 스프링 컨테이너 안에 객체를 만들어줌
@Controller
public class MemberController {
}
MemberService 의 경우 인스턴스를 controller마다 여러개 생성할 필요없이 하나를 생성하고
controller끼리 공유하는 것이 좋다
➡️ spring container에 하나를 등록하고 Autowired로 주입하면 됨
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
이 상태에서는 오류 발생!
MemberService는 순수한 class 즉, spring이 얘가 있는지 모른다 ...
== ⭐️ 스프링 빈으로 등록되어 있지 않다
따라서 Autowired를 해도 연결할 수 없음
1) MemberService를 스프링 빈으로 등록해야함 ➡️ @Service 어노테이션 추가하기
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class MemberService {
2) MemberRepository도 등록 -> @Repository 어노테이션 추가하기
MemberRepository는 구현체에다 적어주면 됨
@Repository
public class MemoryMemberRepository implements MemberRepository{
그림처럼 controller - service를 연결하기 위해 위에서 적었던 autowired가 잘 됨

controller가 생성 될 때 스프링 빈에 등록된 service를 가져다가 넣어줌
== 의존성 주입
그리고 service - repository를 를 연결하기 위해 service에도 autowired 해줌
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
MemberService에서 @service, @authowired 삭제
MemoryMemberRepository에서 @Repository삭제
컴포넌트 스캔이 아닌 직접 등록하는 방식
hello.hellospring > service > SpringConfig 클래스 파일 생성
package hello.hellospring;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
controller는 컴포넌트 스캔 방식 그대로 사용
...
@Bean
public MemberRepository memberRepository(){
return new DBrepository(); // 여기만 수정 (구현 클래스 변경)
}
}
DI (의존성 주입)에는 필드 주입, setter 주입, 생성자 주입 등 3가지 방법이 있음
의존 관계가 동적으로 변하는 경우는 없으므로 생성자 주입 권장
생성자 주입
생성하는 시점만 가능하고 이후 변경이 불가
@AutoWired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
필드 주입 (권장 X)
@Autowired private MemberService memberService;
세터 주입
public으로 노출되어서, 생성 이후에도 호출될 수 있음
priavte MembeerService memberService;
@AutoWired
public setMemberService(MemberService memberService){
this.memberService = memberService;
}