[참고 강의] 김영한님의 스프링 핵심 원리 - 기본편
스프링은 JAVA 언어 기반의 프레임워크다.
자바의 큰 특징이 객체 지향이듯이,
스프링은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크다.
즉, 객체 지향이 스프링의 핵심이라고 할 수 있다.
스프링은 봄이란 뜻이다. 말 그대로 전통적인 EJB 겨울 시절을 지내고 맞이하는 봄이라는 뜻으로, 새로운 시작이다 😊
스프링과 스프링 부트는 떼어놓을 수 없다. 이 말은 스프링 부트는 별도로 사용하는 것이 아니라는 걸 알 수 있다. 하지만 스프링은 단독으로 애플리케이션을 실행할 수 있다.
스프링 부트는 이름에서 느껴지듯 스프링 기술을 좀 더 편리하게 사용할 수 있게 해준다. 요즘엔 선택이 아닌 필수가 된 스프링 부트이다.
스프링과 객체 지향을 떼놓을 수 없다..
그래서 이 강의에선 좋은 객체 지향 프로그래밍이 무엇인지도 함께 다뤄주셨다.
객체 지향 특징은 추상화, 캡슐화, 상속, 다형성이 있지만 DI에서 활용하는 다형성에 대해 자세히 다뤄주셨다.
- "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.(협력)
- 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만든다.
정의를 내려보니 어렵다. 난 객체 지향 프로그래밍을 그저 유지보수하기 쉽고 확장성이 훨씬 좋다고만 알고 있었다. 위 말을 있어보이게 요약하자면 객체들의 협력을 통해 프로그램이 유연해진다. 가 아닐까 싶다 😎
객체 지향 프로그래밍을 예시를 들자면 컴퓨터 부품을 갈아 끼우듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법이라고 할 수 있다.
강사님께서 계속 강조하셨던 "역할과 구현을 분리하라"
이 말을 설명하면 다형성을 빼놓을 수 없다.
다형성이란 하나의 객체가 여러가지의 타입을 가질 수 있다.
예시로 부모 클래스 타입을 갖고 자식 클래스의 생성자 호출이 가능하다.
class Parent { ... }
class Child extends Parent { ... }
...
Parent pa = new Parent(); // 허용
Child ch = new Child(); // 허용
Parent pc = new Child(); // 허용
Child cp = new Parent(); // 오류 발생.
이런 다형성의 성질을 활용하여 역할과 구현을 분리할 수 있다.
즉, 객체를 설계할 때
역할 (인터페이스)를 정의하고 그 역할을 수행하는 클래스를 구현하면 된다.
다형성을 저번시간에도 코드로 구현해본 적이 있다.
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
MemberRepository라는 인터페이스를 확장하여 구현한 MemoryMemberRepository, JdbcMemberRepository는 인터페이스인 MemberRepository 타입으로 참조되었다.
이 코드를 보고 느낌이 왔다.
인터페이스는 기능 명세서 같은 역할을 하는 거 같다.
MemberRepository가 어떤 공통 기능의 "역할"을 하고 그 공통 기능을 토대로 MemoryMemberRepository, JdbcMemberRepository가 각각의 기능에 맞게 "구현"을 하는 거 같다 🧐
그렇기에 인터페이스를 안정적으로 설계하는 것이 중요하다.
정말 컴퓨터 부품을 갈아끼우는 느낌이다
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
역할 자체가 변하면 클라이언트, 서버 모두 큰 변경이 발생하므로 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
다음글은 면접에서 단골 질문이라는 SOLID와 스프링에서 객체 지향 설계가 왜 중요한지부터 정리해보겠당..😎