스프링 컨테이너

- 자바 객체의 life-cycle 관리

- Dependency Injection (DI) 수행

보통, ApplicationContext를 스프링 컨테이너라고 함. 

스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.

스프링 컨테이너는 싱글톤 컨테이너 역할을 함.

 

의존 관계 자동 설정

1. Java Code 기반 설정

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        // 생성자를 통해 들어감.. (생성자 주입)
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemoryMemberRepository memberRepository() {
        System.out.println("call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        System.out.println("call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

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

 

2. Annotation 기반 설정

@Configuration
@ComponentScan(
        // 탐색할 패키지의 시작 위치 지정
        /*
         라이브러리까지 다 뒤지기 때문에 모든 걸 탐색하면 시간 매우 오래 걸림
         default: @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 됨. (여기선 모든 걸 뒤짐)
         권장: 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 둠.
         */
        basePackages = "hello.core",
        basePackageClasses = AutoAppConfig.class,
        // component scan에서 뺄 것들 (configuration 자동으로 등록되면 중복 설정됨)
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}

 

의존관계 주입

- 생성자 주입

- 수정자 주입(setter 주입)

- 필드 주입

- 일반 메서드 주입

-> 대부분의 경우 생성자 주입을 사용

 

생성자 주입

- 생성자 호출 시점에 딱 1번만 호출되는 것이 보장됨.

- 불변, 필수 의존관계에 사용

생성자 주입은 프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 잘 살리는 방법

생성자 주입
그 때 값 setting.. 그 이후 setting 막을 수 있음
-> 외부에서 수정X
memberRepository 외부에서 수정 불가. discountPolicy도 생성될 때만 .. instance 자체를 수정할 방법X
인위로 수정하는 메서드 만들면 안 됨 ex) setMemberRepostiory, setDiscountPolicy
 객체를 생성할 때(bean을 등록하면서), 실행

 setter 주입
 생성자 실행 후, setter로 의존관계 주입
 memberRepository가 스프링에 등록 안 됐을 때도 사용가능
 -> 선택적으로 할 수 있음 (discountPolicy만 의존관계 주입)
 중간에 변경 가능 (거의 없는 경우긴 함)
 참고:자바빈 프로퍼티

 필드 주입
 매우 간단!
 테스트할 때, memberRepository를 더미 데이터로 만들고 싶어도, 할 수 있는 방법X
 스프링 컨테이너에서 관리하는 것만 가능하지, 순수 자바 코드에서는 작동X

 

'기타' 카테고리의 다른 글

[Spring] 좋은 객체 지향 설계의 5가지 원칙(SOLID)  (0) 2023.04.16

SOLID 클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리

• SRP: 단일 책임 원칙(single responsibility principle)

• OCP: 개방-폐쇄 원칙 (Open/closed principle)

• LSP: 리스코프 치환 원칙 (Liskov substitution principle)

• ISP: 인터페이스 분리 원칙 (Interface segregation principle)

• DIP: 의존관계 역전 원칙 (Dependency inversion principle)'

 

 

SRP 단일 책임 원칙 Single responsibility principle

• 한 클래스는 하나의 책임만 가져야 한다.

 

OCP 개방-폐쇄 원칙 Open/closed principle

• 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.

 

LSP 리스코프 치환 원칙 Liskov substitution principle

• 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다

 

ISP 인터페이스 분리 원칙 Interface segregation principle

• 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다

 

DIP 의존관계 역전 원칙 Dependency inversion principle

• 프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.” 

 

 

스프링은 다음 기술로 다형성 + OCP, DIP를 가능하게 지원

• DI(Dependency Injection): 의존관계, 의존성 주입

• DI 컨테이너 제공

'기타' 카테고리의 다른 글

[Spring] DI (Dependency Injection) 의존성 주입  (0) 2023.04.23

https://www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

 

문제 풀이(코드)
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int m = scan.nextInt();
        int n = scan.nextInt();
        
        // 소수면 false, 소수가 아니면 true
        boolean[] checked = new boolean[n + 1];
        checked[0] = checked[1] = true;
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (!checked[i]) { // checked[i]가 false일 때 = 소수일 때
                for(int j = i * i; j <= n; j += i) {
                    checked[j] = true; // checked[j]는 소수가 아님
                }
            }
        }
        
        for (int i = m; i <= n; i++) {
            if (!checked[i]) { // checked가 false = 소수
                System.out.println(i);
            }
        }
        
        scan.close();
    }
}

https://www.acmicpc.net/problem/1978

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

 

문제 풀이(코드)
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        int max = 1000;
        
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] array = new int[n];
        for (int i = 0; i < n; i++) {
            array[i] = scan.nextInt();
        }
        
        // 소수면 false, 소수가 아니면 true
        boolean[] checked = new boolean[max + 1];
        checked[0] = checked[1] = true;
        for (int i = 2; i < Math.sqrt(max); i++) {
            if (!checked[i]) { // checked[i]가 false일 때 = 소수일 때
                for(int j = i * i; j <= max; j += i) {
                    checked[j] = true; // checked[j]는 소수가 아님
                }
            }
        }
        
        int count = 0;
        for (int i = 0; i < n; i++) {
            if (!checked[array[i]]) { // checked가 false = 소수
                count++;
            }
        }
        System.out.println(count);
        
        scan.close();
    }
}

+ Recent posts