티스토리 뷰

spring

스프링의 주요 특징

ssffwert 2022. 1. 2. 18:32

2021.12.30(목) 23:00 ~ 23:53

코드로 배우는 스프링 웹 프로젝트(구멍가게 코딩단) p.47 ~ 58 내용 정리


프레임워크
프레임워크란 말 그대로 뼈대나 근간을 이루는 코드들의 묶음이다.
프레임워크를 이용한다는 의미는 프로그램의 기본 흐름이나 구조를 정하고, 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발하게 된다.
스프링은 경량 프레임워크인데, 경량 프레임워크는 특정 기능을 위주로 간단한 jar 파일 등을 이용해서 모든 개발이 가능하도록 구성된 프레임워크이다.

 


스프링의 가장 눈에 띄는 변화
- Spring 2.5버전: 어노테이션을 활용하는 설정을 도입하면서 편리한 설정과 개발이 가능하도록 지원
- Spring 3.0버전: 별도의 설정 없이도 Java 클래스만으로 설정 파일을 대신할 수 있게 지원
- Spring 4.0버전: 모바일 환경과 웹 환경에서 많이 사용되는 REST 방식의 컨트롤러 지원
- Spring 5.0버전: Reactor를 이용한 Reactive 스타일의 개발 환경 지원

 


2.1.1 스프링의 주요 특징
1. POJO 기반의 구성
내부에는 객체 간의 관계를 구성할 수 있는 특징을 가지고 있다.
다른 프레임워크들과 달리 이 관계를 구성할 때 별도의 API 등을 사용하지 않는 POJO(Plain Old Java Object)의 구성만으로 가능하도록 제작되어 있다.
(일반적인 Java 코드를 이용해서 객체를 구성하는 방식을 그대로 스프링에서 사용할 수 있다.)
이것이 중요한 이유는 코드를 개발할 때 개발자가 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않다는 것을 의미한다.
개발자는 가장 일반적인 형태로 코드를 작성하고 실행할 수 있기 때문에 생선성에서 유리하다.

2. 의존성 주입(DI)과 스프링
의존성(Dependency)이라는 것은 하나의 객체가 다른 객체 없이 제대로 된 역할을 할수 없다는 것을 의미한다.
흔히 A 객체가 B 객체 없이 동작이 불가능한 상황을 'A가 B에 의존적이다'라고 표현한다.
주입(Injection)은 외부에서 '밀어 넣는 것'을 의미한다.
의존성과 주입을 결합해서 생각해 보면 '어떤 객체가 필요한 객체를 외부에서 밀어 넣는다'는 의미가 된다.
이를 코드에 대입해서 살펴보면 '주입을 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없다', '어떤 객체에 의존하든 자신의 역할은 변하지 않는다'와 같은 의미로 볼 수 있다.
이러한 변화는 A객체에서 B객체를 직접 생성하는 방식에서, A는 B가 필요하다는 신호만 보내고 B객체를 주입하는 것은 외부에서 이루어지는 방식으로 된다.
의존성이 필요한 객체에 필요한 객체를 찾아서 '주입'하는 역할을 하는 추가적인 하나의 존재가 필요하게 된다.
스프링에서는 'ApplicationContext'라는 존재가 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 한다.
ApplicationContext가 관리하는 객체들을 '빈(Bean)'이라는 용어로 부르고, 빈과 빈 사이의 의존관계를 처리하는 방식으로 XML 설정, 어노테이션 설정, Java 설정 방식을 이용할 수 있다.

3. AOP의 지원
대부분의 시스템이 공통으로 가지고 있는 보안이나 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분을 스프링에서는 '횡단 관심사(cross-concern)'라고 한다.
스프링은 이러한 횡당 관심사를 분리해서 제작하는 것이 가능한데, AOP(Aspect Oriented Programming)는 이러한 횡단 관심사를 모듈로 분리하는 프로그래밍의 패러다임이다.

 

4. 트랜잭션의 지원
스프링은 트랜잭션의 관리를 어노테이션이나 XML로 설정할 수 있기 때문에 개발자가 매번 상황에 맞는 코드를 작성할 필요가 없도록 설계되었다.


2.2 의존성 주입 테스트
예제로 구성할 내용은 레스토랑 객체를 만들고 레스토랑에서 일하는 셰프 객체를 주입하는 예제를 작성한다.
예제는 Lombok을 이용해서 setter 메서드를 자동으로 구현되도록 한다.
(Lombok의 setter를 생성하는 기능과 생성자, toString() 등을 자동으로 생성하도록 @Data 어노테이션을 이용한다.)
의존성 주입은 클래스가 아닌 인터페이스로 설계하는 것이 좋다.

```
import org.springframework.stereotype.Component;
import lombok.Data;

 

@Componenet
@Data
public class Chef {
}
```


```
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.Setter;

 

@Componenet //해당 클레스가 스프링에서 관리해야 하는 대상임을 표시
@Data
public class Restaurant {

    @Setter(onMethod_ = @Autowired) //자동으로 setChef()에 @Autowired 어노테이션을 추가
    private Chef chef;
}
```
작성된 코드가 의미하는 것은 Restaurant 객체는 Chef 타입의 객체를 필요로 한다는 상황이다.
root-context.xml의 Source 탭에 component-scan을 추가하거나, RootConfig에서 @ComponentScan 어노테이션을 이용해서 처리할 수 있다.


'spring' 카테고리의 다른 글

Java 기반 스프링 관련 설정 방법  (0) 2022.01.02
프로젝트 Packaging WAR, JAR 비교  (0) 2020.07.12
애노테이션  (0) 2020.07.12
maven  (0) 2019.08.13
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday