backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 1. OCP(Open/Closed Principle, 개방-폐쇄 원칙)
  • 3. DIP(Dependency Inversion Principle, 의존성 역전 원칙)
  1. 스프링
  2. Spring Boot
  3. 01 스프링 등장 배경, 객체지향

스프링 등장 배경, 객체지향 보충자료

1. OCP(Open/Closed Principle, 개방-폐쇄 원칙)

1.1 OCP란?

소프트웨어 요소는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다는 원칙입니다.

  • 즉, 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있어야 합니다.

  • 이 원칙은 코드의 유지보수성을 높이고, 시스템의 유연성을 증가시킵니다.

1.2 OCP와 다형성

OCP를 구현하는 데 중요한 개념이 **다형성(Polymorphism)**입니다.

  • 예를 들어, 붕어빵 틀을 생각해봅시다.

    • 붕어빵 틀(기본 구조)은 그대로 두되, 안에 넣는 재료만 바꿔도 다른 맛의 붕어빵을 만들 수 있습니다.

    • 역할과 구현을 분리해 놓으면, 새로운 재료(새로운 클래스)를 추가하더라도 기존 코드를 수정할 필요가 없습니다.

예제: 인터페이스를 활용한 설계

// 역할 정의
public interface Ingredient {
    String getIngredient();
}

// 구현 클래스
public class RedBean implements Ingredient {
    public String getIngredient() {
        return "Red Bean";
    }
}

public class Cream implements Ingredient {
    public String getIngredient() {
        return "Cream";
    }
}

// 붕어빵 생성
public class BungeoppangMaker {
    private final Ingredient ingredient;

    public BungeoppangMaker(Ingredient ingredient) {
        this.ingredient = ingredient;
    }

    public void make() {
        System.out.println("Making Bungeoppang with " + ingredient.getIngredient());
    }
}

// 새로운 재료를 추가해도 기존 코드는 수정할 필요 없음
public class Chocolate implements Ingredient {
    public String getIngredient() {
        return "Chocolate";
    }
}

1.3 OCP 구현 시 주의점

  • 확장성을 확보하려면 새로운 클래스(예: 새로운 재료)만 추가하고, 기존 코드는 건드리지 않도록 설계해야 합니다.

  • 객체 생성 및 연관 관계 설정은 별도의 설정자(조립자)가 필요합니다.

    • 예: 스프링 프레임워크가 이 역할을 수행합니다.

3. DIP(Dependency Inversion Principle, 의존성 역전 원칙)

3.1 DIP란?

고수준 모듈은 저수준 모듈에 의존해서는 안 된다. 둘 다 추상화에 의존해야 한다는 원칙입니다.

  • 의존성은 항상 **구체화(Concrete)**가 아닌 **추상화(Abstract)**에 맞춰야 합니다.

  • 즉, 구현 클래스가 아닌 인터페이스에 의존하도록 설계해야 합니다.

3.2 DIP와 의존성 주입(DI)

  • DIP는 객체 간 의존성을 인터페이스로 분리하는 설계를 요구합니다.

  • **의존성 주입(DI)**은 DIP를 구현하는 데 사용되는 방법 중 하나입니다.

  • 의존성을 외부에서 주입받아, 구체 클래스가 아닌 인터페이스에 의존하도록 만듭니다.

DIP를 준수하지 않은 설계

public class Service {
    private final Repository repository;

    public Service() {
        this.repository = new MySQLRepository(); // 구체 클래스에 의존
    }
}

DIP를 준수한 설계

public interface Repository {
    void save(String data);
}

public class MySQLRepository implements Repository {
    @Override
    public void save(String data) {
        System.out.println("Saving to MySQL: " + data);
    }
}

public class Service {
    private final Repository repository;

    public Service(Repository repository) { // 추상화에 의존
        this.repository = repository;
    }

    public void saveData(String data) {
        repository.save(data);
    }
}

3.3 DIP와 스프링

  • 스프링은 **의존성 주입(DI)**을 통해 DIP를 구현합니다.

  • 개발자는 인터페이스를 정의하고, 실제 구현체는 스프링 컨테이너가 주입해줍니다.

Previous01 스프링 등장 배경, 객체지향Next02 IOC(제어의 역전), DI(의존성 주입)

Last updated 4 months ago