스프링 boot를 사용하고.. 스프링과 spring data JPA의 기능들을 사용해서 개발을 해본 경험은 있지만 스프링의 본질과 구조에 대해서는 제대로 알지 못하고 있는 상태이다. 그렇기 때문에 Spring이 무엇인지에 대해 정리해보려고한다.
내가 spring이 뭔지 정의 내리는것은 쉽지 않은일이고 spring이라는 단어 자체도 상황에 따라 다르게 쓰여 모호한 경향이 있다고 한다.
그렇다면 spring의 장점은 무엇일까? spring은 java 기반 framework 이고 java 언어의 가장 큰 특징은 바로 "객체지향"언어라는 것이다.
spring의 가장 큰 장점은 "Java의 객체지향 설계의 장점을 살릴 수 있게 잘 설계된 framework이다!
다형성,캡슐화... 등등 4가지의 특징들을 배운것은 오래전이지만 항상 와닿지 않았고 머리로는 이해를 하지만 실제로 개발을 하며 "객체 지향적인 개발을 하니 정말 유용하다!!!" 라고 느낀적이 없었다... SPRING 프레임워크를 처음부터 공부하기로 마음먹었으니 객체 지향 프로그래밍의 특징중 가장 중요한 다형성에 대해 정리해보려고 한다.
세상을 역할과 구현으로 기능해보자 JAVA에서는 interface가 역할 그리고 interface를 상속받아 구현하는부분이 구현이 되겠다.
많이 드는 예로는 자동차와 자동차의 종류인 소나타, 테슬라, 제네시스 ...
자동차라는 역할에 맞춰 각각의 차량을 구현할 수 있고 운전자(개발시에는 client가 되겠다)가 자동차를 운전할줄 안다면 어떤 자동차던 운전이 가능하다.
코드 예시로 이해해보자
public class Driver{
void drive(Car car){
car.moveFoward();
car.moveBackward();
}
void drive(MotorBike motorBike){
motorBike.moveFoward();
motorBike.moveBackward();
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
MotorBike motorBike = new MotorBike();
Driver driver = new Driver();
driver.drive(car);
driver.drive(motorBike);
}
}
위의 코드는 Driver 클래스가 Car, MotorBike 클래스에 의존적입니다.이처럼 "객체간의 결합도가 높은" 구현은 바람직 하지 않습니다.
지금 처럼 차,오토바이 두가지가 아니라 수백개의 차량이 있다면 똑같은 코드를 수백번 작성해야한다.
하지만 다형성을 활용하면 다음과 같은 코드를 구성할 수 있다.
public interface Vehicle{
void moveForward();
void moveBackward();
}
public Car implements Vehicle{
@override
public voidmoveForward(){
System.out.println("차가 앞으로 전진합니다.");
}
@override
public voidmoveBackward(){
System.out.println("차가 뒤로로 후진합니다.");
}
}
public MotorBike implements Vehicle{
@override
public voidmoveForward(){
System.out.println("오토바이가 앞으로 전진합니다.");
}
@override
public voidmoveBackward(){
System.out.println("오토바이가 뒤로로 후진합니다.");
}
}
다음과 같이 vehicle interface를 Car와MotorBike 클래스가 상속받게 되면 Drive 클래스를 다음과 같이 작성할 수 있습니다.
public class Driver{
void drive(Vehicle vehicle){
Vehicle.moveFoward();
Vehicle.moveBackward();
}
}
인터 페이스 적용전에는
public class Driver{
void drive(Car car){
car.moveFoward();
car.moveBackward();
}
void drive(MotorBike motorBike){
motorBike.moveFoward();
motorBike.moveBackward();
}
}
이렇게 작성한 코드가 매우 간소화 됐다. 즉 앞서본 코드는 Driver 클래스와 Car와 MotorBike와 직접 연결돼서 결합도가 높았던 이전과 달리
Vehicle 인터페이스와 간접적으로 연겨되어 결합도가 낮아졌다.
따라서 Driver 클래스는 더이상 각각의 클래스 내부의 변경이나 다른 객체가 새롭게 교체되는 것을 신경쓰지 않아도 인터페이스에 의존하여 수정이 있을때마다 코드를 변경하지 않아도 된다!
이것이 객체지향 다형성의 핵심이고 Spring의 DI(의존관계 주입) IOC의 개념은
public class Main {
public static void main(String[] args) {
Car car = new Car();
MotorBike motorBike = new MotorBike();
Driver driver = new Driver();
driver.drive(car);
driver.drive(motorBike);
}
}
여전히 실행 클래스 코드에서 new Car()와 new MotorBike() 처럼 객체에 직접적으로 의존하고 있어 해당 객체를 다른 객체로 변경할시 코드의 변경이 불필요한 아직까지 해결되지 않은 문제를 위해 등장했다!
DI와 IOC에 대한 내용은 다음에 작성하도록 하겠다! (공부좀 해보고 ㅎㅎ)