본문 바로가기
  • 기억의 유한함을 기록의 무한함으로✍️            예비 개발자가 꿈꾸는 공간 여기는 안나의 개발 블로그 💻
Programming/Spring

[Spring] 객체 지향 설계와 스프링

by 제가안난데여♪(´ε`*) 2024. 1. 28.
728x90

 

이 글은 인프런에서 김영한 님의 "스프링 핵심원리 - 기본편"을 수강 후 공부한 내용을 정리한 게시글입니다. 부족한 부분이 있다면 언제든 지적 부탁드립니다.

 

✏️ 스프링


일반적으로 스프링은 좁은 의미의 Spring Framework를 일컫는다. 그러나 넓은 의미에서의 스프링은 Spring 생태계를 의미한다. 스프링 생태계는 다음과 같이 다양한 프로젝트들을 포함하고 있다.

스프링 프로젝트 종류

프로젝트 설명
Spring Data Data 연동을 위한 API를 제공, RDBMS와 NoSQL과 연동을 적은양의 코드로 처리 가능
Spring Cloud 마이크로 서비스 기반의 아키텍처에서 사용되는 모든 검증된 패턴을 구현
Spring Security 인증과 허가에 대한 기반 프레임워크를 제공하여 보안을 간단한 설정과 코드로 구현 가능
Spring Batch 데이터 처리, 흐름제어, 실패 제처리 등 배치 처리 App이 필요로 하는 기능을 제공
Spring Integration 시스템 간 연동을 위한 메시징 프레임워크를 제공
Spring Social 소셜 네트워크 연동을 위한 기능을 제공
Spring Session 사용자의 세션 정보를 관리하기 위한 API 및 구현을 제공
Spring Rest Docs RESTful 서비스를 자동 문서화 기능 제공
Spring HATEOAS Spring MVC로 작업할때 HATEOAS(일명 헤이티오스) 원칙을 따르는 REST 표현을 쉽게 생성할 수 있도록 API 기능 제공
Spring Framework Java 기반 어플리케이션 개발을 지원하는 오픈소스 어플리케이션 프레임워크
Spring Boot 기본적인 설정과 보일러 플레이트 코드(여러 곳에서 재사용 되는 코드) 작성을 최소화하고, 자동 설정과 컨벤션을 통해 개발자들이 빠르고 편리하게 어플리케이션을 개발할수 있도록 지원하는 도구
   

Spring Framework

Java 기반 어플리케이션 개발을 지원하는 오픈소스 어플리케이션 프레임워크

1. Core Container

서블릿의 생명 주기를 관리하는 서블릿 컨테이너와 비슷하게 bean의 생성과 관리를 해주는 컨테이너 역할을 한다.

2. Data Access/Integration

데이터베이스, XML 또는 Messaging을 포함한 다양한 형태의 데이터에 접근하기 용이하도록 하는 모듈의 모음이다.

3. 웹 (WEB)

Web Application을 빌드할 때 사용하는 컴포넌트로, 자체 MVC 프레임워크인 Spring MVC를 제공한다.

4. AOP, Aspects, Instrumentation, Messaging, Test

스프링 프레임워크 구조에 대해 자세한 설명은 여기에서 → [Spring] 스프링 프레임워크(Spring Framework)의 구조

 

Spring Boot

기본적인 설정과 보일러 플레이트 코드(여러 곳에서 재사용 되는 코드) 작성을 최소화하고, 자동 설정과 컨벤션을 통해 개발자들이 빠르고 편리하게 어플리케이션을 개발할수 있도록 지원하는 도구

  • 단독으로 실해알 수 있는 스프링 어플리케이션을 쉽게 생성
  • Tomcat 같은 웹서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
  • 손쉬운 빌드 구성을 위한 starter 종속성을 제공



✏️ 객체 지향과 스프링


객체 지향의 특징

  • 추상화 - 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
  • 캡슐화 - 서로 연관 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
  • 상속 - 기존 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법요소
  • 다형성 - 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질

 

다형성

객체 지향 프로그래밍은 프로그램을 유연하고 변경에 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.

그렇다면 유연하고 변경에 용이한 소프트웨어는 무슨 의미일까? 컴포넌트를 부품 갈아 끼우듯이 변경이 쉽다는 의미이다.

부품을 갈아 끼워도 잘 돌아가게 설계를 하기 위해서는 객체를 설계할 때 역할(인터페이스)과 구현(클래스, 객체)을 명확히 분리 해야하며 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만들어야한다.

그렇게 객체 지향 관점으로 잘 설계된 프로그램은 클라이언트에 영향을 주지 않고 서버의 구현 기능을 유연하게 변경할 수 있다.

그렇기 때문에 객체 지향 프로그래밍에서 다형성이 가장 중요하다.

이러한 다형성을 극대화해서 이용할 수 있도록 도와준 프레임워크가 스프링이며

스프링의 제어의 역전, 의존관계 주입은 다형성을 활용하여 역할과 구현을 편리하게 다룰 수 있도록 지원한다.

 

스프링의 핵심 개념

스프링은 자바 언어 기반의 프레임워크로 객체 지향 언어가 가진 강력한 특징을 살려낼 수 있는 프레임워크.



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


클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리

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

하나의 클래스는 하나의 책임만 가져야한다.

  • 책임이라는 것의 기준은 “변경” 이며 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른것

 

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

소프트웨어 요소는 변경에는 열려 있으나, 변경에는 닫혀 있어야 한다.

  • 다형성을 활용하여 기존 인터페이스를 변경하지는 않지만, 새로운 구현체를 만들어 확장은 할 수 있다.
  • 그러나 구현 객체를 변경하려면 클라이언트 코드를 변경해야한다. (사용할 레포지토리를 변경하려면 서비스 코드를 변경해야함)

 

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

부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체 할 수 있다.

  • 프로그램 객체는 프로그램의 정의한 기능에서 벗어나지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 다형성에서 하위 클래스는 인터페이스의 규약을 다 지켜야한다는 것
  • 인터페이스를 구현한 구현체를 믿고 사용하려면 이 원칙이 필요하다.
  • 단순히 컴파일에 성공하는 것이 아닌 정해진 규약에 관한 이야기
  • 그렇기 때문에 인터페이스의 설계가 중요하다.

 

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

목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해야 한다.

  • 여러개의 특정 클라이언트를 위한 인터페이스가 하나의 범용 인터페이스 보다 낫다.
  • 탈것 이라는 인터페이스 보다는 자동차 라는 특정 인터페이스가 좋다는 의미, 그래야 정의한 기능에서 벗어나지 않아도 문제를 일으키지 않는다.그러니 자동차 인터페이스, 오토바이 인터페이스로 특정 클라이언트를 위한 인터페이스를 작성해야한다.
  • 즉, 자동차는 핸들을 원형으로 돌려야 방향제어가 가능하다는 기능이 있지만 오토바이는 핸들을 좌우로 돌려야 방향제어가 가능하기 때문에 만약 “탈것”이라는 범용적인 인터페이스로 작성시 자동차와 오토바이의 기능에 문제를 줄 수 있기 때문이다.
  • 언터페이스가 명확해지고 , 대체 가능성이 높아진다.

 

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

고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되며, 저수준 모듈이 고수준 모듈에 의존해야 한다.

  • 구현 클래스에 의존하지 말고 인터페이스에 의존해야 한다.
  • 즉 역할에 의존해야한다 !
  • 그러나 클라이언트가 구현 클래스를 직접 선택할 경우에도 DIP 위반이 발생한다.

 

✏️ 분명 다형성을 사용했지만 OCP, DIP의 원칙을 지킬 수 없다. 그렇다면 ?


  • DI(Dependency Injection): 의존관계, 의존성 주입 , DI 컨테이너 제공 과 같은 스프링의 기술로 다형성 + 개방-폐쇄 원칙, 의존관계 역전 원칙을 지킬 수 있다.
반응형