본문 바로가기

TIL

의존성 주입 해보기 (DI)

오늘은 시간이 없어서 간단하게 TIL을 작성 해 보겠습니다.

    List<Product> productList = new ArrayList<>();

    //1. 제품을 하나하나 객체로 만들어서 전체 리스트 객체로 집어넣는다.
    Product product1 = new Product(1,"Galaxy S25" , 1200000 , "최신 안드로이드 스마트폰" ,100);
    Product product2 = new Product(2,"iPhone 16" , 1350000 , "Apple의 최신 스마트폰" ,50);
    Product product3 = new Product(3,"MacBook Pro" , 2400000 , "M3 칩셋이 탑재된 노트북" ,100);
    Product product4 = new Product(4,"AirPods Pro" , 350000 , "노이즈 캔슬링 무선 이어폰" ,100);
    productList.add(product1);
    productList.add(product2);
    productList.add(product3);
    productList.add(product4);

    System.out.println("[ 실시간 커머스 플랫폼 - 전자제품 ]");
    productList.stream().forEach(product -> {
        System.out.println(product.getID() + "." + product.getName() + " | " + product.getPrice() + " | " + product.getDescription() + " | " + product.getQuantity());
    });

    System.out.println("0. 종료    | 프로그램 종료");
    Scanner sc = new Scanner(System.in);
    int menu = sc.nextInt();

    if (menu == 0) {
        System.out.println("프로그램을 종료합니다.");
    }

새로운 과제를 하는데 지금 코드를 보면 product객체를 생성해서 list에 넣어주고 그걸 프로그램 시작시 하나하나 출력해주는 것을 확인 할 수 있는데요.

 

코드가 너무 지저분하다는 느낌이 듭니다.

그래서 저는 새로운 repository를 만들겁니다. 원래 spring JPA에서 나오는 개념으로 알고있지만, 그래도 지금당장 저런 더러운 코드를 개선할 방법이있다면 사용하는게 맞다고 생각했습니다.

 

ProductRepositoryImpl 인터페이스의 상속을 받아서 getProducts 라는 메서드를 통해 임시 DB가 있다고 생각을하고 데이터를 불러와 보겠습니다.

public class ProductRepository implements ProductRepositoryImpl {
    public List<Product> getProducts() {
        return List.of(
                new Product("1", "Galaxy S25", 1_200_000, "최신 안드로이드 스마트폰", 100),
                new Product("2", "iPhone 16", 1_350_000, "Apple의 최신 스마트폰", 50),
                new Product("3", "MacBook Pro", 2_400_000, "M3 칩셋이 탑재된 노트북", 100),
                new Product("4", "AirPods Pro", 350_000, "노이즈 캔슬링 무선 이어폰", 100)
        );
    }
}

그리고 이제 main에서 관리하던 product를 commercSystem에서 관리하게 만들어서 main에서 product를 제어할 수 없고 오로지 시스템만 제어할 수 있게 변경 해 주었습니다.

public class CommerceSystem {
    //상품 리스트 객체를 여기서 관리
    List<Product> productList;

    // 생성자를 통해서 ProductRepositoryImpl 를 매개변수로 받고( 의존선 주입?? ) 데이터 할당
    CommerceSystem(ProductRepositoryImpl productRepository){
        this.productList = productRepository.getProducts();
    }

    // start 함수를 통해 커머스 시스템을 시작
    public void start(){
        System.out.println("[ 실시간 커머스 플랫폼 - 전자제품 ]");
        productList.forEach(product -> System.out.println(product.getId() + "." + product.getName() + " | " + product.getPrice() + " | " + product.getDescription() + " | " + product.getQuantity()));

        System.out.println("0. 종료    | 프로그램 종료");
        Scanner sc = new Scanner(System.in);
        int menu = sc.nextInt();

        if (menu == 0) {
            System.out.println("프로그램을 종료합니다.");
        }
    }
}

그리고 생성자를 보시면 ProductRepositoryImpl productRepository 을 매개변수로 받아서 의존성을 주입한 모습을 확인 할 수 있는데요 오늘 수업에서 이런식으로 의존성을 주입할 수 있다고 말씀해주신게 기억이나서 새로운 과제에 한번 적용시켜봤습니다.

 

그러나 아직 의존성 주입이 무엇인지 정확하게 모르기때문에 금요일은 가족여행으로 수업에 참석을 못하여 일요일 저녁에 공부하고 TIL을 작성해볼 생각입니다.