이번에는 Spring에 대해서 정리해볼려고 한다.
스프링은 무엇일까?
스프링이란 자바 플랫폼을 위한 자바 기반 프레임워크로써 객체지향 언어인 자바의 특성을 살리는 것을 도와준다.
쉽게 생각하자면 그동안 배운 자바를 활용할 수 있는 확장 라이브러리이며, 좋은 객체지향 프로그램을 만들 수 있도록 도와준다는 것이다.
이러한 스프링은 여러 특징을 가지고 있다.
1. POJO 기반
POJO(Plain Old Java Object) 기반은 그대로 해석해보자면 오래된 자바 객체를 기반으로 한다는 뜻인데,
이는 스프링에서 객체간의 관계를 구성할 때 별도의 API를 사용하지 않고, 그냥 Java 코드만을 사용해서 객체를 구성할 수 있다는 것이다.
별도의 다른 라이브러리 등을 숙지하지 않아도 된다는 것이다.
2. 경량 컨테이너
컨테이너란 프로그램을 만들 때 해당 프로그램을 관련 라이브러리나 종속 항목과 함께 패키지로 묶어 소프트웨어 서비스 구동을 위한 환경을
만들어주는 역할을 하는데, 스프링은 경량 컨테이너로서 자바 객체를 직접 관리한다는 특징을 가지고있다.
3. IOC (Invertion of Control, 제어 역행)
IOC는 말 그대로의 제어하는 것을 역으로 한다.
이게 무슨 의미냐면, 객체를 사용해야 할 때 우리는 해당 객체를 생성하고 사용할 시기를 정해서 코드를 작성해야하는데,
이를 뒤집어서 결정권을 외부(스프링)에 주어서 제어의 흐름을 바꾼다는 것이다.
이를 통해서 객체 간의 결합도를 줄이고 유연한 코드를 작성함으로서, 가독성을 높이고 유지보수를 쉽게할 수 있다는 장점이있다.
4. DI (Dependecy Injection, 의존성 주입)
의존성 주입이란 스프링이 각각의 서비스들 간에 의존성을 서로 연결해주는 것이라고 생각하면 된다.
(*** 의존성이란 - 하나의 객체가 다른 객체 없이는 제대로 된 역할을 할 수 없는 것을 뜻한다. ***)
(*** 주입이란 - 말 그대로 외부에서 객체를 집어넣는 것이다. ex) setter나 생성자를 통해 전달받으면 그것은 주입이라 할 수 있다. ***)
아래내용을 살펴보자.
우리가 자바 프로그래밍을 하다보면 객체를 불러와 사용해야하는 상황들이 많다.
Member mem = new Member();
mem.setFirstPeopleName("GG_BB");
mem.setSecondPeopleName("ppusda");
mem.memName();
보통은 위와 같이 사용을 할텐데, 이러한 상황이 있을 때 스프링을 활용하면 유용하게 사용할 수 있다.
스프링을 이용해서는 어떻게 되는지 한 번 살펴보자.
<?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="Member" class="diEx.Member" />
<bean id="myMember" class="diEx.MyMember">
<property name="Member">
</property>
<property name="firstMemName" value="ppusda" />
<property name="secondMemName" value="GG_BB" />
<property name="firstMemAge" value="13" />
<property name="secondMemAge" value="22" />
</bean>
</beans>
일단 위와 같이 applicationcontext.xml 파일을 하나 만든다.
위 내용에는 어떤 객체가 있는지(bean 으로 설정함), 어떤 값이 있는지가 들어가 서로 연결하고있다.
String configLocation = "classpath:applicationContext.xml";
AbstractApplicationContext ctx =
new GenericXmlApplicationContext(configLocation);
MyMember mmem = ctx.getBean("myMember", MyMember.class);
//호출
mmem.memNameInfo();
mmem.memAgeInfo();
main에서 xml 파일을 가져와서 사용하기만 하면된다.
신기하게도 우리는 객체 생성을 하지 않고 사용을 했다. 스프링에서 의존성을 주입해 사용할 수 있게 된 것이다.
지금 코드 자체를 봐서는 그냥 생성해서 값을 넣는게 더 간단하고 편해보일지 모른다.
하지만 후에 프로젝트가 커지거나 데이터가 많아지게 되면 해당기능이 유지보수나 확장성 면에서 더 좋다고 한다.
나중에는 어노테이션을 통한 자동 의존성 주입도 있기에 더 유용할 것 같다.
5. AOP(Aspect Oriented Programming, 관점지향 프로그래밍)
AOP는 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리해서 관리하는 것이다.
다른 말로 말하자면 한가지 기능을 개발해 놓으면 여러 모듈에서 사용할 수 있다는 것이다.
개발자는 핵심 기능에만 집중 할 수 있고, 코드를 수정할 일이 생기면 수정을 최소화 할 수 있다는 장점이 있다.
이렇게 스프링과 그 특징에 대해서 한번 살펴보았다.
내가 스프링을 여러번 배워보았다면 "이런 부분은 중요하지!"하면서 더 좋은 내용을 적었을 것 같은데, 그렇지 못해서 아쉽다.
다음에 기회가 된다면 내용을 추가하도록 하겠다.
다음에도 스프링으로 공부해서 정리하도록 할 것이다.
참고 :
***
앞으로 게재될 Spring 내용의 글들은 기본적으로 인프런에서 볼 수 있는 김영한님의 "Spring 핵심 원리" 강의에 중심을 둘 것이다.
배운내용들을 열심히 정리해보고 사이사이에 알고 싶은 것이나 추가적으로 더 필요한 지식들 또한 정리할 것이다.
'Spring' 카테고리의 다른 글
[Spring 핵심 원리] 빈 생명주기 콜백 (0) | 2022.03.20 |
---|---|
[Spring 핵심 원리] 의존관계 주입에 대하여 (생성자 주입과 Lombok) (0) | 2022.03.20 |
[Spring 핵심 원리] 싱글톤 패턴 (0) | 2022.03.20 |
[Spring 핵심 원리] 수동 빈 등록을 통한 의존관계 주입 (0) | 2022.03.20 |
[Spring 핵심 원리] SOLID (0) | 2022.03.20 |