- 스프링
1. 스프링이란?
- 스프링은 자바 언어 기반의 프레임워크이다.
- 자바 언어의 가장 큰 특징은 객체 지향 언어인데 스프링은 이런 객체 지향 언어가 가진 강력한 특징을 살려낼 수 있는 프레임 워크이다.
- 스프링을 통해 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와줄 수 있다.
2. 객체 지향 프로그래밍이란 ?
- 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위인 "객체" 들의 모임으로 파악하고자 하는 것이다.
- 이런 객체 지향 프로그래밍 안에서 객체는 메시지를 주고 받고 데이터를 처리할 수 있다.
- 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들어줘 대규포 소프트웨어 개발에 많이 사용된다.
유연하고, 변경이 용이하다는 게 프로그래밍에서 어떤 의미인가 ?
레고, 블록이 조립되듯이 프로그램 내 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
3. 객체 지향의 특징
OOP is a A P.I.E
- Abstraction(추상화) : 현실의 객체를 추상화해서 클래스를 구성
- Polymorphism(다형성) : 하나의 객체를 여러가지 타입(형)으로 참조
- Inheritance(상속성) : 부모 클래스의 자산을 물려받아 자식을 정의함으로써 코드의 재사용이 가능
- Encapsulation(데이터 은닉과 보호) : 데이터를 외부에 직접 노출시키지 않고 메서드를 이용해 보호
객체 지향의 특징 중 다형성이라는 특성에 특히 스프링은 강점이 있다.
4. 다형성
1) 다형성의 실세계 비유
- 실세계와 객체 지향을 1:1로 매칭할 수 없으나 그래도 실세계의 비유로 이해하기 좋다.
- 역할과 구현으로 세상을 구분할 수 있다.
- 운전자 - 자동차의 예시를 보면 운전자는 자동차의 사용방법 안다면 자동차의 구현체인 K3, 아반떼, 테슬라 모델인 어떤 자동차를 사용해도 자동차의 역할로 운전을 할 수 있다.
- 공연무대의 예시를 보면 로미오 역할과, 줄리엣 역할에 대해 수행할 수 있는 역할자는 다양하고, 역할을 대체하여 수행해도 공연에는 큰 문제가 없다.
- 또한 다형성에 실세계 비유에는 키보드-마우스, 세상의 표준 인터페이스들 등이 존재한다.
2) 역할과 구현을 분리
- 위의 예시처럼 역할과 구현으로 구분하면 세상이 단순해지고 유연해지며 변경이 편리해진다.
- 장점
- 클라이언트는 대상의 역할(인터페이스)만 알면 되며 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않으며 구현 대상 자체를 변경해도 영향을 받지 않는다.
3) 자바 언어에서 이런 역할과 구현을 분리하는 방법
- 자바 언어의 다형성을 활용하여 역할은 인터페이스, 구현은 인터페이스를 구현한 클래스와 구현객체로 할 수 있다.
- 객체를 설계할 때는 역할과 구현을 명확히 분리해야한다.
- 객체 설계 시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만드는 게 좋다.
4) 자바 언어의 다형성
- 자바 언어에서 오버라이딩으로 다형성의 특징을 보여줄 수 있다.
- 다형성으로 인터페이스를 구현한 객체를 실행 시험에 유연하게 변경할 수 있다.
- 또한 클래스 상속 관계에서도 다형성, 오버라이딩이 적용 가능하다.
- 예시
- 예시를 보면 만약 Member의 데이터를 관리하는 MemberRepository라는 인터페이스를 먼저 구현하고 실제로 메모리에 올리는 MemoryMemberRepository와 JDBC로 부터 데이터베이스에 관리하는 JdbcMemberRepository 두 가지 중에 아무거나 사용해서 구현해도 데이터의 관리의 기능을 클라이언트가 사용할 수 있다.
// 둘 다 사용 가능하여 쉽게 갈아 끼울 수 있음
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
private MemberRepository memberRepository = new JDBCMemberRepository();
}
5) 다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하면 협력이라는 객체 사이의 관계에서 시작해야 한다.
- 클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있다.
5) 한계
- 역할(인터페스) 자체가 변하면 클라이언트, 서버 모두에 큰 변경이 발생한다.
- 따라서 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
인프런의 김영한님의 "스프링 핵심원리"라는 강의를 보고 직접 공부하면서 작성하였습니다.
혹시 문제가 있다면 바로 삭제하겠습니다.
'프로그래밍공부 > Spring' 카테고리의 다른 글
Spring Bean의 개념과 생성원리 및 과정 (0) | 2022.09.04 |
---|---|
스프링 컨테이너 (0) | 2022.06.15 |
IoC, DI 그리고 Container (0) | 2022.06.15 |
스프링이란 - 2 (0) | 2022.04.11 |