본문 바로가기

Backend/Spring

의존 관계 자동 주입 의존 관계 주입 방법 - 생성자 주입 - 수정자 주입 (setter 주입) - 필드 주입 - 일반 메서드 주입 생성자 주입의 경우, 생성자를 통해서 의존 관계를 주입받는 방법이다. 생성자 호출 시 한 번만 호출되는 것이 보장된다. 불변, 필수 의존 관계에 사용한다. // OrderServiceImpl.java package ghdtjgus76.core.order; import ghdtjgus76.core.discount.DiscountPolicy; import ghdtjgus76.core.discount.FixDiscountPolicy; import ghdtjgus76.core.discount.RateDiscountPolicy; import ghdtjgus76.core.member.Member; impo.. 더보기
컴포넌트 스캔 컴포넌트 스캔과 의존 관계 자동 주입 시작하기 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또한, 의존 관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. 코드로 한 번 알아보자. // AutoAppConfig.java package ghdtjgus76.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan(exc.. 더보기
싱글톤 컨테이너 앱 애플리케이션과 싱글톤 앱 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 스프링 없는 순수한 DI 컨테이너 테스트 // SingletonTest.java package ghdtjgus76.core.singleton; import ghdtjgus76.core.AppConfig; import ghdtjgus76.core.member.MemberService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class SingletonTest { @Test @DisplayNa.. 더보기
스프링 컨테이너와 스프링 빈 스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); 여기서 ApplicationContext를 스프링 컨테이너라고 한다. ApplicationContext는 인터페이스이다. 그리고 스프링 컨테이너는 XML 기반으로 생성할 수도 있고, 애노테이션 기반 자바 설정 클래스로 만들 수도 있다. 위 방식은 애노테이션 기반 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. 스프링 컨테이너 생성 과정 1. 스프링 컨테이너 생성 스프링 컨테이너 생성 시 구성 정보를 지정해주어야 하는데, 여기서는 AppConfig.class로 지정했다. 2. 스프링 빈 등록 스프링 컨테이너는 .. 더보기
스프링 예제-2 새로운 할인 정책 개발 // RateDiscountPolicy.java package ghdtjgus76.core.discount; import ghdtjgus76.core.member.Grade; import ghdtjgus76.core.member.Member; public class RateDiscountPolicy implements DiscountPolicy { private int discountPercent = 10; @Override public int discount(Member member, int price) { if (member.getGrade() === Grade.VIP) { return price * discountPercent / 100; } else { return 0; }.. 더보기
스프링 예제-1 비즈니스 요구사항과 설계 회원 회원 가입 및 조회 가능 회원은 일반과 VIP로 나뉜다. 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. 주문과 할인 정책 회원은 상품을 주문할 수 있다. 회원 등급에 따라 할인 정책을 적용할 수 있다. 모든 VIP의 경우 1000원을 할인해주는 고정 금액 할인을 적용한다. 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책은 미확정이다. 아직 미확정인 회원 데이터와 할인 정책은 인터페이스로 만들고 상황에 따라 구현체를 갈아끼우는 방식으로 설계하면 된다. 회원 도메인 설계 회원 도메인 협력 관계 회원 클래스 다이어그램 회원 객체 다이어그램 회원 도메인 개발 // Grade.java package ghdtjgus76.core.member; p.. 더보기
객체 지향 설계와 스프링 역할과 구현을 분리하자. 역할과 구현을 분리해서 생각해보자. 예를 들어서 운전자 - 자동차 관계가 있을 때, 운전자는 자동차의 내부 구조를 몰라도 운전하는데 아무 지장이 없다. 만약, 운전자가 테슬라를 몰다가 아반떼로 차를 바꿨다고 해도 전혀 문제가 되지 않는다. 이는 역할과 구현을 분리해서 생각했기 때문에 가능한 것이다. 운전자는 클라이언트고, 자동차는 역할, 테슬라나 아반떼는 구현체 정도로 생각하면 된다. 역할과 구현으로 분리해서 생각하면 대체 가능성이 생긴다. 따라서 변경이 용이하고 유연해져서 확장 가능성이 생기는 것이다. 자바 언어와 이를 연결시켜보자. - 역할 = 인터페이스 - 구현 = 인터페이스를 구현한 클래스, 구현 객체 객체를 설계할 때 역할과 구현을 명확히 분리하고, 역할을 먼저 부여한 .. 더보기