Super Kawaii Cute Cat Kaoani
본문 바로가기
⚙️ Back-end/SpringBoot

[SpringBoot]스프링 기본편 - 객체 지향 원리 적용 (2)

by wonee1 2025. 9. 6.
728x90

 

🖊️ 본 포스트는 인프런 김영한 스프링 기본편을 보고 정리한 내용입니다. 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

스프링 핵심 원리 - 기본편| 김영한 - 인프런 강의

현재 평점 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