김영한 스프링 핵심 원리(기본편) - 객체 지향 설계와 스프링

개발할래·7일 전
0

개발

목록 보기
11/14
post-thumbnail

1. 객체 지향 설계와 스프링

들어가기전,

자바 진영의 추운 결과 스프링의 탄생 -> 스프링 탄생의 시대적 배경 (학습 도움)
2000년대 초반, 자바 표준 기술의 최고봉 EJB(Enterprise Java Beans)

  • 사용하기에 복잡하고, 느리고, 어렵고, 코드가 산만함, EJB에 의존적
    -> POJO(Plain Old Java Object) - 간단한 원래 자바 오브젝트로 돌아가자

  • 이후 로드 존슨이라는 개발자는 EJB를 비판 관련 책을 출간 현재의 스프링 핵심 개념과 기반 코드가 들어가 있음

  • 개발자 개빈 킹은 EJB의 엔티티빈 기술을 대체 할 오픈소스 기술인 Hibernate 개발 -> 당시 ORM 기술은 대다수가 Hibernate 기술을 사용
    이후 Hibernate를 기반으로 자바 ORM 기술 표준인 JPA를 만듦

표준 인터페이스의 구현체로 Hibernate나 EclipseLink 등 여러 구현체들이 있다.

2. 스프링 이란

스프링이란 무엇인가?
스프링이라는 이름은 전통적인 J2EE(EJB)라는 겨울을 넘어 새로운 시작이란 뜻으로 작명 되었다.

  • 스프링은 특정 한 가지가 아닌, 여러가지 기술들의 모음

  • 핵심 : 스프링프레임워크, 스프링 프레임워크를 편하게 이용 가능하게 하는 스프링부트
    기타 : 그 외 스프링 데이터, 스프링 세션, 스프링 시큐리티, 스프링 Rest Docs, 스프링 배치, 스프링 클라우드, 스프링 웹 서비스 등등
    (참고) https://spring.io/ -> Projects -> Overview에는 빌드에 도움을 주는 스프링 프로젝트들이 있음

*스프링 핵심 원리 - 기본편에서는 스프링프레임워크 핵심 기술에 초점

  • 스프링 프레임 워크
    하나의 기술이 아닌, 다양한 기술들의 총집합체
  1. 핵심 기술: 스프링 DI 컨테이너(IoC 컨테이너), AOP(관점 지향 프로그래밍), PSA(서비스 추상화) 등
  2. 웹 기술: 스프링 MVC, WebFlux
  3. 데이터 관련 기술 : 트랜잭션, JDBC, ORM/XML 지원
  4. 기술 통합 : 캐시, 이메일, 원격접근, 스케줄링 등
  5. 테스트 코드
  • 스프링 부트
    스프링 프레임워크를 편하게 이용 가능하게 하는 스프링부트
  1. 단독 실행 가능한 스프링 어플리케이션 쉽게 생성
  2. Tomcat이 임베디드 -> 이전과 다르게 별도 설치 필요 없음
    차이점 참고 : https://thxwelchs.github.io/EmbeddedTomcat%EA%B3%BCTomcat%EC%9D%98%EC%B0%A8%EC%9D%B4/
  3. 쉬운 빌드 구성을 위한 starter 종속성 제공
    필요한 라이브러리를 개별로 다운받는 것이 아니라, 하나의 라이브러리만 다운 받아도 의존된 모든 라이브러리가 다운 가능하다.
    (Spring Boot Starter Web, Spring Boot Starter Data JPA, Spring Boot Starter Security, Spring Boot Starter Thymeleaf, Spring Boot Starter Test)
    4, 스프링과 외부 라이브러리 자동 구성
    예를 들어 JPA와 H2 데이터베이스 통합을 예시로 들수 있다.
  • 스프링의 핵심
    스프링은 객체 지향 프로그래밍의 강력한 특징을 살려, 개발자가 좋은 객체 지향 애플리케이션을 개발할 수 있도록 돕는 프레임워크

3. 좋은 객체 지향 프로그래밍?

객체 지향의 특징
enum 객체 지향 {
추상화, 캡슐화, 상속, 다형성
}

객체 지향 프로그래밍(OOP)
프로그램을 명령어의 목록이 아닌 독립적인 객체들의 집합으로 이해하는 접근 방식
각 객체는 메시지를 주고받으며 데이터를 처리할 수 있는 기능을 가지고 있음
OOP는 프로그램의 유연성과 변경 용이성을 높여 대규모 소프트웨어 개발에 적합한 방법론으로 널리 사용

  • 다형성의 역할과 구현 분리

    • 자바언어를 통한 다형성 개념 적용
    • 역할은 인터페이스
    • 구현은 인터페이스를 구현한 클래스와 객체
  • 객체 설계 시 역할과 구현을 명확하게 분리

    • 객체 간의 협력
      Request : 클라이언트
      Response : 서버
      -> 서로 협력 관계
  • 자바 언어의 다형성

    • 클라이언트를 MemberService 가정
    • 클라이언트는 MemberRepository에 의존
    • MemberRepository 인터페이스는 MemberRepository를 구현한
    • MemoryMemberRepository와, JdbcMemberRepository가 있다.

  • 스프링과 객체 지향
    • 스프링은 다형성이 가장 중요
    • 스프링은 다형성을 극대화 할 수 있게 도와줌
    • 제어의 역전(IoC), 의존관계 주입(DI)은 다형성을 활용하여 역할과 구현을 지원

4. SOLID!! 객체 지향 설계의 5가지 원칙

클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리

enum SOLID {

SRP: 단일 책임 원칙(Single responsibility principle)
OCP: 개방-폐쇄 원칙(Open/closed principle)
LSP: 리스코프 치환 원칙(Liskov substitytion principle)
ISP: 인터페이스 분리 원칙(Interface segregation principle)
DIP: 의존관계 역전 원칙(Dependency inversion principle)

}

  • SRP(Single responsibility principle) 단일 책임 원칙
    • 한 클래스는 하나의 책임만 가짐
    • 하나의 책임이라는 것은 모호
    • 문맥과 상황에 따라 다름
    • 책임의 크기를 적절하게 조절해야 함
    • 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것.
  • OCP(Open/closed principle) 개방-폐쇠 원칙

    • 소프트웨어 요소는 확장에는 열려있고, 변경에는 닫혀 있어야 함
    • 다형성 활용 필요
    • 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현(역할과 분리)
  • LSP(Liskov substitytion principle) 리스코프 치환 원칙

    • 자식 클래스는 부모 클래스의 기능을 완전히 대체할 수 있어야 하며, 부모 클래스의 인스턴스가 자식 클래스의 인스턴스로 대체되었을 때 프로그램의 동작 변함이 없어야함
    • 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것, 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체는 믿고 사용하려면, 이 원칙이 필요하다.
  • ISP(Interface segregation principle) 인터페이스 분리 원칙
    • 하나의 큰 인터페이스보다는 여러 개의 작은 인터페이스를 만드는 것이 좋다
      자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리.
      사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리.
      분리하면 정비 인터페이스 자체가 변해도, 운전자 클라이언트에 영향을 주지 않음.
      인터페이스가 명확해지고, 대체 가능성이 높아진다.
profile
내 인생부터 개발

0개의 댓글