
학부생 때는 기술을 배우는 데 있어, 사용 방법과 요령만 터득하면 된다고 생각하고 있었다.
하지만 인턴, 교육, 프로젝트를 통해 기술을 사용하는 이유 의 중요성을 배우게 되었다.
그동안의 경험을 정리하면 무언가 만든다는 것은 크게 기획과 구현으로 나뉜다.
어떤 기술을 사용하는 이유는 기획에서 상대를 설득을 할 때, 구현에서 상황에 맞게 최적화를 고민할 때, 그 진가를 발휘한다.
단순 코더가 아닌 개발자가 되기 위해서는 이 Why? 로 시작하여 전체적인 그림을 볼 수 있어야한다.
Spring을 시작으로 개념-실무 사이 어떤 고민을 해야할 지 위주로 생각하며 공부를 하고자한다.
객체지향 언어의 특성으로
1. 추상화
2. 캡슐화
3. 상속
4. 다형성
이렇게 4가지가 존재한다.
장점
이 특성들은 반복되는 코드를 줄여주고, 확장과 변경에 대한 유지보수 비용을 줄여준다.
그리고 모듈 단위로 개발이 가능해 대규모 시스템에 적합한 구조를 만들 수 있으며, 이로 인해 많은 대형 프로젝트에서 객체지향 언어가 선호된다.단점
이러한 특성을 잘 활용하기위해 설계 및 초기 구현 단계에서 많은 비용이 들어갈 수 있다는 단점이 있다.
하지만 길게보고 객체지향의 특성을 살려 잘 설계하여 개발을 한다면, 유지보수에 들어가는 비용과 유연한 변경과 확장이 가능하다는 점에서 규모가 큰 프로젝트 일수록 단점은 장점에 의해 상쇄된다.
객체지향 설계를 할 때 다형성 특성을 잘 활용하려면 역할과 구현을 잘 나누는 것이 중요하다.
좋은 객체지향 설계원칙으로 SOLID라는 것이 있다.
SRP: 단일 책임 원칙
한 클래스는 하나의 책임만 가져야 한다.
중요한 기준은 변경, 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이다.
OCP: 개방-폐쇄 원칙
소프트웨어의 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
다형성을 활용하여 변경을 줄이고, 확장을 한다.
하지만!!
구현 객체를 변경하려면 클라이언트 코드를 변경해야한다.
이를 방지하기 위해서는 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다.
(스프링 컨테이너, DI 컨테이너: 스프링 사용 이유)
LSP: 리스코프 치환 원칙
프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 함
즉, 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것이다.
ISP: 인터페이스 분리 원칙
특정 클라이언트를 위한 인터페이스 여러개 좋다.
범용 인터페이스 하나로 구현은 아쉽다.
인터페이스가 명확해지고, 대체 가능성이 높아진다.
DIP: 의존관계 역전 원칙
추상화에 의존해야지, 구체화에 의존하면 안된다.
구현 클래스에 의존하는 것이 아닌, 인터페이스에 의존해야한다.
역할에 의존, 구현체에 의존하게 되면 변경이 아주 어려워진다.
객체지향 대표 언어인 Java만을 활용하여 객체지향의 특성인 다형성을 살리고, SOLID 원칙을 지키며 개발하기에는 OCP, DIP를 지킬 수 없다. 특히, 구현 객체 변경시 코드 변경을 해야한다.
클라이언트 코드 변경없이 구현 객체 변경 및 확장을 가능하게 해주는 것이 바로 Spring이다.
역할 - 인터페이스
구현 - 인터페이스를 구현한 클래스, 구현 객체
객체지향 설계에서 다형성을 잘 활용하려면, 역할 중심의 인터페이스 설계에 집중해야 한다.
인터페이스를 중심으로 설계하면 클라이언트는 구현 객체의 세부 구현에 의존하지 않게 되며, 이로 인해 구현 변경이나 확장 시에도 클라이언트 코드에 혼란이나 영향 없이 유연하게 시스템을 유지보수할 수 있다.
- DI: 의존 관계, 의존성 주입
- DI 컨테이너
- IoC: 제어의 역전
스프링은 이러한 기능으로 다형성 을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
즉, 클라이언트 코드 변경없이 구현 객체 변경 및 확장을 용이하게 해준다.
Spring Boot는 스프링 프레임워크를 활용하는 도구인데, 개발의 편의성을 더해주는 도구다.
1. Tomcat과 같은 웹 서버가 내장되어 있어, 별도의 서버 설정 없이 애플리케이션을 쉽게 실행하고 배포할 수 있다.
2. 다양한 Starter 의존성을 제공하여, 관련 라이브러리들을 자동으로 구성하고 호환되는 버전도 함께 관리할 수 있다.
A가 B를 의존한다
즉, A가 B를 알고 있다로 받아들이면 된다.