Spring 핵심 개념

강정우·2023년 8월 28일
0

Spring-boot

목록 보기
1/73
post-thumbnail

Spring boot

장점

  1. 스프링을 편리하게 사용할 수 있도록 굉장히 다양한 spring project을 묶어서 지원
  2. 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성가능
  3. Tomcat 같은 웹 서버를 내장하여 별도의 웹 서버를 설치하거나 설정하지 않아도 됨.
  4. 손쉬운 빌드 구성을 위한 starter 종속성 제공
  5. 스프링과 3rd parth library 자동 구성 (Spring과 큰 다른 점 중 하나인 버전을 따로 명시하지 않아도 됨.)
  6. 메트릭, 상태확인, 외부 구성 같은 프로덕션 준비 기능 제공
  7. 관례에 의한 간결한 설정 (Spring에서는 설정을 매우 많이 잡아줘야하지만 따로 잡아주지 않아도 되고 혹은 custom할 수도 있음)

Spring 핵심 개념, 핵심 기술

  • 스프링은 Java 기반의 프레임워크 => Java의 가장 큰 특징 => 객체 지향 언어 => 스프링은 객체 지향 언어(자바)가 가진 강력한 특징을 살려내는 프레임웤

즉, 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있도록 도와주는 프레임웤이다.

좋은 객체 지향 프로그래밍

  • 물론 캡상추다 (캡슐화, 상속성, 추상화, 다형성) 가 있겠지만 여기서 영한쌤이 강조하는 것은 바로 다형성,

  • 바로 역할과 구현을 분리이다. => 역할을 지정해놓으면 구현은 어떤식으로 하든 교체가 가능하고 단순해 질 수 있다는 것이다.

역할과 구현을 분리하면 장점

  1. 클라이언트는 대상의 역할(인터페이스)만 알면 도니다.
  2. 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
  3. 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
  4. 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.

그럼 역할이 중요할까? 구현이 중요할까? => 당근 역할(인터페이스)이 더 중요하고 더 먼저이다.
그로인하여 유연하고, 변경이 용이하고, 확장 가능한 설계가 가능하고, 클라이언트에 영향을 주지 않고 변경이 가능하다.
위 장점을 모두 살리려면 인터페이스를 안정적으로 잘 설계하는것이 굉장히 중요하다.

좋은 객체 지향 설계의 5가지 원칙(SOLID)

  • SRP: 단일 책임 원칙 (Single responsivility principle)
    • 한 클래스 하나의 책임
    • 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이다.
  • OCP: 개방-폐쇄 원칙 (Open/closed principle) (✨중요)
    • 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야한다.
    • 말이 안 되는 것 같지만 다형성을 활용하면 가능하다.
    • 인터페이스를 implement한 새로운 클래스를 하나 만들어서 새로운 기능을 구현
    • 하지만 예전에 다형을 잘 지켰지만 OCP는 지키지 못 한 예제 코드가 하나 있었다.
    private 인터페이스 변수 = new 인터페이스를구현한클래스();
    private 인터페이스 변수 = new 인터페이스를구현한클래스2();
    • 위 코드처럼 반드시 client의 코드를 변경했어야했는데 spring container에서 이제 이를 알아서 처리해줄것이다.
    • 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다.
    • 이 원칙을 지키기위해 DI, ioc Container 도 필요한 것이다.
  • LSP: 리스코프 치환 원칙 (Liskov subsitution principle)
    • 프로그램의 객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다.
    • 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야한다.
    • 즉, 구현체는 인터페이스에 대한 규약을 반드시 지켜야한다.
  • ISP: 인터페이스 분리 원칙 (Interface segregation principle)
    • 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나 보다 낫다.
    • 인터페이스가 명확해지고, 대체 가능성이 높아진다. => 결합도가 낮아지고 응집도가 올라간다.
  • DIP: 위존관계 역전 원칙 (Dependency inversion principle)
    • 추상화(인터페이스)에 의존해야지, 구체화에 의존하면 안된다.
    • 하지만 위 OCP 코드에서 볼 수 있듯 저 코드를 감싸는 class는 반드시 인터페이스와 인터페이스를구현한클래스2에 대하여 의존할 수 밖에 없다.
    • 그럼 어떻게하라고? => 생성자 함수로 주입하면 될 듯...? (setter나)

Spring은 이 SOILD 원칙을 지킬 수 있도록 도와줌.

  • 스프링은 DI, DI컨테이너로 다형성, OCP, DIP를 가능하게 지원해준다.
    • DI 컨테이너 : 자바 객체들이 들어가있는 곳, 스프링이 의존관계를 서로 연결해주고 주입해주는 기능을 함.

실무 Tip

  • 인터페이스를 작성하려면 추상화라는 비용이 발생하기 때문에

  • 기능을 확장할 가능성이 없다면 구체 클래스를, 혹은 향후 꼭 필요할 때 리팩토링을 하여 인터페이스를 도입하는 것도 하나의 방법이다.


reference

  • 인프런 갓영한 스프링 핵심 원리 - 기본편
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글