Spring 핵심 원리 TIL (1)

YulHee Kim·2021년 8월 19일
1

Spring 핵심 원리

목록 보기
1/13
post-thumbnail

[참고 강의] 김영한님의 스프링 핵심 원리 - 기본편

💡 Spring 생태계

✏️ 스프링이란?

스프링은 JAVA 언어 기반의 프레임워크다.
자바의 큰 특징이 객체 지향이듯이,
스프링은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크다.
즉, 객체 지향이 스프링의 핵심이라고 할 수 있다.

스프링은 봄이란 뜻이다. 말 그대로 전통적인 EJB 겨울 시절을 지내고 맞이하는 봄이라는 뜻으로, 새로운 시작이다 😊

✏️ 스프링 부트

스프링과 스프링 부트는 떼어놓을 수 없다. 이 말은 스프링 부트는 별도로 사용하는 것이 아니라는 걸 알 수 있다. 하지만 스프링은 단독으로 애플리케이션을 실행할 수 있다.
스프링 부트는 이름에서 느껴지듯 스프링 기술을 좀 더 편리하게 사용할 수 있게 해준다. 요즘엔 선택이 아닌 필수가 된 스프링 부트이다.

📍스프링 부트의 특징

  • 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
  • 스프링 애플리케이션을 쉽게 생성
  • 톰캣 같은 웹 서버를 내장
  • 손쉬운 빌드 구성을 위한 starter 종속성 제공 (라이브러리가 줄줄이 딸려 온다는 느낌)
  • 외부 라이브러리 버전을 크게 고려하지 않아도 됨.
  • 운영 환경에서 모니터링은 굉장히 중요한데 스트링 부트가 기본으로 제공
  • 간결한 설정

스프링과 객체 지향을 떼놓을 수 없다..
그래서 이 강의에선 좋은 객체 지향 프로그래밍이 무엇인지도 함께 다뤄주셨다.


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

✏️ 객체 지향 프로그래밍

객체 지향 특징은 추상화, 캡슐화, 상속, 다형성이 있지만 DI에서 활용하는 다형성에 대해 자세히 다뤄주셨다.

📍 객체 지향 프로그래밍

  • "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.(협력)
  • 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만든다.

정의를 내려보니 어렵다. 난 객체 지향 프로그래밍을 그저 유지보수하기 쉽고 확장성이 훨씬 좋다고만 알고 있었다. 위 말을 있어보이게 요약하자면 객체들의 협력을 통해 프로그램이 유연해진다. 가 아닐까 싶다 😎
객체 지향 프로그래밍을 예시를 들자면 컴퓨터 부품을 갈아 끼우듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법이라고 할 수 있다.

📍 다형성

강사님께서 계속 강조하셨던 "역할과 구현을 분리하라"
이 말을 설명하면 다형성을 빼놓을 수 없다.

다형성이란 하나의 객체가 여러가지의 타입을 가질 수 있다.

예시로 부모 클래스 타입을 갖고 자식 클래스의 생성자 호출이 가능하다.

class Parent { ... }

class Child extends Parent { ... }

...

Parent pa = new Parent(); // 허용

Child ch = new Child();   // 허용

Parent pc = new Child();  // 허용

Child cp = new Parent();  // 오류 발생.

이런 다형성의 성질을 활용하여 역할과 구현을 분리할 수 있다.
즉, 객체를 설계할 때
역할 (인터페이스)를 정의하고 그 역할을 수행하는 클래스를 구현하면 된다.

다형성을 저번시간에도 코드로 구현해본 적이 있다.

public class MemberService {
 // private MemberRepository memberRepository = new MemoryMemberRepository();
    private MemberRepository memberRepository = new JdbcMemberRepository(); 
}

MemberRepository라는 인터페이스를 확장하여 구현한 MemoryMemberRepository, JdbcMemberRepository는 인터페이스인 MemberRepository 타입으로 참조되었다.

이 코드를 보고 느낌이 왔다.
인터페이스는 기능 명세서 같은 역할을 하는 거 같다.
MemberRepository가 어떤 공통 기능의 "역할"을 하고 그 공통 기능을 토대로 MemoryMemberRepository, JdbcMemberRepository가 각각의 기능에 맞게 "구현"을 하는 거 같다 🧐

그렇기에 인터페이스를 안정적으로 설계하는 것이 중요하다.
정말 컴퓨터 부품을 갈아끼우는 느낌이다

📍 다형성의 본질

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

✏️ 역할과 구현을 분리하다

  • 유연하고 변경이 용이
  • 확장 가능한 설계
  • 클라이언트에 영향을 주지 않는 변경 가능

역할 자체가 변하면 클라이언트, 서버 모두 큰 변경이 발생하므로 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.


다음글은 면접에서 단골 질문이라는 SOLID와 스프링에서 객체 지향 설계가 왜 중요한지부터 정리해보겠당..😎

profile
백엔드 개발자

0개의 댓글