CNU_SW_모각코

13주차 모각코 학습 결과(22.09.28 13:30 ~ 16:30)

nayeonee__ 2022. 10. 1. 14:15

 

 

* 패스트캠퍼스 스프링부트 강의 

(5) 소프트웨어 설계 원칙과 디자인 패턴
지금까지 개선한 코드를 소프트웨어 설계 원칙과 패턴을 연결 지어서 살펴보기

* SOLID 원칙 (Single responsibility. Open/closed. Liskov substitution. Interface segregation. Dependency inversion principle)

- SOLID 는 깔끔한 설계를 위해 적용 가능한 다섯가지 소프트웨어 설계 원칙이다.

- 함수와 데이터 구조를 클래스로 배치하는 방법, 그리고 이들 클래스를 서로 결합하는 방법으로 구성되어 있다.

- 모듈과 컴포넌트 내부의 구조를 이해하기 쉽고, 변경에 유연하게 만드는데 목적을 두고 있다.

 

@ 개방 폐쇄 원칙 (Open-Closed Principle: OCP) : 소프트웨어 개체는 확장에는 열 려 있어야 하고, 변경에는 닫혀 있어야 한다.

: MovieFinder 는 메타데이터 읽기라는 기능을 확장하는 데는 열려있다. MovieFinder 에 영향을 전혀 주지 않고도 MovieReader 를 통해 얼마든지 기능을 확장 할 수 있게 된다.

: 동시에 MovieFinder 자신의 핵심 기능을 구현한 코드는 그런 변화에 영향을 받 지 않고 유지할 수 있으므로 변경에는 닫혀 있다고 말할 수 있다.

: 리팩토링을 하기 전의 코드를 생각해보면 확장에 필요한 유연성은 부족하고, 확 장하려면 결국 내부 코드를 고쳐야 하니 변경에 구멍이 나 있는 셈이다.

: 개방 폐쇄 원칙이 적용된 후에는 MovieReader 인터페이스를 통해 제공되는 확 장 지점은 활짝 개방되어 있다.

: 반면 인터페이스를 이용하는 MovieFinder 클래스는 자신의 변화가 불필요하게 일어나지 않도록 굳게 폐쇄되어 있다.

 

@ 의존성 역전 원칙 (Dependency-inversion Principle: DIP) : 상위 정책은 하위 정 책에 의존하면 안된다. 하위 정책이 상위 정책에 정의된 추상 타입에 의존해야 한다.

: 리팩토링을 하기 전의 코드는 MovieFinder 가 직접 CsvMovieReader 를 의존 하고 있었다.

: 이는 상위 정책인 MovieFinder 가 하위 정책인 CsvMovieReader 에 의존하게 되는 것인데, 이런 구조에서는 추상화된 MovieReader 의 다형성이 동작하기 어렵다.

: MovieFinder 가 직접 구체적인 CsvMovieReader 객체를 생성하기 때문에 JaxbMovieReader 와 같은 다른 MovieReader 구현체를 사용할 수가 없다.

: 의존성 역전 원칙이 적용된 후에 코드 구조를 보면 MovieFinder 는 추상화된 MovieReader 에만 의존해서 런타임의 생성자를 통해 CsvMovie 객체를 전달받아 동작한다.
:
때문에 다형성을 적극적으로 활용할 수 있으며 객체의 재사용성이 높아진다.

 

* 관심사의 분리(Separation of Concerns)와 높은 응집도, 낮은 결합도

- 관심이 같은 것 끼리는 한곳으로 모으고, 다른 것은 따로 떨어려 서로 영향을 주지 않도록 분리하는 것이다.

- 응집도가 높다는 하나의 모듈, 클래스가 하나의 책임 는 관심사에만 집되어 있다는 이다.

불필요하나 직접 관이 없는 부의 관심과 책임이 혀 있지 않으며, 하나의 공 통 관심사는 한 클래스에 모있다.

높은 응집도는 클래스 레벨뿐만이 아니라 패, 컴포넌트, 모듈에 이기까지 그 대상의 기가 달라도 동일한 원리로 적용수 있으며, 화도 이 원리에 따라 적용 된다.

- 결합도가 낮다는 하나의 오브젝트가 변경때에 관계를 고 있는 다른 오브젝 트에 영향을 안다는 이다.

책임과 관심사가 다른 클래스 는 모듈과는 낮은 결합도, 느슨하게 연결된 형를 유지하는 것이 바람직하다.

느슨한 결합은 관계를 유지하는 데 필요한 소한의 방법만 접적인 형로 제 공하고 나지는 서로 독립적이고 필요 없게 만들어 주는 것이 .

결합도가 낮아지면 변화에 대응하는 도가 높아지고 구성이 깔끔해진다. 한 확장 하기에도 리하다.

낮은 결합도는 높은 응집도보다 조금 더 민감한 원리라고도 수 있

 

* 디자인 패턴(Design Pattern)
-
소프트웨어 개과정에서 발견된 설계의 하우를 정리하인 것 - 자주 생하는 문제에 대해 검증된 해결책을 제시함

: MovieFinder MovieReader 의 구조를 디자인 패턴의 시각에서 보면 전패턴에 해한다고 수 있다.

: 패턴은 디자인 패턴의 이라고 불하게 활용되는 패턴으로, 개방 폐쇄 원칙의 실현에도 가장 잘 들어는 패턴이라 수 있다.

: 패턴은 자신의 기능 맥락에서 필요에 따라 변경이 필요한 고리을 추상화를 통해 통부로 분리시, 이를 구현한 구체적인 고리클래스를 필요에 따라 바꿔 사용할 수 있게 하는 디자인 패턴

: MovieFinder 는 전패턴의 콘텍스트에 해하며 콘텍스트는 자신의 기능을 수하 는 데 필요한 기능 에서 변경 가능한, 즉 메타데이터 읽기 고리MovieReader 라는 인터페이스로 추상화 하고 이를 구현한 클래스, 즉 전바꿔 가면서 사용할 수 있게 분리한 것
: 템플릿 메소드 패턴 = 리하는 일부분을 서클래스로 캡슐화해서 전체 구조는 바꾸지 않으면서도 위를 수하는 전바꾸는 패턴

MovieFinder 에서 영화 검색리하는 주요 로직을 작성하고 영화 목록을 loadMovies 메소드만 추상화 시.
이후 상을 통해 서클래스에서 영화 목록을 위를 구체적으로 작성했다.

 

(6) 의존관계와 의존관계 주입 (Dependency Injection, DI)

* 의존관계와 의존관계 주입
- 의존관계는 클래스 는 모듈이 다른 클래스 는 모듈에 의존할 때 형성된다.

- 의존관계 주입은 의존관계에 있는 오브젝트들을 런타임 시 연결해주는 작이다.

- 스프링 IoC 기능의 대적인 동작원리는 의존관계 주입이다.

 

의존 관계 주입에는 3가지 방법이 있다.
#
생성자 주입(constructor injection) : 객체를 생성하는 시점에 생성자를 통한 의존관 계를 주입한다.
#
설정자 주입(setter injection) : 객체를 생성 후 설정자(setter) 메서드를 통한 의존관 계를 주입한다.
#
메소드 주입(method injection) : 메서드 실시 인자를 이용한 의존관계를 주입한다.