Spring 입문 2-1 (3 Layer Architecture ~ IoC, DI)

SJ.CHO·2024년 9월 30일

3 Layer Architecture

  • 객체지향 관점의 Spring 프로그래밍 기법.
  • 작은 구조의 프로그램이면 Controller Class 에서만 구현을해도 문제가 없지만, 확장됄수록 많은 문제가 발생.
  • Controller, Service, Repository 3개로 분리

Controller

  • Client의 요청을 받음.
  • 요청에 대한 비즈니스 로직을 Service단에게 전달. (Data) 존재시 함께 전달
  • 완성된 답안 Data를 Client 에게 재전달

Service

  • 실제 비즈니스로직을 처리하는 부분
  • DB에 데이터를 저장하거나 조회할 경우에는 Repository 계층을 통해서 처리

Repository

  • DB 관리(CRUD) 작업을 처리

좋은코드

  • 논리가 간단해야함.
  • 중복을 제거하고 기능에대한 표현이 명확해야함
  • 코드를 처음보더라도 이해 및 수정이 간단해야함
  • 의존성을 최소화 (의존성은 변경을 전파한다)

IoC (Inversion of Control)

의존성 이란?

  • 일명 하드코딩 , 강하게 결합된 상태 라고 부름, 수정사항이 생겼을 때 코드의 변경이 전파되는 형태.
  • 다형성 을 통해 결합도를 낮출수 있다.
public class Consumer {

    void eat(Food food) {
        food.eat();
    }

    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        consumer.eat(new Chicken());
        consumer.eat(new Pizza());
    }
}

interface Food {
    void eat();
}

class Chicken implements Food{
    @Override
    public void eat() {
        System.out.println("치킨을 먹는다.");
    }
}

class Pizza implements Food{
    @Override
    public void eat() {
        System.out.println("피자를 먹는다.");
    }
}
  • ConsumerFood Interface 만을 의존하면서 먹는 존재를 받을뿐 먹는 행위자체는 코드수정없이 구현이 가능해진다.

주입

  • Filed 주입
    • 외부에서 접근이 불가능함. (private 접근제어자)
    • 테스트 코드의 중요성 부각으로 사용을 지양하는편
  • Method(Setter) 주입
    • 주입받는 객체의 변동가능성이 존재할 경우 사용(극히 드뭄)
  • Constructor 주입
    • 생성자 호출시점에서 1회 호출되는 것을 보장
    • 주입객체가 불변성을 띄거나, 반드시 객체의 주입 필요성을 강제

제어의 역전

  • 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아닌 외부에서 결정하는 것을 의미
  • 변경의 대한 영향을 적게받기위한 기법
  • 강한결합에서는 Consumer → Food 의 형태로 Consumer가 Food를 직접 객체를 생성하여 사용하는 형태를 지님, Food 가 변경됄때 마다 Food의 객체를 직접생성하고 사용하는 등 코드변경성의 전파가 생김.
  • 이를 해결하기 위해서 Food를 Consumer의 외부에서 받아온다면 Consumer는 Food가 무엇이든지 Consumer의 코드는 알필요가 없게됌.
    Food → Consumer 의 형태로 어떤 Food 가 와도 Consumer의 코드는 받아들이게 된다.

IoC Container 와 Bean

  • DI 를 사용하기위해선 객체가 필요하다. 그럼 어느타이밍에 누가 객체를 생성하는지에 대한 개요.
  • 빈 (Bean) : Spring 이 관리하는 객체
  • Spring IoC 컨테이너 : Bean을 모아둔 컨테이너
  • @ComponentScan -> 패키지 스캔 -> @Component가 설정된 클래스들을 ‘Bean’으로 등록
  • @Autowired : DI를 해주기위한 어노테이션. 생성자가 1개 일 경우 생략가능.
  • @RequiredArgsConstructor : 를 사용할 경우 생성자 주입 과정 생략가능
profile
70살까지 개발하고싶은 개발자

0개의 댓글