BACK/SPRING

[Spring] 스프링 핵심 원리 - 객체 지향 설계와 스프링

연듀 2024. 1. 30. 17:26

스프링의 탄생

2000년대 초반 자바 진영에서는 EJB가 표준 기술이였다.

트랜잭션 관리, 분산 기술등의 장점

하지만 비싸고 어렵다. 복잡하고 느리다 → 스프링과 하이버네이트 탄생

 

표준 인터페이스 : JPA

JPA 구현체들: 하이버네이트, eclipseLink…

 

스프링은 EJB의 문제점을 지적하면서 등장하였고, 이름은 전통적인 J2EE(EJB)라는 겨울을 넘어 새로운 시작이라는 뜻으로 짓게 됨

 

 


 

스프링이란?

스프링 데이터: CRUD를 편리하게 사용 가능 (스프링 데이터 JPA 기술 많이 사용)

스프링 세션: 세션 기능을 편리하게 사용 가능

스프링 시큐리티: 보안 관련

스프링 RestDocs: API 문서와 테스트를 엮어 문서화를 편하게 해주는 것

스프링 배치: 배치처리(실시간으로 대량 데이터를 업데이트)에 특화된 기술

스프링 클라우드: 클라우드에 특화된 기술

 

스프링 프레임워크

핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트

웹 기술: 스프링 MVC, 스프링 WebFlux

데이터 접근 기술: 트랜잭션, JDBC, ORM 지원, XML 지원

술 통합: 캐시, 이메일, 원격접근, 스케줄링

테스트: 스프링 기반 테스트 지원

언어: 코틀린, 그루비

 

스프링 부트

  • 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
  • Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
  • 스프링과 외부 라이브러리 자동 구성

 

 

 💡 스프링 부트는 스프링 프레임워크와 별도로 사용할 수 있는게 아니다. 스프링을 편리하게 사용할 수 있는 기능을 제공해주는 것이다.

 💡 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크

 

 

 

 


 

좋은 객체 지향 프로그래밍이란

 

객체 지향 프로그래밍은 컴퓨터 프로그램을 객체들의 모임으로 파악하는 것

프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용

 

 

다형성

역할과 구현으로 세상을 구분

자동차를 변경해도 클라이언트(운전자)는 운전을 할 수 있다.

운전자(클라이언트)는 자동차 역할(인터페이스)만 알면 된다.

클라이언트가 자동차의 내부 구조를 몰라도 된다.

클라이언트는 구현 대상의 내부 구조나 대상 자체가 변경되어도 영향을 안받는다.

 

 

💡

역할 = 인터페이스

구현 = 인터페이스를 구현한 클래스, 객체

 

객체 설계시 역할(인터페이스) 부여한 후에, 역할을 수행하는 구현 객체 만들기

 

 

자바의 다형성

MemberService 클라이언트는 MemberRepository를 의존

인터페이스를 구현한 빨, 초를 변경해 할당 가능

 

  • 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.
  • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.

 

💡 인터페이스를 가장 변화가 없는 방식으로 안정적으로 잘 설계하는 것이 중요

 

 


 

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

 

 

SRP: 단일 책임 원칙

변경이 있을 때 딱 하나의 클래스나 지점만 고치는 것

 

 

OCP: 개방-폐쇄 원칙

확장에는 열려 있으나 변경에는 닫혀 있음

 

다형성 - 인터페이스를 구현한 새로운 클래스를 만들어 새로운 기능을 구현

 

문제점 - 이 때 클라이언트인 MemberService의 코드를 바꿔야 한다. 다형성을 사용하지만 OCP를 못지켰다.

⇒ 객체를 생성하고 연관관계를 맺어주는 별도의 설정자가 필요

 

 

LSP: 리스코프 치환 원칙

프로그램의 객체는 하위 타입의 인스턴스로 바꿀 수 있어야함

하위 클래스는 인터페이스 규약을 다 지켜야 함

 

 

ISP: 인터페이스 분리 원칙

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

 

 

DIP: 의존관계 역전 원칙

구현 클래스(구체화)에 의존하지 않고, 인터페이스(추상화)에 의존하라

 

 

💡 다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 변경되어 OCP, DIP를 지킬 수 없음 → 스프링 등장!!

 

 

 

 

 

참고) 스프링 핵심 원리 기본편

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8#