-
스프링과 객체지향설계스프링 2021. 7. 25. 20:25
김영한님의 스프링 핵심 원리 - 기본편 강의를 듣고 작성했습니다.
스프링의 탄생 배경
기존의 자바진영에서는 EJB(Enterprise Java Beans)라는걸 썼었다.
여러가지 강력한 기능을 제공해주는 툴이였지만 개발자가 개발을 할 때 EJB를 기반으로 개발해야해서 코드가 난잡해지고 객체지향 방법론을 거의 쓸 수 없는 문제가 있었다.
그러다보니 더더욱 힘들어져 이를 해결할 방법을 찾는 사람들이 있었고, 이를 해결한 사람이 스프링의 핵심개념과 기반 코드를 제시한 '로드 존슨'이다.
로드 존슨이 책을 통해 아이디어를 냈고, 이 후 Juergen Hoeller(유겐 휠러), Yann Caroff(얀 카로프)가 로드 존슨에게 오픈소스 프로젝트를 제안했고 그게 '스프링'이다.
스프링이란?
스프링은 '스프링 프레임워크' 기반으로 여러 기능들이 모여있는 생태계를 말한다.
스프링부트란?
요즘엔 기존의 스프링은 프로젝트를 시작할 때 설정하는 것이 굉장히 힘들었는데
이런 잡다한 설정들을 자동으로 해주고 웹 서버등의 기능도 내장해서 제공해주는 기능인 '스프링 부트'를 많이 사용한다.
스프링을 사용하는 이유
스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있도록 도와주는 프레임워크이다.
그렇다면 좋은 객체 지향 프로그램이란 무엇인가?
객체 지향 프로그래밍은 위키백과에 다음과 같이 정의되어 있다.
- 객체 지향 프로그래밍은 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
- 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
여기서 유연하고 변경이 용이하게 프로그램을 만든다는 것은 기존에 있던 코드를 변경하지 않고 마치 부품을 갈아끼우듯이 코드를 변경 할 수 있음을 말한다.
이는 자바의 코드의 역할과 구현을 분리하는 '다형성'을 이용해서 어느정도 구현 할 수 있다.
좋은 객체 지향 설계(SOLID)
클린코드의 저자 로버트 마틴이 제시한 좋은 객체 지향 설계의 5가지 원칙인 SOLID를 따르는 설계를 좋은 객체 지향 설계라 한다.
다음의 앞 글자를 따서 SOLID라 한다.
- SRP: 단일 책임 원칙(single responsibility principle)
- OCP: 개방-폐쇄 원칙(Open/closed principle)
- LSP: 리스코프 치환 원칙 (Liskov substitution principle)
- ISP: 인터페이스 분리 원칙(Interface segregation principle)
- DIP: 의존관계 역전 원칙(Dependency inversion principle)
SRP(single responsibility principle) - 단일 책임 원칙
한 클래스는 하나의 책임만 가져야 한다.
하나의 책임에 대한 기준은 '변경'이다. 변경이 있을 때 파급효과가 적어야 한다.
OCP(Open/closed principle) - 개방 폐쇄 원칙
확장에는 열려있으나, 변경에는 닫혀있어야 한다는 뜻이다. 기존의 코드에 변경이 없이 확장이 가능해야 한다는 뜻인데, 이는 단순히 자바의 다형성으로 구현하기 힘들다.예를들어 다음과 같은 코드가 있다고 해보자
만약 다음과 같이 다형성을 이용해 구현한 코드가 있다고 치자.
그리고 animal을 Cat으로 변경하려 할 때 두번째 줄의 코드를 변경하는 과정이 들어간다.
즉 변경에 닫혀있어야 한다는 원칙에 위배되게 된다.
LSP(Liskov substitution principle) - 리스코프 치환 원칙
다형성을 구현 할 때 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것을 의미한다.
예를들어 연필 인터페이스가 있고 'write()'라는 메소드가 있다고 해보자.
근데 연필 인터페이스를 구현한 구현체가 write()라는 메소드를 뭔가 쓰는 것이 아닌 뭔가를 지우는 것으로 구현한다면 인터페이스가 의도한 바 대로 구현한게 아니니 LSP 위반이다.
ISP(Interface segregation principle) - 인터페이스 분리 원칙
특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
큼지막한 인터페이스 하나를 여러개의 인터페이스로 세분화하라는 원칙이다.
인터페이스를 분리하면 인터페이스가 명확해지고 변경이 용이해진다.
DIP(Dependency inversion principle) - 의존관계 역전 원칙
프로그래머는 추상화에 의존해야지 구체화에 의존해서는 안된다는 뜻이다. 상속이나 구현을 할 때 구현클래스에 의존하지 말고 인터페이스에 의존하라는 것을 의미한다.
방금 전에 썼던 위의 코드도 DIP를 위반한다.
여기서 animal은 Animal이라는 인터페이스에도 의존하지만 Dog이라는 인터페이스에도 의존한다.
즉 DIP에 위배된다.
* 의존한다는 것은 클래스가 뭐가 필요한지 알고 있다고 생각하면 된다.
이와같이 순수 자바 코드로는 OCP와 DIP를 지키기가 힘들다.
이를 도와주는 것이 스프링 프레임 워크의 역할이 된다.
'스프링' 카테고리의 다른 글
스프링 빈과 스프링 컨테이너 (0) 2021.08.02 객체 지향 원리 적용 (0) 2021.07.29 스프링 빈과 의존 관계 (0) 2021.07.16 테스트와 웹 애플리케이션 구조 (0) 2021.07.14 스프링 웹 개발 기초 (0) 2021.07.13