본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2024 Spring Boot 스터디] 유태근#1 주차 - Spring?

반응형

섹션 1 - 객체 지향 설계와 스프링

스프링이란?

    • 자바 기반의 프레임워크로 좋은 객체 지향 프로그래밍을 할 수 있도록 도와준다.
    • 이름의 유래는 이전에 기술의 복잡도가 증가해서 성능이 느렸던 시절을 "겨울" 빗대어 겨울 후의 ""으로 새로운 시작한다는 것을 의미하는 스프링() 되었다고 한다.

스프링 부트란?

  • 스프링 프레임워크 및 관련 스프링 라이브러리를 편리하게 사용할 수 있도록 지원한다.
  • 별도의 웹 서버를 설치하지 않아도 되며 관례에 의한 간결한 설정이 가능하다.

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

  • 객체는 메시지를 주고 받으며 협력한다.
  • 유연하고 변경에 용이하다.

객체 지향 프로그래밍의 특성 중 다형성이란?

 

        • 특징
          • 역할(인터페이스) 구현(구현 클래스) 분리한다.
          • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 있다. 
          • 설계시 역할을 먼저 부여하고, 역할을 수행하는 구현 객체 만든다.
        • 한계
          • 인터페이스가 변하면, 클라이언트 서버 모두 변경이 발생한다.
          • 인터페이스를 안정적으로 설계하는 것이 중요하다.

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

 

SRP 단일 책임 원칙

  • 한 클래스는 하나의 책임만 가진다.
  • 변경에 따른 파급력을 최소화한다.

OCP 개방-폐쇠 원칙

  • 확장에는 열려있지만 변경에는 닫혀있다.
  • 다형성을 활용하여 인터페이스의 구현 클래스를 추가한다.

LSP 리스코프 치환 원칙

  • 컴파일뿐만 아니라 프로그램의 기능을 변경하지 않으면서 하위 타입의 인스턴스로 변경이 가능하다.

ISP 인터페이스 분리 원칙

  • 각 역할에 맞게 여러 개의 인터페이스로 분리하여 재사용성을 높인다.

DIP 의존관계 역전 원칙

  • 추상화(인터페이스)에 의존하며 구체화(구현 클래스)에 의존하지 않는다.

실무 고민

  • 추상화를 하기 위한 추가 비용이 발생할 수 있다.
  • 기능을 확장할 가능성이 없다면 후에 꼭 필요할때 인터페이스를 도입하는 것도 방법이다.

섹션 2 - 예제 만들기

다음 3가지를 통해 비즈니스 요구사항을 설계할 수 있다.

 

1. 기획자도 알아볼 수 있는 도메인 협력 관계

 

 

2. 협력 관계를 바탕으로 개발자가 구체화해서 만들어낸 클래스 다이어그램

- 정적인 클래스 의존관계로 실제 어떤 객체가 주입될 지 알 수 없다.

 

 

3. 동적인 클래스 의존관계로 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계를 표현하는 객체 다이어그램

 

 

 

전역 변수를 사용할 Map은 동시성 이슈로 문제가 발생할 수 있으므로 ConcurrentHashMap을 사용한다.

 

객체의 속성을 확인해보고 싶을때는 toString() 함수를 이용한다.

하지만 애플리케이션 로직으로 테스트하는 것은 좋은 방식이 아니다.

 

given + when + then 을 통한 JUnit 테스트를 사용한다.

섹션 3 - 객체 지향 원리 적용

변경 전

인터페이스 뿐만 아니라 구체 클래스도 의존하고 있다.

-> DIP 위반

 

새로운 할인 정책을 적용하려면 구현체도 함께 변경해야 한다.

-> OCP 위반

변경 후

인터페이스에만 의존하도록 코드 변경

-> DIP 만족

단일 책임 원칙을 따르면서 관심사를 분리

-> 구현 객체를 생성하고 연결하는 책임을 갖는 별도의 클래스를 생성한다.

-> 이를 통해 기존의 클라이언트 객체는 자신의 역할에 집중할 수 있다.

 

특정 기능을 교체하기 위해 사용 영역(클라이언트)의 코드는 변경할 필요 없이 구성 영역만 변경하면 된다.

-> OCP 만족

AppConfig를 통해 애플리케이션의 사용 영역객체를 생성하고 구성하는 영역으로 분리하였다.

-> SRP 만족

제어의 역전 IOC(Inversion of Control)

: 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는

의존관계 주입 DI(Dependency Injection)

: 정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계로

  외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결 되는

IOC 컨테이너, DI 컨테이너

: 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것

반응형