Group Study (2022-2023)/Spring 심화

[Spring 심화] 1주차 스터디 - 1장 오브젝트와 의존관계

Eundongdong 2022. 10. 3. 05:15

 

스프링

자바(객체지향)을 기반으로 한 기술

오브젝트(사이클)이 중요하다

다형성 [객체 지향 특징]

: 역할(interface)와 구현(객체)로 나누는 것. 단순, 유연, 변경이 편리해진다.

다형성을 통해 클라이언트는 대상의 역할(interface)만 알면 되고, 내부구조를 모르거나 변경되어도 영향을 받지 않는다.

객체 설계 시 역할(interface)먼저 부여 → 이후 역할(객체) 만들기

실행 시점에 인스턴스를 유연하게 변경할 수 있다.

클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있다.

⇒ 제어의 역전(IoC), 의존 관계 주입(DI)는 다형성을 활용해 역할과 구현을 편하게 다룰 수 있도록 도와준다

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

SRP : 단일 책임 원칙(single responsibility principle)

         한 클래스는 하나의 책임만 가져야 한다.

OCP : 개방 -폐쇠 원칙(Open/closed principle)

         확장에는 열려있으나 변경에는 닫혀있어야 한다.

         다형성 활용

LSP : 리스코프 치환 원칙(Liskov subsituation principle)

         객체는 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.

ISP : 인터페이스 분리 원칙(Interface segregation principle)

         여러개 인터페이스가 하나의 범용인터페이스보다 낫다

DIP : 의존관계 역전 원칙(Dependency inversion principle)

         인터페이스에 의존 (역할에 의존)

용어 정리

DAO(Data Access Object)

DB를 이용해 데이터를 조회하거나 조작하는 기능 전담 오브젝트

자바빈

  • 디폴트 생성자 : 자바빈은 파라메터가 없는 디폴트 생성자
  • 프로퍼티 : 자바빈이 노출하는 이름을 가진 속성, set,get으로 수정 및 조회 가능

IoC방식으로 관리하는 오브젝트

스프링이 직접 그 생성과 제어를 담당하는 오브젝트만 빈

싱글톤 패턴

디자인패턴 중 하나로, 무상태로 설계해야 한다.

어떤 클래스를 하나만 존재하도록 강제하는 패턴. 단일 오브젝트만 존재해야하며 애플리케이션 내에서 전역 접근 가능하다. 빈은 주로 싱글톤 스코프를 같는다.

조건 특정 클라이언트에 의존되는 필드가 있으면 안된다.
특정 클라이언트가 값을 변경하는 필드가 있으면 안된다.
가급적 읽기만 해야한다.
지역변수,파라미터를 사용한다.
한계 private라 상속 불가
테스트하기 힘들다.
서버에서는 보장되지 않는다.
전역상태는 바람직하지 못하다.

 

이상적인 Spring 설계와 가까워지는 과정

  1. 모든 기능 한 파일에 한꺼번에 → 2. 관심사의 분리 →3. 상속(템플릿 메소드) → 4. 클래스 분리 → 5. 인터페이스 도입 → 6. 관계설정 책임의 분리(클라이언트에게) → 7. 제어의 역전(오브젝트팩토리) → 8. spring을 이용한 애플리케이션 컨텍스트 이용 → 9. 의존관계 주입(DI)

2. 관심사의 분리

리팩토링

내부 구조를 변경해서 재구성하는 작업 또는 기술

3. 상속(템플릿 메소드)

디자인 패턴

소프트웨어 설계 시 특정 상황에서 자주 발생하는 문제를 해결하기 위해 사용할 수 있는 재사용 가능한 솔루션. 주로 객체 지향 설계에 관한 것이다.

템플릿 메소드 패턴

상속을 통해 확장한다.

택토리 메소드 패턴

상속을 통해 기능을 확장한다. 슈퍼클래스 코드에서는 서브 클래스에서 구현할 메소드를 호출해 필요한 타입의 오브젝트를 가져와 사용한다.

4. 클래스 분리

추상화

어떤 것들의 공통적인 성격을 뽑아내 따로 분리

5. 인터페이스 도입 + 6. 관계 설정 책임의 분리

클라이언트의 책임

런타임 오브젝트 관계를 갖는 구조로 만들어 주는 것

높은 응집도

하나의 모듈,클래스가 하나의 책임 또는 관심사에만 집중되어있다.

낮은 결합도

책임과 관심사가 다른 오브젝트 또는 모듈과 낮은 결합도

전략 패턴

디자인 패턴 중 하나로 Context에서 필요에 따라 변경이 필요한 알고리즘을 외부로 분리시켜, 필요에 따라 바꿔서 사용할 수 있게 하는 디자인 패턴

팩토리

객체의 생성방법을 결정하고, 만들어진 오브젝트를 돌려주는 것. 생성/사용의 역할과 책임을 깔끔하게 분리하는 목적으로 사용

7. 제어의 역전(IoC)

컴포넌트 : 실질적인 로직

설계도 : 애플리케이션을 구성하는 컴포넌트의 구조와 관계 정의

프레임워크 : 제어의 역전 개념이 적용된 대표적인 기술

8. 애플리케이션 컨텍스트 이용

빈팩토리보다 애플리케이션 전반에 걸쳐 모든 구성요소의 제어를 담당하는 IoC엔진

장점 클라이언트는 구체적인 클래스 팩토리 클래스를 알 필요가 없다.
IoC 서비스 제공
빈을 검색하는 다양한 정보가 있다.

 


의존관계

의존관계는 정적인 클래스의존관계와 실행시점에 결정되는 동적인 객체(인스턴스)의존관계 둘을 분리해 생각해야 한다.

의존 오브젝트

프로그램이 시작되고 오브젝트가 만들어지고 나서 런타임시에 의존관계를 맺는 대상

의존관계 주입(DI)

조건  클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다.
따라서 인터페이스에만 의존하고 있어야 한다.

런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3자가 결정
의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로써 만들어진다.

 

의존관계 검색(DL)

자신이 필요로하는 의존 오브젝트를 능동적으로 찾는다.

public UserDao{
	AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(DaoFactory.class);
	this.connectionMaker = context.getBean("connectionmaker",ConnectionMaker.class);
}

 

의존관계 주입DI 검색 오브젝트가 빈이어야 한다.
의존관계검색DL 검색 오브젝트가 빈일 필요가 없다.

메소드를 통한 DI

Setter 사용과 일반 메소드를 DI용으로 사용으로 구분된다.

DataSource 인터페이스

DB연결과 풀링 기능을 갖춘 클래스가 존재하여 주로 이를 사용한다.


XML

기본 설정

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

빈에 대한 정의 <bean> 태그 이용

속성 : id, class, scope, primary,lazy-init,init-method,destroy-method

 


10.3 비대면 토론 내용 정리 (발표자 : 김은지)

Q. DI와 DIP는 무슨 관계인가요?

A. DI가 결국에는 DIP 원칙을 구현하기 위해 스프링이 채택한 방법으로 DIP는 추상적인 개념이다. 또한 IoC 개념이 적용된 결과물

Q. IoC가 헷갈려요!

A. Don't call me, I call you.  스프링 부트가 처음에 뜰 때 스프링빈들을 컨테이너에서 알아서 스캔해서 관리하는데, 그 과정에서 생성자를 통해 빈을 생성할 때 호출하는 주체가 우리가 아니라 스프링 컨테이너가 되는 것

Q. OCP가 헷갈려요!

A. 인터페이스로 구현하는것. 인터페이스를 구현할 클래스가 어떤 기능을 할 건지 역할을 정해두고 그 역할만 코드를 작성하니까 확장에는 열려있고 변경에는 닫혀있다는 의미로 받아들였다.

Q. 다형성은 스프링을 관통하는 주제인가요?

A. 스프링이 지향하는 방향. 스프링이 존재하는 이유는 좀 더 객체지향적인 프로그래밍을 지원하기 위해서이다. 

참고하면 좋을 블로그

https://velog.io/@eddy_song/series/why-behind-object-oriented

https://vagabond95.me/posts/about-ioc-dip-di/

 

IoC, DI, DIP 개념 잡기 - 기록은 기억을 지배한다

IoC, DIP, DI 는 항상 혼동되는 개념이다. 각 개념을 서로 같다고 표현하는 글들도 제법 있고, 각 개념의 정의를 살펴보니 직관적으로 이해가 되지 않았다. 요즘 특히 DI 에 대한 내용이 많이 언급되

vagabond95.me

틀린 부분이 있다면 댓글로 알려주시면 바로 반영하겠습니다!