스프링 공부한 것 요약..

Sanghyeop Lee·2023년 1월 16일
0

Spring

목록 보기
4/5

스프링이란?

스프링이란?

  • 스프링 DI 컨테이너 기술
  • 스프링 프레임워크
  • 스프링 부트, 스프링 프레임워크 등을 모두 포함한 생태계
  • 스프링과 JPA가 메인 기술

스프링 생태계

  • 필수

    • 스프링 프레임워크
    • 스프링 부트 / 힘들었던 설정을 쉽게, WAS내장(톰캣)으로 편리
  • 선택

    • 스프링 데이터
    • 스프링 세션
    • 스프링 시큐리티
    • 스프링 Rest Docs
    • 스프링 배치
    • 스프링 클라우드

스프링의 핵심

  • 자바 언어 기반의 프레임워크 -> 객체 지향
  • 좋은 객체 지향 어플리케이션을 개발할 수 있게 도와주는 프레임워크

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

객체 지향

  • 추상화 / 캡슐화 / 상속 / 다형성
  • 프로그램을 명령어의 목록이 아닌 여러 객체의 모임으로 보는 것
  • 각각의 객체는 메세지를 주고받고 데이터를 처리
  • 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만듬

다형성


위 그림에서 자동차 역할(인터페이스)이 다양한 형태(구현체)를 가질 수 있는 것.

역할과 구현으로 분리

운전자는 K3, 아반떼, 테슬라 모델3 등 자동차 모델에 상관 없이 자동차를 운전할 수 있음 -> 변경이 편리!

좋은 객체 지향의 5가지 원칙: SOLID

좋은 객체 지향의 5가지 원칙은 SRP, OCP, LSP, ISP, DIP이고 각 원칙의 앞글자를 따서 SOLID라고 부른다..

SRP(Single Responsibility Principle)

  • 단일 책임 원칙
  • 하나의 클래스는 하나의 책임만 가져야 한다.
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository = new MemoryMemberRepository(); //구현체가 1.MemberService역할 2.MemberRepository 구현체 선택 두가지 역할을 하고 있음
    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }
    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;//다른 객체가 memberRepository 구현체를 선택해줌.
    }

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }
    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

OCP(Open Closed Principle)

  • 개방 폐쇄 원칙
  • 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다.
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository = new MemoryMemberRepository(); //MemberRepository 구현체를 변경하려면 MemberService의 코드도 변경됨
    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }
    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;//MemberService의 코드를 변경하지 않고 MemberRepository 구현체를 변경할 수 있음
    }

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }
    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

LSP(Liskov Substitution Principle)

  • 리스코프 치환 원칙
  • 구현체는 인터페이스의 규약을 지켜야함
  • 컴파일이 되어도 LSP를 위반할 수 있음(자동차 인터페이스의 엑셀은 앞으로 가는 기능. 뒤로 가게 구현하면 LSP 위반)

ISP(Interface Segregation Principle)

  • 인터페이스 분리 원칙
  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
  • 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리
  • 사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리
  • 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음
  • 인터페이스가 명확해지고, 대체 가능성이 높아진다

DIP(Dependency Inversion Principle)

  • “추상화에 의존해야지, 구체화에 의존하면 안된다.”는 원칙
    -> 구현 클래스에 의존하지 말고 인터페이스에 의존하라는 뜻
private final MemberRepository memberRepository = new MemoryMemberRepository();

스프링!

  • 객체 지향 개발을 하려고 OCP, DIP 원칙을 지키면서 개발을 하려면 할일이 너무 많음
  • 스프링 프레임워크는 다음 기술로 다형성 + OCP, DIP를 가능하게 지원
    • DI(Dependency Injection): 의존관계, 의존성 주입
    • DI 컨테이너 제공
  • 클라이언트 코드의 변경 없이 기능 확장
  • 쉽게 부품을 교체하듯이 개발

참조

profile
개발자꿈나무

0개의 댓글