[Spring] 기본편 01. 객체지향 설계와 스프링

somyeong·2022년 3월 25일
0

Spring

목록 보기
1/17
post-thumbnail
post-custom-banner

이 글은 스프링 핵심 원리 - 기본편 을 듣고 정리한 내용입니다.

앞으로 강의를 수강하면서 섹션별로 내용을 정리하여 포스팅할 예정이다.
정리할 내용은 강의 중 중요한 내용 + 추가적으로 찾아본 개념 + 기타 내용 으로 자유롭게 작성할 계획이다!

📌 Spring이란 ?

Spring이란 JAVA 기술들을 더 쉽게 사용할 수 있게 해주는 오픈소스 프레임 워크 이다.

  • JAVA를 이용해 웹 개발, 프로젝트를 하다보면 자바를 활용한 기술들인 JSP, MyBatis, JPA등등이 많이 쓰인다. Spring은 이 기술들을 더 편하게 사용하기 위해 만들어졌다.
  • 프로젝트를 하다보면 아무리 분업해도, 중복되는 코드가 존재하는데 Spring을 통해 중복코드를 줄이고, 비즈니스 로직을 더 간단하게 만들 수 있다.

📌 Framework란?

프레임 워크는 자주 쓰일 만한 기능들을 한데 모아 놓은 유틸(클래스)들의 모음(집합)이다.

  • 어떤 목적을 달성하게 위해 복잡하게 얽혀 있는 문제를 해결하기 위한 구조이자 약속이며, 소프트웨어 개발에 있어서 하나의 뼈대 역할을 한다.
    즉, 프레임 워크는 기본적인 설계나 필요한 라이브러리는 알아서 재공해줄거니깐 개발자는 만들고 싶은 기능을 구현하는데 집중하라는 취지에서 만들어진 것이다.

프레임워크와 라이브러리

  • 개발자가 구현하고자 하는 기능을 쉽게 제공해줄 수 있다는 점에서 프레임 워크와 라이브러리는 비슷한 면이 있다.
  • 라이브러리는 개발자가 프로그램을 짜다가 라이브러리가 필요한 순간에 직접 가져다가 쓰는것이다. 라이브러리는 프로그램 기능 구현에만 도움을 준다
  • 프레임워크는 필요한 라이브러리와 기능 구현에 필요한 설계도 틀을 함께 제공해준다.
    설계도 틀이라 하면, 사용자가 세세하게 신경쓰지 않아도 빠르게 기능을 확장하거나 유지보수 할 수 있게 해주는 구조에 대한 가이드라인이라 생각하면 된다.

🌱 Spring Framework 종류 살펴보기

  • 핵심 기술 : 스프링 DI 컨테이너, AOP, 이벤트, 기타
  • 웹 기술 : 스프링 MVC, 스프링 WebFlux
    - 데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원
  • 기술 통합 : 캐시, 이메일, 원격접근, 스케줄링
  • 테스트 : 스프링 기반 테스트 지원
  • 언어 : 코틀린, 그루비
    -> 최근에는 Spring boot를 통해서 Spring framework의 기술들을 편리하게 사용한다.

📌 Spring boot란?

Spring Framework 기반 프로젝트를 어려운 설정이나, WAS에 대한 설정 없이 바로 개발에 들어갈 수 있도록 만든 프레임 워크이다.

  • 스프링 프레임워크를 사용하려면 많은 XML 설정 파일들을 작성해야 하고, 기존에 사용했던 설정들을 복사/붙여넣기 하거나 검색을 통해 일일이 설정을 해야하지만, Spring Boot을 사용하면 복잡한 설정 없이 쉽고 빠르게 프레임워크를 사용할 수 있다.

📌 객체 지향 특징 - 다형성

다형성이란, 하나의 객체에 여러가지 타입을 대입할 수 있다는 것을 의미.

  • 반대로 다형성은 하나의 객체에 하나의 타입만 대응 할 수 있다.
  • 실생활 예시 ) 운전자 - 자동차, 컴퓨터 - 키보드(여러 종류중 선택가능), 공연 무대

JAVA 언어에서의 역활과 구현 분리

  • 역할 = 인터페이스
  • 구현 = 인터페이스를 구현한 클래스, 구현 객체
  • 객체를 설계할 때 역할과 구현을 명확히 분리
  • 객체 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기

다형성의 본질

  • 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경 가능
  • 다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야함
  • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.

📌 스프링과 객체 지향

  • 다형성이 가장 중요
  • 스프링은 다형성을 극대화해서 이용할 수 있게 도와줌.
  • 스프링에서의 제어의 역전(IoC), 의존관계 주입(DI)은 다형성을 활용하여 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
  • 스프링을 사용하면 레고 블럭 조립하듯이, 공연 배우를 선택하듯이, 구현을 편리하게 변경 할 수 있음!

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

(💡 면접 질문으로도 나오곤 함 !)

1.SRP: 단일 책임 원칙

  • (Single responsibility principle)
  • 한 클래스는 하나의 책임만 가져야 한다.
    하나의 책임이란것은 클 수도 있고, 작을 수도 있고 문맥과 상황에 따라 다르다.
  • 중요한 기준은 변경이다. 변경이 있을 때 파급효과가 적으면 단일 책임 원칙을 잘 따른것이다.
    예)UI변경, 객체의 생성과 사용을 분리

2.OCP: 개방-폐쇄 원칙

- (Open/closed principle)

  • 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다.
  • 그러나 자바에서 구현 객체를 변경하려면 클라이언트 코드를 변경해야함.
ex) MemberRepository m = new MemoryMemberRepository(); //기존코드
	MemberRepository m = new JdbcMemberRepository(); //	변경코드
  • 다형성을 사용했지만 OCP 원칙을 지킬 수 없다.
  • 어떻게 해결? -> 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자 필요

3.LSP: 리스코프 치환 원칙

  • (Liskov substitution priciple)
  • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야함.
  • 다형성에서 하위클래스는 인터페이스 규약을 다 지켜야 한다는것, 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체는 믿고 사용하려면 이 원칙이 필요함.
    ex) 자동차 인터페이스의 엑셀은 앞으로 가라는 기능, 뒤로 가게 구현하면 LSP 위반 (느리더라도 앞으로는 가야함)

4.ISP : 인터페이스 분리 원칙

  • (Interface segregation principle)
  • 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
    ex) 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리
    사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리
  • 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영항 주지 않음.
  • 인터페이스가 명확해지고, 대체 가능성이 높아진다.

5.DIP : 의존관계 역전 원칙

  • (Dependency inversion principle)
  • "프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다" -> 의존성 주입은 이 원칙을 따르는 방법 중 하나다.
  • 즉, 구현 클래스에 의존하지 않고, 인터페이스에 의존 하라는 뜻
  • 역할(Role)에 의존해야 한다는 것과 같다.
  • 객체 세상도 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경할 수 있다. 구현체에 의존하면 변경이 아주 어려워짐.
- 앞의 예시에서 MemberService 클라이언트가 구현클래스 직접 선택 
MemberRepository m = new MemobryMemberRepository();
> 이는 DIP 위반이다.

참고 사이트
https://jerryjerryjerry.tistory.com/62
https://pp-ppi.tistory.com/39

profile
공부한 내용 잊어버리지 않게 기록하는 공간!
post-custom-banner

0개의 댓글