Spring(스프링) 프레임워크/TIL(Today I Learned)

[Spring_TIL] 자바(JAVA)의 다형성을 통해 알아보는 스프링 프레임워크를 쓰는이유

림케이원 2020. 7. 21.

데브림의 블로그 포스팅 한 것들을 한 눈에 확인하고 싶다면 클릭!

👉 https://github.com/DevLimK1/tistory-map 👈 

 


많은 선배 개발자분들이 개발 입문자, 신입 개발자들에게 늘 공통적으로 하는 이야기가 있다.

왜?

라는 질문을 스스로 끊임없이 하라는 것이다.

 

예로,

왜 자바 언어를 선택해서 사용하는가?

코딩테스트에서 왜 이런 알고리즘을 사용했는가?

.

.

 

위 질문에 명확한 정답이 있든 없든간에

왜? 라는 질문을 통해서

질문에 해당하는 답을 찾기위해 노력할 것이고, 그 노력이 곧 나의 피와 살이 될 것이라고 생각한다. 

 

스프링 프레임워크를 사용하기전에 앞서

왜 스프링 프레임워크를 쓰는가? 에 대한 지식이 있다면

스프링 프레임워크의 철학을 바탕으로 올바른 방법과 방향으로 개발을 할 수 있을 것이다.

 

그래서 책, 검색, 강의 등을 통해서 학습하고, 이해한 것을 바탕으로 포스팅해보고자 한다.

 

+) 아래 포스팅을 이해하는데 있어서 자바언어의 상속 개념과 인터페이스(interface) 개념에 대해서 알고 있으면

이해하는데 큰 무리가 없을 거 같다. 


자바의 다형성(polymorphism)이란?

스프링 프레임워크를 쓰는 이유에 대해 좀 더 쉽게 이해하고, 몸소 느낄 수 있는 방법은

자바 언어의 다형성이라는 개념을 이해하고, 코드를 통해 이해하는 것이다.

 

다형성(polymorphism)

하나의 객체가 여러 가지 타입을 가질 수 있는 것

● 부모 클래스 타입의 참조 변수로,  자식 클래스 타입의 인스턴스를 참조할 수 있는 것

 

딱딱한 글로의 설명은 그만 접어두고,

개발자는 코드로 이해하는 것이 더 편하고 즐거우니(?) 코드로 설명해보도록 하겠다.

 


1: HelloWorld 인터페이스
2: 추상메소드인 sayHello

1: HelloWorld 인터페이스를 구현하는 HelloWorldEn
4: HelloWorldEn 클래스에서 HelloWorld 인터페이스의 추상메소드를 오버라이딩해서 구현한 sayHello

3: 다형성, 인터페이스 HelloWorld의 참조변수 hello는 인터페이스를 구현하는 객체인 HelloWorldEn의 주소값을 참조하고 있음
6: callMethod(hello) 를 실행시키면 인터페이스 HelloWorld의 sayHello 메소드를 오버라이딩해서 구현한 HelloWorldEn 객체의 메소드가 실행됨

위의 코드를 그림으로 표현함(주소값은 이해하기 쉽게 임의의 값으로 지정)

 


그런데 만약에 HelloWorld 인터페이스를 구현하는 또 다른 클래스가 있다면?

 

HelloWorld 인터페이스를 구현하는 새로운 클래스인 HelloWorldKo라는 클래스를 만들었다.
참조 변수 선언하는 부분(HelloWorld hello)은 수정하지 않아도 되지만 흰색 밑줄 그어진 것에 새로운 클래스 이름으로 변경해주면 될 것이다.

 

여기서 개발자에게 가슴철렁할 문제가 있다.

만약에, HelloWorldKo 라는 객체가 5개 이상, 아니 좀 더 과장해서 50개정도 객체가 있는데

50개의 객체를 HelloWorldEn 클래스의 객체로 변경해야한다고 상상의 나래를 펼쳐보자...

"한번에 변경할 수 있는 단축키가 있는데요?" 라고 말하는 사람은 뒤로가기 버튼을 눌러주길 바란다...(진짜 뒤로가지는 마세요...)

 

아무튼, 50개의 클래스를 일일이 수작업으로 다 변경해줘야 할 것이다...

이러한 유지보수나 반복적인 코드의 복잡하고 갑갑함을 어느정도 해소하고자하는 목적으로 탄생한 것이

바로 스프링 프레임워크다.

 


위 예제를 스프링으로 구현해보자.

인터페이스 HelloWorld와 인터페이스를 구현한 HelloWorldEn 클래스는 동일하게 작성한다.

코드를 사용하실분은 펼쳐서 보세요.

더보기
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- <bean id="hello" class="kr.co.devlimk1.beans.HelloWorldEn"/> -->
	<bean id="hello" class="kr.co.devlimk1.beans.HelloWorldKo"/>
</beans>
스프링을 사용하는데 있어서 xml 과 어노테이션 방법이 쓰이는데, 자세한 내용은 이번 포스팅의 주 내용과는 좀 다른 내용임으로 생략하겠다. 지금 예제 내용은 xml 방법으로 설명하겠다. 여기서 bean은 객체를 뜻한다는 것만 알아두자.

 

10: xml 파일에서 설정했던 객체를 읽어주는(로딩) 코드
13: 아래의 사진을 참고해보자.

스프링에서는 아까 자바와는 다르게 MainClass에서 HelloWorldEn 클래스 객체를 쓰지 않았다.(ctx.getBean 사용)
이 말인 즉슨, 클래스가 변경이 되면 xml에 있는 bean 한 줄만 수정해주면 된다는 것이다. 아래 내용을 보면 이해할 것이다.

HelloWorld 인터페이스를 구현한 HelloWorldKo 라는 클래스를 만든다.

나머지 코드는 수정한 부분이 없고, bean.xml에서 빨간 밑줄친 곳만 변경해주면 Console에 변경된 결과를 확인할 수 있다.

 

끝!

 

 


[참고자료 및 사이트]

윤재성의 스프링 프레임워크 강의

TCP School

 

 

이 글을 읽은 독자분들이 자바에서 코드를 작성했던 것과 스프링에서 코드를 작성했던 것의 차이점

조금이라도 알게 되었다면 그걸로 만족한다 : - )

(도움이 되었다면 공감버튼, 댓글을 남겨주면 참 좋겠다ㅎㅎㅎㅎㅎ )

 

나 또한 현재 스프링을 배우고 익히는 중이라서 부족한 부분이 많지만

부족한 지식이라도 함께 공유하고, 틀리부분은 서로 피드백 해준다면 좋은 공부방법이 될 수 있다고 생각한다.

긴 글 읽어주셔서 감사하고,  스프링 공부하는데 조금이나마 도움이 되었으면 좋겠다 : )

 

댓글