Spring boot
장점
- 스프링을 편리하게 사용할 수 있도록 굉장히 다양한 spring project을 묶어서 지원
- 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성가능
- Tomcat 같은 웹 서버를 내장하여 별도의 웹 서버를 설치하거나 설정하지 않아도 됨.
- 손쉬운 빌드 구성을 위한 starter 종속성 제공
- 스프링과 3rd parth library 자동 구성 (Spring과 큰 다른 점 중 하나인 버전을 따로 명시하지 않아도 됨.)
- 메트릭, 상태확인, 외부 구성 같은 프로덕션 준비 기능 제공
- 관례에 의한 간결한 설정 (Spring에서는 설정을 매우 많이 잡아줘야하지만 따로 잡아주지 않아도 되고 혹은 custom할 수도 있음)
Spring 핵심 개념, 핵심 기술
- 스프링은 Java 기반의 프레임워크 => Java의 가장 큰 특징 => 객체 지향 언어 => 스프링은 객체 지향 언어(자바)가 가진 강력한 특징을 살려내는 프레임웤
즉, 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있도록 도와주는 프레임웤이다.
좋은 객체 지향 프로그래밍
-
물론 캡상추다 (캡슐화, 상속성, 추상화, 다형성) 가 있겠지만 여기서 영한쌤이 강조하는 것은 바로 다형성,
-
바로 역할과 구현을 분리이다. => 역할을 지정해놓으면 구현은 어떤식으로 하든 교체가 가능하고 단순해 질 수 있다는 것이다.
역할과 구현을 분리하면 장점
- 클라이언트는 대상의 역할(인터페이스)만 알면 도니다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
그럼 역할이 중요할까? 구현이 중요할까? => 당근 역할(인터페이스)이 더 중요하고 더 먼저이다.
그로인하여 유연하고, 변경이 용이하고, 확장 가능한 설계가 가능하고, 클라이언트에 영향을 주지 않고 변경이 가능하다.
위 장점을 모두 살리려면 인터페이스를 안정적으로 잘 설계하는것이 굉장히 중요하다.
좋은 객체 지향 설계의 5가지 원칙(SOLID)
- SRP: 단일 책임 원칙 (Single responsivility principle)
- 한 클래스 하나의 책임
- 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이다.
- 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