객체지향 설계와 스프링

Rally·2024년 9월 9일

스프링이란?

개 요

자바 엔터프라이즈 애플리케이션 개발에 사용되는 오픈소스 애플리케이션 프레임워크

  • 엔터프라이즈 애플리케이션 : 기업과 조직의 비즈니스를 처리해주는 시스템을 의미한다.
  • 오픈소스 : 소프트웨어 혹은 하드웨어 제작자의 권리를 지키면서 소스가 모두에게 공개되고, 특별한 라이선스를 취득할 필요 없이 소스를 자유롭게 열람하고 목적에 맞게 수정 후 배포도 가능한 소스
  • 프레임워크 : 개발을 위한 설계의 기본이 되는 뼈대나 구조/환경

스프링 생태계

  • 스프링 프레임워크
    • 핵심 기술 : 스프링 DI 컨테이너, AOP, 이벤트, 기타
    • 웹 기술 : 스프링 MVC, 스프링 WebFlux
    • 데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원
    • 기술 통합 : 캐시, 이메일, 원격접근, 스케줄링
    • 테스트 : 스프링 기반 테스트 지원
    • 언어 : 코틀린, 그루비
    • 최근에는 스프링 부트를 통해서 스프링 프레임워크의 기술들을 편리하게 사용
  • 스프링 부트
    • 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
    • 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성
    • Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
    • 손쉬운 빌드 구성을 위한 starter 종속성 제공
    • 스프링과 3rd parth(외부) 라이브러리 자동 구성
    • 메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능 제공
    • 관례에 의한 간결한 설정

스프링의 목적

웹 애프리케이션을 만들고, DB 접근을 편리하게 해주기 위해?

웹 서버를 자동으로 띄워줘서?

전자정부 프레임워크라서?

맞는 말이긴 하지만 결과물일뿐, 목적은 아니다.

스프링의 진짜 목적은 좋은 객체 지향 애플리케이션을 쉽게 개발할 수 있게 도와주는 것이다.

객체지향 프로그래밍?

개요

객체지향 프로그래밍은 여러개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 것으로 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.(협력)

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

다형성

유연하고 변경에 용이하다는 것은? 즉 다형성

레고 블록을 조립하듯이
키보드, 마우스 갈아끼우듯이
컴퓨터 부품 갈아까우듯이
컴포넌트를 기존의 것을 고치지 않고 변경하면서 개발할 수 있는 방법

  • 위의 그림을 보면 자동차를 자동차 역활과 자동차 구현으로 나누었다.
  • 자동차가 바뀌어도 운전자는 운전이 가능하다. 자동차 역활은 동일하기 때문이다.
  • 운전자를 클라이언트, 자동차 역활을 인터페이스, 자동차를 구현객체라고 생각하자

  • 위 그림은 공연 무대를 역활과 배우로 나누었다.
  • 배우가 바뀌어도 공연 무대의 역활은 바뀌지 않으므로, 공연 무대는 진행이 가능하다.
  • 역활을 인터페이스, 배우를 구현객체라고 생각하자
💡 다형성을 활용해 역할과 구현을 분리했을 때의 장점은?
  • 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
  • 클라이언트는 구현 대상(구현 객체)의 내부 구조를 몰라도 된다.
  • 클라이언트는 구현 대상(구현 객체)의 내부 구조가 변경되어도 영향을 받지 않는다.
  • 클라이언트는 구현 대상(구현 객체) 자체를 변경해도 영향을 받지 않는다.
💡 주의할 점은 무엇이 있을까?
  • 객체를 설계할 때 역활과 구현을 명확히 분리해야하며, 역활(인터페이스)을 먼저 부여하고, 그 역활을 수행하는 구현 개체를 만드는 것이 좋다.
  • 역활(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경이 발생하므로, 역활(인터페이스)를 안정적으로 잘 설계하는 것이 중요하다.

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

5대 원칙의미설명예시
단일 책임 원칙 (SRP)* Single Responsibility Principle한 클래스는 하나의 책임만 갖는다.중요한 기준은 변경이다. 변경이 있을 때 단일 책임 원칙을 따른다.UI변경인 경우 UI클래스가 책임을 갖고 다른 클래스에 영향을 주지 않아야한다.
개방-폐쇄 원칙 (OCP)* Open-Closed Principle확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.기존의 코드를 변경하지 않고도 시스템의 기능을 확장할 수 있다.도형 추상 클래스가 있을때 구체적인 도형을 추가하더라도 시스템에 영향을 주지 않는다.
리스코프 치환 원칙 (LSP)* Liskov Substitution Principle하위 클래스는 상위 클래스의 모든 계약과 행동을 준수한다.하위 클래스는 그 상위 클래스의 행위를 제대로 구현하고 있어야 한다.Bird 클래스가 fly() 메소드를 가질 때, Penguin클래스를 상속한다면 Penguin 클래스는 fily() 할 수 없으므로 원칙이 위배된다.
인터페이스 분리 원칙 (ISP)* Interface Segration Principle클라이언트는 자신이 사용하지 않는 인터페이스에 의존하게 만들어서는 안 됩니다.하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스가 더 좋습니다.자동차 인터페이스를 운전 인터페이스, 정비 인터페이스로 분리
의존성 역전 원칙 (DIP)* Dependency Inversion Principle추상화에 의존해야지, 구체화에 의존하면 안된다.모듈 간의 의존성을 추상화를 통해 관리하여 시스템의 결합도를 낮춥니다.서버측 객체가 변경되어도 클라이언트측 객체는 변하면 안된다.

객체지향 설계와 스프링

객제지향의 핵심은 다형성. 하지만 다형성만으로는 OCP, DIP를 지킬 수 없다. 뭔가 필요하다. 스프링 프레임워크로 해결이 가능하다. 의존성 주입(Dependency Injection, DI), DI 컨테이너를 활용해서 클라이언트 코드의 변형 없이 기능을 확장할 수 있다.

profile
새로운 것을 배우고 즐기며, 그 안에서 성장하길 원합니다.

0개의 댓글