일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- JPA
- Java Reflection API
- testresttemplate
- 테스트 코드
- ResponseEntity
- Not Acceptable
- 정적 컨텐츠
- 빈 스코프
- 의존성 주입
- restTemplate
- 가을야구
- 기본 생성자
- SpringBootTest
- entity
- jdbc
- 좋은 객체지향 설계 원칙
- 키움
- 의존관계 자동 주입
- 랜덤 포트
- 스프링
- RunWith
- jdbc template
- 통합 테스트
- 406 NOT_ACCEPTABLE
- 스프링 데이터 JPA
- 스프링 IoC 컨테이너
- 스프링 컨테이너
- 컴포넌트 스캔
- 405 METHOD_NOT_ALLOWED
- Controller
- Today
- Total
코드네임 JY
[스프링 핵심] 다형성 본문
미리보기
✅ 다형성에 대해 알아보자!
✅ 스프링에서 다형성을 어떻게 활용할 수 있는지 알아보자!
🍣 다형성 (Polymorphism)
객체지향 프로그래밍의 특징은 프로그램을 유연하고 변경이 용이하게 만든다는 장점이 있는데,
여기서 '유연하고 변경이 용이하다' 라는 것을 다형성과 연관지어 설명하고자 한다.
다형성의 정의는 '하나의 객체가 여러가지 타입을 가질 수 있는 것' 이라고 설명이 되어있는데, 말만 보면 잘 모르겠다.
김영한 강사님이 들어주신 구체적인 예시를 토대로 또 다른 예시를 만들어보겠다.
오늘 어떤 옷을 입을지 고민하는 사람이 있다. 어떤 상의를 입을지.. 고민하는 사람에게 3개의 선택지가 있다.
셔츠, 후드티, 니트라는 3가지의 선택지 중에서, 어떤 옷을 입던 (상의의 역할만 수행한다면!) 사람에게 영향을 주지 않는다.
쉽게 말해서, '셔츠'에서 '후드티'로 바뀌더라도 입는 사람에게는 영향이 없다는 것이다.
여기서 말하는 '영향'은... 팔을 하나 더 만들어야(?)하는 등 사람이 무언가를 하도록 영향을 주는 것을 말한다.
기준이 되는 '상의 역할'만 수행한다면, 이를 구현하는건 셔츠, 후드티, 니트로 가능하다. 또는 새로운 상의를 더 추가할 수 있다!
완전히 새로운 상의가 나와도 이는 기존의 '상의 역할' 만 따라할 수 있다면, 새로운 상의를 추가할 수 있는 것이다!
자바로 생각하면, '상의 역할'을 인터페이스라고 생각하고, '상의 구현'을 (인터페이스를 구현한) 구현체 클래스라고 생각할 수 있다.
'사람 역할'은 클라이언트, '상의 역할'은 서버라면, "클라이언트에 영향을 주지 않고, 새로운 기능을 제공할 수 있다!"
위에서 말했던 "어떤 옷을 입던 사람에게 영향을 주지 않는다" → "클라이언트에 영향을 주지 않고",
"새로운 상의를 더 추가할 수 있다" → "새로운 기능을 제공할 수 있다" 와 같이 치환할 수 있다!
'역할'과 '구현'을 분리한다면, 객체지향 프로그래밍의 특징인 '유연하고 변경에 용이하다' 라는 것을 가능하게 할 수 있다!
자바에서도 마찬가지다. 객체를 설계할 때 '역할(인터페이스)'을 먼저 부여하고, 해당 역할을 '구현(클래스)' 하는 것이 더 좋다!
🍙 스프링에서 다형성 활용하기
그렇다면 스프링에서는 어떤 방식으로 다형성을 활용할 수 있을까..
이전에 공부했던 것들 중에 위 사진처럼 클래스 다이어그램을 구현해야 할 때가 있었다.
MemberRepository 라는 인터페이스를 (Memory 구현 & Jdbc 활용 구현) 두 가지의 클래스로 구현하고 있고,
MemberService는 MemberRepository 라는 인터페이스에 의존하고 있는 상황이다.
다형성의 본질은 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경 할 수 있어야하는데,
MemberService를 수정하지 않고 Repository를 DB에서 Jdbc로 변경하고 싶다면, 어떤 개념을 떠올려야 할까?
이전 포스팅을 살펴보면 우리는 '제어의 역전(Inversion of Control)'과 '의존성 주입(Dependency Injection)'을 공부했다.
스프링에서는 '제어의 역전'과 '의존성 주입'을 활용해 다형성의 본질을 극대화 할 수 있다!
뒤에서 코드와 함께 더 구체적인 포스팅을 올리도록 하겠다.
'백엔드 공부' 카테고리의 다른 글
[스프링 핵심] 스프링 컨테이너 (0) | 2023.01.03 |
---|---|
[스프링 핵심] 좋은 객체지향 설계의 5가지 원칙 (0) | 2023.01.02 |
[스프링 입문] AOP (0) | 2022.12.15 |
[스프링 입문] 스프링 통합 테스트 (0) | 2022.12.15 |
[스프링 입문] JPA & 스프링 데이터 JPA (0) | 2022.12.14 |