Spring

[Spring] Spring으로 변환하기

songsua 2025. 3. 23. 22:22
package hello.springbasic;

import hello.springbasic.discount.DiscountPolicy;
import hello.springbasic.discount.FixdiscountPolicy;
import hello.springbasic.discount.RatediscountPolicy;
import hello.springbasic.member.MemberService;
import hello.springbasic.member.MemberServiceImpl;
import hello.springbasic.member.MemoryMemberRepository;
import hello.springbasic.order.OrderService;
import hello.springbasic.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(new MemoryMemberRepository());
    }
@Bean
    public OrderService orderService() {
        //orderserviceImpl은 두개를 받고 있는데,
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixdiscountPolicy());
    }
@Bean
    public DiscountPolicy discountPolicy() {
       // return new FixdiscountPolicy();  이전 할인 정책
        return new RatediscountPolicy();
    }
}

 

package hello.springbasic;

import hello.springbasic.member.Grade;
import hello.springbasic.member.Member;
import hello.springbasic.member.MemberService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


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("sua", Grade.Basic, 1L);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        System.out.println(findMember);
    }
}
package hello.springbasic;

import hello.springbasic.member.Grade;
import hello.springbasic.member.Member;
import hello.springbasic.member.MemberService;
import hello.springbasic.order.Order;
import hello.springbasic.order.OrderService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


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);


        Member member = new Member("맴버a" , Grade.VIP, 1L);
        memberService.join(member);
        Order order = orderService.createOrder(1L,"음료" , 5000);
        System.out.println(order);


    }
}

 

기존에는 Appconfig을 불러와서 객체를 생성하고 그 안에서 객체를 생성하고 했지만, '@configuration' 을 사용해서 @Bean 과 연결하여 @Bean이 적힌 모든 메서드를 가져온다. 이렇게 모든 메서드를 호출하여 반환하는 객체를 스프링 컨테이너에 등록한다.
Appconfig을 불러오지 않아도 알아서 객체를 컨테이너에 넣어두고 사용하는 것이다.

이렇게 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다.

 

이렇게 사용하면 무슨 장점이 있을 까?

ApplicationContext 는 스프링 컨테이너이며, 인터페이스이다.

위에서 Appconfig를 사용한 방식은 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다.

 

new AnnotationConfigApplicationContext(AppConfig.class)를 실행하면서 스프링컨터네이가 생성된다.

 

@Bean이라고 적힌 것들을 컨테이너에 저장한다. 빈 이름은 보통 메서드 이름을 사용한다. 다만 빈의 이름은 무조건 다 다르게 해야한다.

 

스프링 컨테이너는 안에 코드를 보고 참고하여 의존관계를 주입한다(DI)

memberService() 는 memberRepository 를 의존하고, orderService는 memberRepository, discountPolicy 를 의존하는 등등 전부 확인하고 주입한다.

 

1. 빈을 먼저 생성 2. 의존관계 주입한다. 

 

'Spring' 카테고리의 다른 글

[Spring] 주문과 할인 도메인 설계  (0) 2025.03.16
[Spring] 회원등록 불러오기  (0) 2025.03.04
[Spring] 회원게시판 만들어보기  (1) 2025.03.02
[Spring] 웹 기초  (0) 2025.03.01