728x90
🖊️ 본 포스트는 인프런 김영한 스프링 기본편을 보고 정리한 내용입니다.
스프링 핵심 원리 - 기본편| 김영한 - 인프런 강의
현재 평점 5.0점 수강생 48,140명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 스프링 기본 기능, 스프
www.inflearn.com
4. 스프링으로 전환하기
스프링에서의 IoC/DI 컨테이너
- ApplicationContext는 스프링의 대표적인 IoC/DI 컨테이너
- @Configuration + @Bean, 또는 @Component + @Autowired 기반으로 객체 생성 & 주입 관리한다.
- 개발자는 오직 인터페이스에 의존한다 → 스프링이 구현체(구체 클래스) 선택 + 주입 담당한다
AppConfig 스프링 기반으로 변경
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
AppConfig에 설정을 구성한다는 뜻의 @Configuration을 붙여준다.
또한 각 메서드에 @Bean 을 붙여준다. 이렇게 하면 스프링 컨테이너에 스프링 빈으로 등록한다
⭐ 어노테이션 상세 설명
더보기
@Configuration
- 클래스에 붙이는 어노테이션
- 이 클래스가 스프링 설정 클래스(= AppConfig 역할)임을 나타냄
- 스프링은 @Configuration이 붙은 클래스를 읽고, 안에 있는 @Bean 메서드들을 모두 실행해서 리턴된 객체들을 스프링 컨테이너에 등록함
- 이렇게 등록된 객체들을 스프링 빈(Bean)이라고 부름
@Bean
- 메서드에 붙이는 어노테이션
- 해당 메서드가 리턴하는 객체를 스프링 컨테이너가 관리할 빈(Bean)으로 등록
- 메서드 이름이 빈의 이름이 됨 (필요하면 @Bean(name="이름")으로 변경 가능)
MemberApp에 스프링 컨테이너 적용
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("find Member = " + findMember.getName());
}
}
- ApplicationContext
- 스프링 컨테이너(= IoC/DI 컨테이너) 인터페이스다.
- 여기서는 AnnotationConfigApplicationContext 구현체를 사용 → @Configuration 기반 설정 클래스(AppConfig) 읽어들인다.
- AppConfig.class 전달
- AppConfig 설정 정보를 기반으로 스프링이 객체를 생성, 관리, 의존관계 주입
- getBean("memberService", MemberService.class)
- AppConfig에서 @Bean으로 등록한 "memberService" 빈을 가져온다
OrderApp에 스프링 컨테이너 적용
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService",
OrderService.class);
long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
System.out.println("order = " + order);
}
}
스프링 컨테이너란?
ApplicationContext를 스프링 컨테이너라고 한다. 스프링 컨테이너는 다음과 같은 특징이 있다.
1. 객체 관리 자동화
- 개발자가 일일이 new 해서 객체를 만들 필요 없다
- 컨테이너가 빈 생성 → 관리 → 소멸까지 전부 책임진다
- 같은 빈을 여러 번 요청해도 하나만 만들어 재사용가능하다. 따라서 메모리 절약, 성능 최적화
2. 의존관계 주입(DI) 자동화
- 컨테이너가 필요한 의존관계를 알아서 주입해 줌
- 개발자는 인터페이스(역할)만 의존 → 구체 클래스(구현체) 선택은 스프링이 담당한다
- DIP, OCP 원칙을 자연스럽게 지킬 수 있다
3. 설정 정보의 일원화
- @Configuration + @Bean을 통해 애플리케이션 전체 구조(객체 생성과 관계 연결)를 한눈에 볼 수 있다
- "어떤 구현체가 주입되는가?"를 코드 여기저기 뒤질 필요 없이 설정 클래스만 보면 된다
4. 유연한 확장성
- 구현체를 교체할 때 클라이언트 코드 수정이 필요 없다
- FixDiscountPolicy → RateDiscountPolicy 교체 시 AppConfig만 수정하면 된다
- 다양한 환경(개발, 테스트, 운영)에 맞게 빈 구성을 변경하기 쉽다
728x90
'⚙️ Back-end > SpringBoot' 카테고리의 다른 글
[SpringBoot] 스프링 컨테이너와 스프링 빈 (0) | 2025.09.10 |
---|---|
[SpringBoot]스프링 기본편 - 객체 지향 원리 적용 (1) (1) | 2025.09.06 |
[SpringBoot] 단방향, 양방향 연관관계 정리 (0) | 2025.05.15 |
[Spring Boot] 3주차 스터디 : 7장 AWS에 데이터베이스 환경을 만들어보자 - AWS RDS (0) | 2025.02.04 |
[Spring Boot] 3주차 스터디 : 6장 AWS 서버 환경을 만들어보자 - AWS EC2 (0) | 2025.01.24 |