스프링이란? 

자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크

동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다.

 

스프링 부트는 뭔가요?

스프링을 편리하게 사용할 수 있도록 지원해주는 프레임워크, 최근에는 기본으로 사용하는 추세

 

스프링을 왜 만들었나요?

자바 언어의 가장 큰 특징인 객체지향을 활용하기 위해

스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크

 

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

컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다.

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다

 

유연하고 변경에 용이하다는 점이 핵심

- 프로그램이 유연하다는 것이 뭘까?

->프로그램을 변경할 일이 생겼을 때 마치 부품을 갈아끼우듯이, 레고 블럭을 조립하듯이 쉽고 유연하게 변경하면서 개발할 수 있는 프로그램

 

 

객체지향 프로그래밍의 4가지 특징

 

1. 캡슐화

서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것

외부에서 객체가 어떻게 동작하는지 모르게 하는 것

(마치 자동차 운전자가 자동차가 엔진이 어떻게 움직이는지 알 필요가 없듯이)

이는 객체를 자율적으로 만들고 객체의 독립성, 책임 영역을 지킨다.

접근 제어자(private, public) 등을 활용해 구현한다

 

2. 상속

현실의 상속과는 많이 다름

기존의 클래스를 재활용하여 새로운 클래스를 작성하는 문법 요소

아버지-아들 같은 관계를 이야기하는 것이 아님

동물 - 펭귄 같은 사이의 관계에서 사용한다.

이를 is a 관계라고도 한다. (펭귄 is a 동물 -> 말이 된다면 상속을 올바르게 사용한 것)

객체지향의 사실과 오해 책에선 is a kind of가 좀 더 적절하다고도 이야기한다 (펭귄 is a kind of 동물)

 

3. 추상화

“사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것”

-> 필요한 부분만 모아서 추출해내는 것을 말한다. ex) 지하철 노선도

객체의 공통적이고 필요한 부분만 모아서 추출하는 것을 이야기함

자동차, 오토바이 모두 사람을 태울 수 있고, 이동이 가능함 -> 두 객체 모두 Vichle(탈 것) 으로 추상화 가능하다.

자바의 interface 또는 추상 클래스(abstract class)로 구현 가능하다.

 

interface와 상속의 차이?

interface는 껍데기만 놔두고 구현 강요

상속은 구현해놓은 것 재사용 가능

  • 상위 클래스의 물려줄 특성이 많을수록 좋다
  • 인터 페이스는 구현을 강제할 메서드가 적을수록 좋다

 

4. 다형성

역할과 구현으로 세상을 구분하자 (로미오 - 배우)

이렇게 한다면 세상이 단순해짐 ->  유연, 변경에 용이해짐

클라이언트가 대상의 역할만 알면 됨 (마치 배우가 바뀌어도 로미오 역할만 할 줄 알면 상대역은 영향이 없다) 

클라이언트는 대상이 변경되어도 영향 없음

자바에선 오버라이딩, 인터페이스, 상속 등으로 구현한다.

 

메소드 오버라이딩과 오버로딩의 차이는 뭘까?

- 오버라이딩 - 부모 클래스나 상속받은 인터페이스의 메소드를 새로 재정의해 덮어씌우는 것

- 오버로딩 - 같은 이름의 메소드를 두 개 이상 정의하는 것 (매개변수의 타입이나 개수를 다르게 하여)

 

 

스프링 강의에선 이 중 가장 중요한것이 다형성이라고 이야기한다.

 

강의에선 객체를 설계할때

역할 - 인터페이스 

구현 - 인터페이스를 구현한 클래스,객체

방식으로 설계하라고 한다.

즉 역할을 먼저 부여한 후, 그 역할을 수행하는 구현 객체를 만들라고 이야기한다.

 

다형성의 본질 : 클라이언트를 변경하지 않고 기능을 유연하게 변경할 수 있도록 하는 것

이를 위해선 인터페이스를 안정적으로 설계하는 것이 정말 중요하다.

스프링은 다형성을 극대화해서 이용하도록 도와줌

 

좋은 객체지향 설계의 5원칙 - SOLID

  1. SRP (Single responsibility principle) - 단일 책임 원칙
    1. 한 클래스는 하나의 책임만 가져야한다.
    2. 변경이 있을때 파급이 적으면 단일 책임 원칙을 잘 따른 것
  2. OCP (Open/closed principle) - 개방 폐쇄 원칙
    1. 확장에는 열려있으나 변경에는 닫혀있어야함
    2. 새로운 기능 구현 -> 새 코드 생성 YES, 기존 코드 변경은 NO(인터페이스 구현한 새로운 클래스를 제작하자)
  3. LSP (Liskov substitution priciple) - 리스코프 치환 원칙
    1. 부모 클래스는 자식클래스로 대체 가능해야함
    2. 하위 클래스는 인터페이스 규약을 전부 지켜야함
    3. ex) 자동차 클래스의 엑셀 메소드 → 앞으로가라, 자식 클래스가 엑셀 밟으면 뒤로 간다면 → 원칙 위배
  4. ISP (Interface segregation principle) - 인터페이스 분리 원칙
    1. 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스보다 좋음
    2. 사용자 클라이언트 → 운전자 클라이언트, 정비사 클라이언트로 분리
    3. 분리하면 정비 인터페이스 자체가 변경되어도 영향 없음
  5. DIP (dependency inversion priciple) - 의존성 역전 원칙
    1. 추상화에 의존해야지 구체화에 의존하면 안된다
    2. 클라이언트는 인터페이스만 바라봐야한다
    3. 역할에 의존해야한다. (구현에 의존하면 안됨)

 

그래서 이 객체지향의 원리가 스프링에선 어떻게 구현될까?

를 다음편에 써보려고 한다.

 

 

 

 

 

 

 

+ Recent posts