1. 스프링 컨테이너와 의존관계
🔸 스프링 컨테이너 (Spring Container)
: 스프링 프레임워크의 핵심 요소로 스프링 애플리케이션의 객체들(Bean)들을 관리한다. 의존성 주입(Dependency Injection, DI)과 제어의 역전(Inversion of Control, IoC)을 통해 생성 및 객체간 관계설정을 수행한다.
※ 동작방식 : Spring이 수행될때 스프링 컨테이너가 어노테이션에 해당하는 객체(빈)로 생성하여 관리한다. 사용자는 필요시마다 객체를 직접 생성하지 않고 스프링 컨테이너에 등록되어 관리되는 하나의 객체를 공유하여 쓰는 방식을 이용한다.
🍃 DI (Dependency Injection) : 의존성 주입
의존관계 : 컨트롤러는 서비스를 통해 동작하고 서비스는 리포지토리를 통해 동작한다..
이러한 의존관계를 사용자가 직접 주입해주는 것이 아니라 스프링 컨테이너가 등록된 것 중 알맞은 것을 찾아서 자동으로 주입한다.
@Autowired : 스프링 컨테이너가 관리하는 빈(Bean)에서 알맞은 타입을 자동으로 찾아 해당 필드, 생성자, 또는 메서드에 주입한다.
이때 주입대상이 존재하지 않으면( 스프링빈으로 등록되지 않고 순수자바클래스로 존재하면 ) 스프링이 컨테이너를 구축하는데 오류가 발생한다.
순수자바클래스로 남아있거나 직접 생성한 자바클래스에서는 @Autowired가 동작하지 않게 된다.
/* 필드주입 */
@Controller
public class MemberController {
@Autowired private MemberService memberService;
}
/* Setter 주입 */
// 생성이후 setter가 호출되어 주입된다. setter가 노출되어야한다.( 추후 변경위험성 )
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
/* 생성자 주입 */
// 조립시점에 주입하여 완성
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.
🍃 스프링빈을 등록하는 2가지 방법
- 컴포넌트 스캔과 자동 의존관계 설정
- 자바 코드로 직접 스프링 빈 등록하기
스프링은 스프링 컨테이너에 빈을 등록할때 기본적으로 싱글톤으로 등록한다.( = 유일하게 하나만 등록하여 공유한다. ) 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.
2. 컴포넌트 스캔과 자동의존관계 설정
🍃 컴포넌트 스캔 원리
스프링컨테이너에 해당 스프링빈 객체를 등록한다.
@Component 를 포함하는 스프링의 기본구성 애노테이션( @Controller, @Service, @Repository )을 인식한다.
// 리포지토리 스프링빈 등록
@Repository
public class MemoryMemberRepository implements MemberRepository { ... }
// 서비스 스프링빈 등록, 의존성 주입
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
// 컨트롤러 스프링빈 등록, 의존성 주입
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
...
}
컴포넌트 스캔의 기본 범위는 @SpringBootApplication 클래스( @ComponentScan을 포함 )가 속한 패키지의 하위 (패키지의) 클래스들이다.
🍃 자바코드로 직접 스프링빈 등록하기
스프링빈 컴포넌트를 사용하지 않고 SpringConfig 클래스를 이용하여 스프링빈을 등록하고 의존성을 주입한다. ( 컨트롤러는 어노테이션방식으로 진행, config파일에서 설정불가 )
SpringConfig 클래스 : @Configuration 어노테이션이 붙은 클래스 스프링 컨테이너가 시작될 때 가장 먼저 실행되어 빈(Bean)을 정의한다. 애플리케이션 컨텍스트가 초기화되는 과정에서 빈 설정과 구성을 담당한다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
🔸 컴포넌트 스캔방식 + 자바코드 설정방식
실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경( 저장소의 구현체변경 )해야 하면 SpringConfig의 설정을 통해 스프링 빈으로 등록한다. SpringConfig의 설정은 개별적인 코드변경없이 간단하게 빈을 설정, 관리할 수 있는 점에서 편리하게 이용된다.
'web programming' 카테고리의 다른 글
[ 스프링 입문 ] 스프링 DB접근 기술 (2) | 2024.09.08 |
---|---|
[ 스프링 입문 ] 웹 MVC (0) | 2024.09.02 |
[ 스프링 입문 ] 회원관리 예제 (1) | 2024.09.02 |
[ 스프링 입문 ] 프로젝트 환경설정, 스프링 웹개발 기초 (1) | 2024.08.24 |
JPA(Java Persistence API) 기본개념 (0) | 2024.03.10 |