Spring 강의/springMVC

springMVC 기본 - (1) 좋은 객체 지향 설계와 스프링

lxexjx 2022. 3. 6. 21:33

[객체지향]

spring은 좋은 객체 지향 애플리케이션 개발이 가능하게 도와주는 프레임워크

 

객체 지향은 무엇인가?   

객체들의 모임.협력, 유연하고 변경 용이(컴포넌트를 쉽고 유연하게 변경->다형성)

 

다형성 : 역할+구현으로 분리

자바는 역할(인터페이스)+구현(인터페이스 구현한 클래스 혹은 구현 객체)

 

역할의 인터페이스를 따라서 구현했기때문에 역할에만 의존 -> 무한히 확장 가능(확장 가능한 설계), 클라이언트에 영향을 주지 않고 새로운 기능 제공

클라이언트는 내부 구조 몰라도 인터페이스만 알면됨.  

역할=인터페이스, 구현=인터페이스를 구현한 클래스설계 역할이 더 중요해!!

(역할, 인터페이스가 변하면 모두 영향을 받으아 인터페이스를 잘 설계한는게 중요해 )

클라이언트 변경 없이 서버의 변경 구현을 유연하게

 

MemeberRepository에 MemberRepository 인터페이스를 구현한 두개를 주입할 수 있음.

다형성의 본질 : 클라이언트의 변경없이 인터페이스를 구현한 객체 인스턴스를 유연하게 변경 가능 

인터페이스를 안정적인 설계 중요

 

 IoC, DI는 다형성을 통해 역할과 구현은 편리하게 다루도록 지원하는 것

스프링 컨테이너는 다형성을 편리하게 사용할 수 있도록 지원하는 기능 -> 스프링 사용하면 구현을 편리하게 변경 가능

 



[SOLID]

1) 단일 책임원칙 : 하나의 클래스는 하나의 책임만갖는다.

 변경이 있을 때  파급 효과가 적으면 단일책임원칙을 잘 따름.

 

2) 개방폐쇄 원칙 : 확장에는 열려있으나 변경에는 닫혀있어야한다.

코드의 변경없이 기능추가? 다형성에서 역할과 구현을 잘 분리.

기존코드 변경 없이 인터페이스 의 구현 클래스를 만들뿐

but구현 객체를 변경하려면 클라이언트 코드(MemberService)를 변경해 다형성을 못지킴

MemberService에서 구현 클래스 선택시 구현 객체를 변경시에 클라이언트 코드를 변경해야됨

MemberRepository m = new MemoryMemberRepository();  //기존 코드

MemberRepository m = new JdbcMemberRepository();   //변경 코드

이건 OCP가 깨져

 스프링이 객체를 생성하고 관계를 별도 조립 필요

 

3) 리스코르 치환 원칙 : 컴파일에서의 문제가 아닌 인터페이스를 구현시 옳게 구현해야한다. 기능적으로 보장돼야함

 

4) 인터페이스 분리 원칙 : 맞게 적당한 크기로 인터페이스를 분리해 인터페이스가 변해도 클라이언트에 영향안줌. 대체가능높아짐

 

5) 의존 관계 역전 원칙 : 추상화(역할)에 의존하지 구체화(구현)에 의존하면 안된다.

클라이언트 코드가 구현 클래스말고 인터페이스에 의존해야됨.

memberService->memberRepository 인터페이스만 바라봐 memorymemberRepository나 jdbc~는 몰라 .

역할에 의존 (추상화에 의존해야지 구체화에 의존하면 안된다.) 역할과 구현을 철저히 분리.

클라이언트가 인터페이스에 의존해라 구현에 의존하면 변경이 힘들어져

 

 


[객체 지향]

객체지향의 핵심은 다형성!

하지만 다형성만으로 구현 객체 변경시 클라이언트 코드도 변경돼 다형성만으로 OCP, DI못지켜서 

∴ 스프링의 DI컨테이너(자바객체를 컨테이너에 넣어놓고 의존관계 연결과 주입)와 di로 클라이언트 코드 변경없이 확장 가능 

역할과 구현을 분리하자. 유연하게 교체 변경가능하게 하는게 다형성과 ocp,di를 지켜야됨.그게 바로 스프링컨테이너다 인터페이스를 먼저 만들자? 간단한 인터 만들고 진행하고 구현은나중에 갈아껴

 

스프링은 DI, DI컨테이너로 OCP, DIP를 가능하게 지원

 

DI란? 의존관계 주입

DI컨테이너란? 자바 객체들을 컨테이너에 넣어놓고 의존관계를 연결하고 주입해줘. 그래서 클라이언트의 교체없이 기능확장 가능