객체지향 프로그래밍(Object Oriented Programming)

Gyuhan Park·2022년 9월 6일
0

spring

목록 보기
13/18


스프링은 자바 기반의 프레임워크
=> 자바의 가장 큰 특징은 객체 지향 언어
=> 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크

좋은 객체 지향 프로그래밍이란?

객체 지향 프로그래밍이란 프로그램을 유연하고 변경이 용이하게 만드는 것
=> 다형성을 가지는 것

>> 객체를 설계할 때 역할과 구현을 명확히 분리하라 !!!

자바 언어의 다형성 활용

  • 역할 = 인터페이스
  • 구현 = 인터페이스를 구현한 클래스, 구현 객체

객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
다형성으로 인터페이스를 구현한 객체를 오버라이딩을 이용하여 실행 시점에 유연하게 변경할 수 있다.
클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.

좋은 객체 지향 설계의 5가지 원칙 (SOLID)

  1. SRP: 단일 책임 원칙(single responsibility principle)
  2. OCP: 개방-폐쇄 원칙 (Open/closed principle)
  3. LSP: 리스코프 치환 원칙 (Liskov substitution principle)
  4. ISP: 인터페이스 분리 원칙 (Interface segregation principle)
  5. DIP: 의존관계 역전 원칙 (Dependency inversion principle)

객체 지향의 핵심은 다형성
다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없다.
다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다.
다형성 만으로는 OCP, DIP를 지킬 수 없다.

public class MemberService {
	private MemberRepository memberRepository = new MemoryMemberRepository();
}

// 다른 구현체로 갈아끼우는 경우
	//private MemberRepository memberRepository = new MemoryMemberRepository();
	private MemberRepository memberRepository = new JdbcMemberRepository();

위 코드는 MemberRepository 인터페이스를 설계한 후 새로운 구현체로 바꾸는 작업이다. MemberService는 클라이언트 코드인데 아래의 경우 구현체를 갈아 끼울 때, 즉 확장을 할 때 클라이언트의 코드를 변경해야하므로 OCP를 위반한다.
또한 memberRepository는 MemberRepository라는 인터페이스에 의존하지만, 동시에 구현체에도 의존하므로 DIP를 위반한다.

다형성 한계 해결방안

DI(Dependency Injection): 의존관계, 의존성 주입
스프링은 다음 기술로 다형성 + OCP, DIP를 가능하게 지원
DI 컨테이너 제공
클라이언트 코드의 변경 없이 기능 확장 쉽게 부품을 교체하듯이 개발

[참고] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글