[스프링] 4. 스프링 빈과 의존관계

지니🧸·2023년 1월 25일
0

Spring Boot & JPA

목록 보기
33/35

본 문서는 인프런의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (김영한) 강의를 공부하며 작성한 개인 노트입니다.

스프링 빈을 등록하는 방법:
1. 컴포넌트 스캔과 자동 의존관계 설정
2. 자바 코드로 직접 스프링 빈 등록하기

🛩️ 컴포넌트 스캔과 자동 의존관계 설정

의존관계

  • 컨트롤러가 서비스를 통해 기능 작동
  • 빈 등록을 통해 가능케 함
  • src/main/java/hello.hellospring/controller에 MemberController 생성

컴포넌트 스캔

@Component이 있으면 스프링 빈으로 자동 등록

  • 기본적으로 패키지 내의 파일에서만 찾아서 등록함
  • 스프링은 스프링 컨테이너에서 스프링 빈을 등록할 때 싱글톤으로 등록
    • 싱글톤: 하나만 등록해서 공유
    • 같은 스프링 빈 -> 같은 인스터스

@Controller

스프링 컨테이너에 컨트롤러 annotation이 있으면 이를 생성하여 컨테이너에 넣어둠

  • 서비스를 사용할 때 객체로 생성해서 사용할 필요 없음 -> 여러 컨트롤러가 같은 객체를 사용하기 위해서는 등록만 하면됨
	@Controller
	public class MemberController {
    	
        private final MemberService memberService;
        
	}

@Autowired

  • 생성자, setter, field에 사용 가능
  • 연결할 때 사용하면 됨 (예) 서비스의 스프링이 컨트롤러에 연결을 시켜줌
  • 생성자에 사용하면 객체가 생성될 때 스프링 컨테이너에서 이 스프링 빈을 찾아서 주입함. (생성자가 1개만 있으면 생략 가능)
  • 서비스가 일반 클래스인 경우에는 컨트롤러와 연결이 안될 수도 있는데, 이 경우에 서비스에도 @Service annotation을 써서 스프링 빈으로 등록해주면 됨
    • Repository에도 @Repository
@Controller
public class MemberController {

	private final MemberService memberService;
    
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
@Controller
public class MemberController {
	
    @Autowired private MemberService memberService;
    
}
  • field 주입 방식은 코드를 수정하기 어려워서 추천 안함
  • test에는 편히 사용
@Controller
public class MemberController {

	private MemberService memberService;
    
    @Autowired
    public void setMemberService(MemberService memberService) {
    	this.memberService = memberService;
    }

}
  • 단점: 어차피 memberService을 바꾸게 될 일은 드물지만 public이기 때문에 노출이 됨

컴포넌트

@Repository, @Controller, @Service 모두 컴포넌트의 종류

🏕️ 자바 코드로 직접 스프링 빈 등록하기

Spring Config

src/main/java/hello.hellospring에 SpringConfig 생성

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService();
    }
}
  • @Bean으로 스프링 빈 등록

Controller

  • 컨트롤러는 스프링이 관리하는거라 @Controller와 @Autowired을 사용해야함
profile
우당탕탕

0개의 댓글