스프링은 자바 엔터프라이즈 개발을 위한 오픈소스 경량 애플리케이션 프레임워크이다. Spring Framework, Spring Boot, Spring MVC, Spring Data 등 다양한 프로젝트로 구분되어 있으며, 엔터프라이즈 애플리케이션을 개발의 다양한 영역에 바로 활용할 수 있는 방대한 양의 기술 API를 제공한다.
기업을 대상으로 하는 개발, 수많은 데이터처리 등 동시에 여러 사용자로부터 행해지는 대규모의 환경을 말한다.
오픈소스ㄹ한 모든 사용자에게 무료로 열려 있다는 것을 의미한다. 즉, 개인 및 기업도 스프링을 사용하여 웹 애플리케이션을 개발 할 수 있고, 스프링 코드 일부를 수정하여 사용해도 무관하다. 스프링은 오픈소스 프레임워크이지만, 안정적인 개발과 개선이 보장된다.
목적에 따라 고민할 필요없이 이용할 수 있도록 일괄로 가져다 쓰도록 만들어 놓은 틀, 프로그래밍에서 특정 운영 체제를 위한 응용 프로그램 표준 구조를 구현하는 클래스와 라이브러리 모임.
스프링의 가장 큰 특징으로 POJO 프로그래밍을 지향한다. POJO란 순수 Java만을 통해서 생성한 객체를 의미한다. 순수 Java 만을 사용한다는 것은 Java 및 Java의 스펙에 정의된 기술만 사용한다는 의미이다.
POJO를 사용하면 다른 기술과의 의존성이 줄어들어 테스트 및 유지 보수가 편리한 유연성을 가진다.
// 필드와 이에 해당하는 getter 및 setter만 구성된 기본적인 POJO의 예시
public class User{
private String Id;
private String password;
public String getId() {
return id;
}
public String setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public String setPassword(String password) {
this.password = password;
}
}
필요성
- 특정 환경이나 기술에 종속적이지 않으면 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있다.
- 저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거 함으로써 코드가 깔끔해진다.
- 코드가 깔끔해지기 때문에 디버깅하기도 상대적으로 쉽다.
- 특정 기술이나 환경이 종속적이지 않기 때문에 테스트 역시 단순해진다.
- 객체 지향적인 설계를 제한없이 적용할 수 있다.
자바 객체를 직접 관리하고, 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
IOC는 코드의 흐름을 제어하는 주체를 바꾸는 패턴을 말한다. 개발자가 아닌 컨테이너가 객체간의 관계를 설정, 객체의 생성과 호출 시점을 관리한다. 객체 생성과 관리를 컨테이너에 위임하면 코드의 유지보수성이 높아지며 객체간의 결함도가 낮아지므로 코드의 재사용성과 확장성이 좋아진다.
@Service
public class BoardService {
@Autowired
private BoardMapper mapper;
public String boardInsert(BoardVo board) {
...
}
---------------------------------------------------
private BoardMapper mapper;
public BoardService(BoardMapper mapper) {
this.mapper = mapper;
}
public String boardInsert(BoardVo board) {
...
}
}
@Controller
public class BoardController{
@Autowired
private BoardService service;
public String insert(BoardVO board) {
service.boardInsert(board);
...
}
------------------------------------
private BoardService service;
public BoardController(BoardService service) {
this.service = service
}
public String insert(BoardVO board) {
service.boardInsert(board);
...
}
}
@Autowired란
의존 관계 주입을 할 때 사용하는 어노테이션(Annotation)으로
의존 객체의 타입에 해당하는 빈(Bean)을 찾아서 주입하는 역할을 한다.
BoardController 를 보면 개발자가 따로 BoardService에 대한 객체 생성을 하지 않아도 정상 동작한다. 이유는 생성자 또는 @Autowired를 통해 BoardMapper 또는 BoardService를 자동으로 주입을 받기 때문인데 이 때 자동으로 주입해 객체를 생성해주는 주체는 스프링이다. 이렇게 개발자가 아닌 스프링이 직접 의존 관계를 맺어주는 것을 IOC(제어의 역전)라고 한다.
각 객체가 서로 의존하는 관계가 될 수 있도록 외부에서 주입시켜주는 패턴이다. 즉, 객체가 필요로 하는 어떤 것을 외부에서 전달해 주는 것이라고 할 수 이다. 강하게 결합된 클래스들을 분리하고, 애플리케이션 실행 시점에 객체간의 관계를 결정해 줌으로써 결합도를 낮추고 유연성을 확보해준다.
public class BoardVO {
private String title;
private String content;
public BoardVO(String title, String content) {
this.title = title;
this.content = content;
}
...
}
public class BoardVO {
...
public void setTitle(String title) {
this.title = title;
}
public void setContent(String content) {
this.content = content;
}
}
@Controller
public class BoardController{
@Autowired
private BoardService service;
}
DI 프레임워크에서는 생성자 주입을 권장하고 있다. 생성자 주입은 객체의 불변성을 확보할 수 있으며, 테스트가 편리하고, final 키워드와 Lombok을 활용하여 간결하게 작성이 가능하고, 순환참조 에러를 방지할 수 있기 때문이다.
기능 단위를 분리하여 개발의 복잡성을 낮추기 위한 프로그래밍 패러다임이다. 객체 지향 프로그래밍은 주요한 기능에 단일 책임 원칙(SRP : Single Responsibility Principle)에 따라 클래스를 분리한다. 애플리케이션을 개발할 때 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 AOP라고 한다.
기능을 분리할 때 공통되지 않는 주요 비즈니스 로직을 핵심 관심사(Core Concern)라고 하며, 핵심 관심사항에 공통적으로 적용되는 관심 사항을 횡단 관심사(Cross Cutting Concern)라고 한다.
AOP는 프록시 패턴(Proxy Pattern)을 통해 구현된다.
프록시 패턴이란
대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름의 제어하는 패턴.
누군가에게 어떤 일을 대신 시키는 것을 의미한다.
환경 변화 및 세부기술의 변경과 상과없이 일관된 방식으로 기술에 접근할 수 있는 화경을 제공하려는 추상화 구조이다. 스프링은 스프링을 통해 동작하는 라이브러리들이 POJO원칙을 지키게끔 PSA 형태로 추상화 되어있다. 즉, 복잡한 기술은 내부에 숨기면서 개발자에게 편의성을 제공한다.
Spring Web MVC와 Transaction을 예를 들자면, Spring은 Servlet 기반의 애플리케이션을 만들고 있다. 하지만 Servlet 코드는 보이지 않는다. @Controller, @GetMapping, @PostMapping 등의 Annotation을 사용하면 추가적으로 코드를 작성하지 않아도 get, post 등의 통신이 가능해진다.
그리고 JDBC를 통해 DB에 접근하거나 JPA를 통해 DB에 접근을 하든 @Transaction Annotation을 사용하기만 하면 코드를 추가하지 않고 Transaction 서비스를 사용할 수 있다.
스프링 프레임워크는 20여개의 모듈로 구성되어 있으며 각 모듈은 전부 사용해야 하는 것이 아니라 필요한 것만 사용할 수 있도록 설계되어 있다. 이를 통해 큰 규모의 애플리케이션을 구축하더라도 용이하게 사용할 수 있으며 AOP, MVC, TEST 등의 핵심적인 모듈을 통해 편리하게 애플리케이션을 개발할 수 있다.
스프링 프레임워크의 핵심인 Bean의 생명주기와 설정 그리고 처리 방법을 관리하는 스프링 컨테이너다.
모든 스프링 모듈은 Core Container 기반으로 구축된다.
Message, MesageChannel, MessageHandler 등의 스프링 통함 프로젝트를 포함하고 있으며 메시지 기반 애플리케이션을 구축하는데 역할을 한다.
스프링은 JDBC, ORM, Transaction 등의 서비스를 추상화를 통해 쉽게 데이터에 접근하는 방법을 제공한다.
스프링은 다양한 MVC 프레임워크를 사용할 수 있지만 스프링 자체적으로 제공하는 Spring MVC 모듈들이 있다. 또한 스프링의 리모팅 기술로 RMI, Hessian, HTTP호출자, REST API 모듈 등을 제공한다.
스프링은 테스트에 전념할 수 있도록 Test 모듈을 제공한다. JUnit, TensNg를 이용하여 테스트 컨텍스트 프레임워크나 Mock 오브젝트 등을 이용하여 테스트를 할 때 사용한다.
스프링 프레임워크 위키백과
https://m.blog.naver.com/goottjob/223017496733
https://www.codestates.com/blog/content/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8
https://huimang2.github.io/java/spring
https://memodayoungee.tistory.com/102
https://www.castingn.com/sourcing/kkultip_detail/110
https://velog.io/@sana/DI-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85Dependency-Injection-%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EB%B0%A9%EB%B2%95