SpringBoot 정리(ing)

고 연우·2022년 12월 5일
0

SpringBoot

목록 보기
7/8

❗Spring❗

🔸Spring의 첫 걸음

  • 2002년 로드 존슨은 EJB의 문제점을 지적하며 BeanFactory, ApplicationContext, POJO, DI, IOC 등의 개념을 포함하여 EJB없이도 고품질의 애플리케이션을 개발할 수 있음을 보여줌.
  • EJB란, Java Bean이란 자바 객체를 재사용이 가능하도록, 즉 컴포넌트화시킬 수 있는 코딩 방침을 의미함.

🔶Spring(참고)

  • 자바 언어 기반의 프레임워크
  • 따라서 객체 지향 프로그래밍의 특징을 보이며 그 중 다형성을 통해 프로그램을 유연하고 변경이 용이하게 만듦.

🔶다형성

하나의 객체가 여러 형태를 가질 수 있다는 객체 지향 특징 중 하나.

📌즉 역할과 구현을 구분함.📌
✔️역할 = 인터페이스
✔️구현 = 인터페이스를 구현한 클래스, 구현 객체

🔸정말 심플한 예제

<People.java>

package polymorphismEx;

// 역할 -> 인터페이스
public interface People {

    void talk();

}

<Man.java>

package polymorphismEx;

// 구현 -> 인터페이스를 구현한 클래스
public class Man implements People {

    @Override
    public void talk() {
        System.out.println("Man.talk()");
    }

}

<Woman.java>

package polymorphismEx;

// 구현 -> 인터페이스를 구현한 클래스
public class Woman implements People {

    @Override
    public void talk() {
        System.out.println("Woman.talk()");
    }

}

<Main.java>

package polymorphismEx;

public class Main {

    public static void main(String[] args) {

        People people = new Woman();
        // People people = new Man();

        people.talk();
    }

}

<출력>

  • People people = new Woman(); 인 경우
  • People people = new Man(); 인 경우

🔸장점

  • 유연하고 변경이 용이하며 확장 가능한 설계가 가능해짐.
  • 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경 가능.
  • 클라이언트 - 서버 관계에서는, 클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있다.
    • 클라이언트에서 인터페이스만 알면되고 서버에서 구현 기능을 설계하면 되기 때문.

🔸단점

  • 인터페이스 자체가 변하면 인터페이스 뿐만 아니라 구현 객체도 큰 변경이 발생하게 됨.

🔸스프링에서의 다형성

  • 스프링은 다형성을 극대화해서 이용할 수 있게 도와줌.
  • IoC( 제어의 역전 ), DI( 의존관계 주입 ) 등 스프링에서의 주요 개념들은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원함.

🔶SOLID

객체 지향 개발 5대 원리

🔸SRP 단일 책임 원칙(Single responsibility principle)

  • 하나의 클래스는 하나의 책임만.

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

  • 확장에는 열려 있으나 변경에는 닫혀 있어야 함.

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

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

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

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

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

  • 구현 클래스에 의존하지 말고, 인터페이스에 의존.

🔻다형성에서 OCP, DIP 위배하는 경우가 발생할 수 있음.

  • OCP 위반의 경우 : Main.java의 main함수 안에서 구현 객체인 Woman(), Man() 클래스를 변경하기 위해 코드를 변경해야 함.
  • DIP 위반의 경우 : 또한 구현 클래스를 직접 선택( = 의존 )하고 있음.
  • 해당 사항들은 스프링 컨테이너( DI, IoC 컨테이너 )와 DI를 통해 문제점 해결 가능

❗DI, IoC❗

🔶DI( Dependency Injection )

객체를 직접 생성하는 것이 아닌 외부에서 생성한 후 주입 시켜주는 방식

🔸의존성에 대한 정말 간단한 예제

<Paper.java>

public class Paper {

    private Pen pen;

    public Paper() {
        pen = new Pen();
    }

    public void draw() {
        pen.draw();
    }
}

<Pen.java>

public class Pen {

    private String redPen = "redpen is drawing";

    public void draw() {

        System.out.println(redPen);

    }
}

<dependencyExMain.java>

public class dependencyExMain {

    public static void main(String[] args) {

        Paper paper = new Paper();

        paper.draw();
    }
}

<코드 설명>

  • Paper class가 Pen class에 의존성을 가지고 있음.
    • Paper class의 생성자에서, new 생성자를 통해 Pen 객체를 생성해줌.
    • Paper draw() 메소드를 실행하기 위해, Pen class의 draw() 메소드가 필요함.

-> 의존성으로 인해 Unit Test 및 Code 변경이 어려워짐.

🔸DI 방법

의존관계 주입 방법은

  • 생성자 주입
  • 수정자 주입(setter 주입)
  • 필드 주입
  • 일반 메서드 주입

이렇게 네 가지 정도가 있다.
이 중, 생성자 주입과 수정자 주입이 일반적으로 쓰임.

🔸생성자 주입

생성자를 통해 의존 관계를 주입 받는 방법

<Paper.java>

package dependencyEx;

public class Paper {

    private final Pen pen;

    public Paper(Pen pen) {
        this.pen = pen;
    }

    public void draw() {
        pen.draw();
    }
}
  • 불변 : 생성자 호출시점에 딱 1번만 호출되므로 값이 변하지 않음.
  • 필수 : private final 로 선언함으로 무조건 값이 있어야 함.

🔸수정자 주입

setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법

🔶


0개의 댓글