Spring 적용

김두현·2023년 5월 18일
1

Spring

목록 보기
6/13
post-thumbnail

Spring 컨테이너, Spring Bean

ApplicatoinContext는 Spring 컨테이너의 최상위 Interface인 BeanFactory를 상속받은 Class이자 Spring 컨테이너이다.

Spring 컨테이너 : 객체들의 설정 정보를 전달받아 생성하고 관리하는 역할이다.

Spring 컨테이너는 Interface인 ApplicationContext를 통해 생성되며,
구현체는 AnnotationConfigApplicationContext이다.

  • getBean() 메서드를 통해 Spring Bean, 즉 객체를 조회한다.

Spring Bean : Spring 컨테이너가 생성하고 관리하는 객체를 의미한다.

Spring Bean의 이름은 @Bean이 붙은 메서드 이름을 default로 사용한다.


getBean()

Spring Bean은 getBean() 메서드를 통해 조회하며, 방법은 크게 세 가지가 있다.

  • Bean의 이름으로 조회
    조회 대상이 존재하지 않으면 NoSuchBeanDefinitionException 에러가 발생한다.

  • Bean의 Interface로 조회
    조회하는 Interface로 등록된 Bean이 둘 이상이면 NoUniqueBeanDefinitionException 에러가 발생한다.

  • Bean의 Class로 조회 (사용 X)
    프로그램의 유연성이 떨어지므로, 안 좋은 예시이다.

@Configuration, @Bean

Spring은 @Configuration이 붙은 Class를 Spring Container에 등록한다.
여기서 @Bean이 붙은 메서드를 Spring Bean에 등록한다.

  • AppConfig.java
package spring_basic.core;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring_basic.core.discount.DiscountPolicy;
import spring_basic.core.discount.FixDiscountPolicy;
import spring_basic.core.discount.RateDiscountPolicy;
import spring_basic.core.member.MemberRepository;
import spring_basic.core.member.MemberService;
import spring_basic.core.member.MemberServiceImpl;
import spring_basic.core.member.MemoryMemberRepository;
import spring_basic.core.order.OrderService;
import spring_basic.core.order.OrderServiceImpl;

@Configuration
public class AppConfig
{
    @Bean
    public MemberService memberService()
    {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public OrderService orderService()
    {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy()
    {
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }

    @Bean
    public MemberRepository memberRepository()
    {
        return new MemoryMemberRepository();
    }
}

프로그램 동작

  • OrderApp.java
package spring_basic.core;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import spring_basic.core.member.Grade;
import spring_basic.core.member.Member;
import spring_basic.core.member.MemberService;
import spring_basic.core.member.MemberServiceImpl;
import spring_basic.core.order.Order;
import spring_basic.core.order.OrderService;
import spring_basic.core.order.OrderServiceImpl;

public class OrderApp
{
    public static void main(String[] args)
    {

        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        OrderService orderService = ac.getBean("orderService", OrderService.class);

       //실행 로직
    }
}

순수 Java로만 객체를 생성하고 DI를 하는 것에서 Spring Container를 통해 하도록 적용했다.
오히려 코드만 더 길어진 것같은데, 어떤 장점때문에 사용하는 것일까?

Spring의 장점은 어마무시하다. 다음 글부터 하나씩 살펴보자.


참고 자료

https://www.inflearn.com/course/스프링-핵심-원리-기본편


💕오류 지적 및 피드백은 언제든 환영입니다. 복제시 출처 남겨주세요!💕
💕좋아요와 댓글은 큰 힘이 됩니다.💕
profile
I AM WHO I AM

0개의 댓글