hoon DevLog

Spring gradle project 스프링 핵심 원리 기본편 | 객체 지향 설계와 스프링 1 본문

IT/Spring

Spring gradle project 스프링 핵심 원리 기본편 | 객체 지향 설계와 스프링 1

개발한기발자 2024. 3. 13. 09:25
반응형


본 포스팅은 인프런에 있는 인터넷 강좌인,

김영한 강사님의 스프링 핵심 원리 기본편을 공부하며,

개인적으로 공부하고, 정리하는 용도로 포스팅을 해보겠다.

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

1-1. Spring이란?

  • Java의 웹 프레임워크로 Java 언어를 기반으로 사용한다.
  • Java로 다양한 애플리케이션을 만들기 위한 프로그래밍 틀이라 할 수 있다.
  • JAVA의 활용도가 높아지면서, Java를 이용한 기술이 JSP, Mybatis, JPA 등의 기술이 생겨났고, 다른 사람의 코드를 참조하기 쉽고 편리한 구조로 앞서 말한 기술들을 더 쉽게 사용해 주는 오픈소스 프레임워크(Open Source Framework)다.

SpringBoot란

  • 기본적으로 Spring을 편리하게 사용할 수 있도록 지원한다.
  • 단독으로 실행할 수 있는 Spring Application을 쉽게 생성하고, Tomcat과 같은 웹 서버를 내장해서 별도 웹 서버를 설치하지 않아도 된다.
  • 손쉬운 빌드 구성을 위한 starter 종속성을 제공하고, Springboot를 통해 Spring Framework의 기술들을 편리하게 사용한다.

Spring 핵심

  • 웹 어플리케이션을 만들고, DB접근이 편리한 기술이다.
  • Java 기반, 즉 Java의 가장 큰 특징인 객체 지향 프로그래밍을 지향한다.
  • 따라서 Spring은 좋은 객체 애플리케이션을 개발할 수 있도록 도와준다.

 

1-2. 좋은 객체지향 프로그래밍이란?

  • 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하는 것이다.
  • 각각의 객체는 메시지 를 주고받고, 데이터를 처리할 수 있다.
  • 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.

다형성의 비유

  • 다형성이란 하나의 객체에 여러 가지 타입을 대입할 수 있다는 것으로, 역할과 구현으로 비유를 할 수 있겠다.
  • 역할은 interface, 구현은 interface를 구현한 클래스, 즉 구현 객체(implementation)
  • 예를 들어, 자동차가 현대, 기아, 벤츠 등으로 바뀌어도, 운전자는 운전만 할 수 있으면 운전 가능하다!
  • 즉 자동차의 브랜드나 종류가 바뀔 뿐, 운전하면 움직이는 기능은 같고, 각 차종별로 다른 기능이 탑재될 수 있다.
  • 자동차의 역할을 interface, 그리고 그것을 상속받는 실제 자동차(현대, 기아, 벤츠 등)를 implementation 이라고 생각하면 편할 거 같다.
  • 항상 구체적인 구현보다, 역할인 interface가 먼저 설계돼야 한다!!
  • 객체 설계 시 interface를 먼저 부여되고, 그 역할을 수행하는 구현 객체를 만듦으로써, 해당 interface의 기능을 완벽하게 구현한다.

  • 위 그림과 같이 MemberRepository를 save와 같이, 같은 이름의 메서드지만, 기능이나 로직이 다른 메서드일 수 있다.
  • 이때, 클라이언트 요청에 따라 손쉽게 변경할 수 있는 것, 이것이 다형성의 특장점이라 할 수 있겠다.
  • 그리고 다형성의 특장점을 가장 잘 나타내는 것이 메서드 오버로딩과 오버라이딩이 되겠다.

오버로딩(Overloading) / 오버라이딩(Overriding)

  • 이 둘의 공통점은 클래스의 인스턴스 멤버인 메서드의 명은 같지만, 메서드를 재정의 또는 확장의 개념의 차이이다.
  • 오버로딩(Overloading) : 부모 클래스의 상속을 받은 자식 클래스에서 확장하는 개념
  • 오버로딩은 메서드의 이름이 일치하지만, 매개변수의 개수 또는 타입이 달라야 하며, 메소드의 return 타입이 달라야 한다.

  
class Car {
int modelNum;
String model;
public int setModel(int modelNum) {
this.modelNum = modelNum;
return this.modelNum;
}
public String setModel(int modelNum, String brand) {
this.model = brand + modelNum;
return this.model;
}
}
public class CarOverloadingTest {
public static void main(String[] args) {
Car car = new Car();
car.setModel(1234); // 1234
car.setModel(4885, "avante"); // avante4885
}
}
  • Car 클래스에서 setModel이라는 같은 이름으로 메서드를 선언했지만, 각각의 메서드는 int를 리턴할 것이냐, String을 리턴하는 차이와, 매개변수를 1개만 받을 것이냐, 2개만 받을 것이냐의 차이도 존재한다.
  • 다음은 오버라이딩이다.
  • 오버라이딩(Overriding) : 하나의 클래스 내부에서 확장하는 개념
  • 메서드의 이름이 일치하면서, 메소드 매개변수의 개수, 순서 그리고 데이터 타입 일치 해야 하고, return 타입이 일치해야 함

  
class Car {
int speed = 0;
public int setSpeed(int speed_change) {
this.speed += speed_change;
return this.speed;
}
}
class Avante extends Car {
final int MAX_SPEED = 150;
public int setSpeed(int speed) {
this.speed += speed;
if (this.speed > MAX_SPEED) {
this.speed = MAX_SPEED;
}
return this.speed;
}
}
public class CarOverridingTest {
public static void main(String[] args) {
Car car = new Car();
car.setSpeed(30);
Avante avante = new Avante();
avante.setSpeed(180);
}
}
  • Avante 클래스는 Car 클래스를 상속받아, MAX_SPEED 라는 상수로 재정의를 하고, int를 return 하면서 매개변수로 int형 변수를 받는 setSpeed 메서드를 받음과 동시에 메서드에 if 조건이 추가되며 사용하고 있다.
  • 오버라이딩을 하게 되면, Car 클래스를 상속받아도, setSpeed를 내가 원하는 대로 로직을 바꿔 사용할 수 있다.
  • 이렇게 오버로딩과, 오버라이딩을 통해 다형성을 이용한 객체 지향 코딩을 한다고 할 수 있다.

다형성의 본질

  • 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
  • 다형성의 본질을 이해하려면 협력이라는 객체사이의 관계에서 시작해야 함
  • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.

Spring과 객체 지향

  • 다형성이 가장 중요하다!
  • Spring은 다형성을 극대화해서 이용할 수 있게 도와준다.
  • 스프링에서 이야기하는 제어의 역전(0C), 의존관계 주입(DI)은 다형성을 활용해서, 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
728x90
반응형