Java 기반의 백엔드 혹은 웹 풀 스택 개발을 지원하는 프레임워크로 speed, simplicity, productivity에 집중한다.
프레임워크란?
새로운 애플리케이션을 보다 효율적으로 개발할 수 있도록 하는 재사용 가능한 소프트웨어 구성 요소의 모음. 특정 소프트웨어 표준 및 프로토콜을 기반으로 재사용 가능한 코드 모듈이 포함되어 있다. 밀키트, 운송수단, 프랜차이즈 같이 구조화된 틀.
Spring의 특징
다른 백엔드 프레임워크와 다르게 Spring이 갖고있는 특징이 있다. Spring은 IoC/DI, PSA, AOP의 3가지 핵심 프로그래밍 모델을 지원한다.
: 새롭게 추가되는 Class나 Interface들에 의존하는 것이 아니라, Java의 기본 객체들에 집중하여 개발하는 것에 집중하는 프로그래밍. 특정 환경이나 기술에 종속적이지 않아 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있으며 객체지향적인 설계를 제한없이 적용할 수 있다.
e.g. Getter, Setter, Constructor, toString
POJO
는 순수한 Java 오브젝트를 지칭한다. 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트
POJO 프로그래밍
은 POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법
public class User {
private String userName;
private String id;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
public class MessageForm extends ActionForm{ // (1)
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public class MessageAction extends Action{ // (2)
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
MessageForm messageForm = (MessageForm) form;
messageForm .setMessage("Hello World");
return mapping.findForward("success");
}
}
: IoC(제어의 역전)는 프레임워크가 가지는 특징 중 하나로 라이브러리는 개발자가 직접 호출하여 라이브러리 내의 code를 사용하는 반면(e.g. 리액트), 프레임워크는 개발자가 작성한 코드를 기반으로 제어권을 위임받은 프레임워크가 개발자의 의도에 맞춰 동작한다. Spring은 객체의 생성부터 생명주기를 스프링 컨테이너(Ioc 컨테이너)가 관리한다.
: DI(의존성 주입)는 IoC를 지원하는 대표적인 방법이다. 객체를 직접 생성하지 않고 외부에서 생성한 후 주입시켜주는 방법을 의미한다. Spring에게 제어권을 맡길 Java class를 Spring Bean이라고 하고, Bean으로 등록한 객체들은 컨테이너에서 싱글톤으로 관리된다. Bean은 스프링이 실행될 때 생성하며, 필요한 곳에 주입시켜 다른 class에서 사용할 수 있다.
싱글톤(Singleton)이란?
단 하나의 유일한 객체를 만들기 위한 디자인 패턴. 메모리 절약을 위해 인스턴스가 필요할 때 똑같은 인스턴스를 새로 만들지 않고 기존의 인스턴스를 가져와 활용하는 기법이다.(전역 변수의 개념을 클래스에 대입한 것!) 따라서 보통 그 객체가 리소스를 많이 차지하는 역할을 하는 무거운 클래스인 경우 싱글톤 패턴을 적용한다.
e.g. 데이터베이스 연결 모듈, 디스크 연결, 네트워크 통신, DBCP 커넥션풀, 스레드풀, 캐시, 로그 기록 객체
Spring에서 의존성을 주입하는 방법
Spring을 포함한 DI 프레임워크에서는 생성자 주입을 권장한다. 객체의 불변성을 확보할 수 있고, 테스트가 편리하며, final 키워드와 Lombok을 활용해 간결하게 작성할 수 있으며 순환 참조 에러를 방지할 수 있기 때문이다.
⭐1. 생성자 주입
@RequiredArgsConstructor
// final이 붙은 의존해야 하는 객체에 생성자를 만들어줌
// 해당 어노테이션을 붙이면 생성자를 만들지 않아도 스프링이 자동 등록
public class MemberService {
private final MemberRepository memberRepository;
}
public class MemberService {
private MemberRepository memberRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
public class MemberService {
@Autowired
private MemberRepository memberRepository;
}
: 관점 지향 프로그래밍이라는 의미로, 서버 애플리케이션 내의 로직을 핵심적인 관점, 공통적인 관점(부가적인 관점)으로 나누어 보고 그 관점을 기준으로 모듈화하여 관리할 수 있는 개발 방식 → 공통된 기능을 재사용하는 기법!
: 애플리케이션 전반에 걸쳐 공통적으로 사용되는 기능들에 대한 관심사를 공통 관심 사항(Cross-cutting concern)
, 주목적을 달성하기 위한 핵심적인 비즈니스 로직에 대한 관심사를 핵심 관심 사항(Core concern)
이라고 함.
: 하나의 추상화로 여러 서비스를 묶어둔 것으로, 환경의 변화와 관계없이 일관된 방식으로 기술에 접근할 수 있는 환경을 제공하는 추상화 구조
// JDBC 기반의 DB에 접근할 수 있고, JPA를 활용해 ORM 접근을 할 수 있음.
try {
dbConnection.setAutoCommit(false);
doSomething()...
dbConnection.commit();
System.out.println("Done!");
} catch(SQLException e) {
dbConnection.rollback();
}
finally {
...
dbConnection.close();
}
Spring을 더 쉽게 사용하기 위해 만들어진 Spring 기반의 프레임워크
SpringBoot의 특징
application.yml
, application.properties
와 같은 설정파일을 만들어, 안에 설정을 작성해주면 쉽고, 빠르게 설정을 할 수 있습니다.(@Value)
을 통해 쉽게 코드 내로 가져와 사용할 수 있음.(공개되면 안되는 계정 정보 등)참고자료
Why Spring?
프레임워크란?
[Spring] 스프링(Spring Framework)의 정의와 특징
싱글톤(Singleton) 패턴 - 꼼꼼하게 알아보자
Spring Boot