백엔드 기술/Spring

Spring (POJO) VS Spring Boot

DvdHan 2023. 4. 21. 21:51

Spring Framework와 Spring Boot 차이점을 알아보기 전에, 각 특징에 대해 알아보자

[Spring Framework]

Java 애플리케이션 개발을 위한 포괄적인 인프라를 지원해주는 오픈소스 Backend Framework.

[특징]

#1. POJO ( Plain Old Java Object )

#객체지향적 원리에 충실하며, #환경과 기술에 종속되지 않고,
#필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트.
= 특정 기술에 종속되지 않는 순수한 자바 객체.

public class UserDTO {
	
	private String userName;
	private String userId;
	private String userPassword;
	
	public String getUserName() {
		return userName;
	}
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public String getUserId() {
		return userId;
	}
	
	public void setUserId(String userId) {
		this.userId = userId;
	}
	
	public String getUserPassword() {
		return userPassword;
	}
	
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
}

위의 예제는 기본적인 자바 기능인 getter/setter 메서드만 가지고 있으므로 POJO 라고 할 수 있다.

public class WinExam extends WindowAdapter {

	@Override
	public void windowClosing(WindowEvent e) {
		System.exit(0);
	}
}

위의 예제는 WindowAdapter 라는 클래스를 상속받고 있어, 많은 양의 코드를 리팩토링 할 가능성이 있다.
이처럼 특정 기술과 환경에 종속되어 의존하게 되면,
코드 가독성 뿐아니라, 유지보수, 확장성에도 어려움이 발생하므로 POJO라고 할 수 없다.

[POJO 장점]

#1. 재사용이 가능, 확장 가능한 유연한 코드
#2. 코드가 간결해짐.
#3. 디버깅에 용이함.
#4. 테스트가 간편.
#5. 객체지향적 설계를 제한 없이 적용 가능.

 

#2. IoC (Inversion of Control) / 제어의 역전

기존에는 자바 코드를 작성할 때 개발자가 직접 객체의 생성, 의존관계 설정 등을 했었지만,
Spring Framework에서는 Servlet, Bean 같은 코드를 개발자 대신 프레임워크가 대신해주는 것을 의미한다.
즉, 컨트롤의 제어권이 개발자가 아닌 프레임워크가 대신 해준다.

 

#3. DI (Dependency Injection)

IoC는 방법보단 개념에 가까운 것이고, DI가 IoC를 구체화한 직접적인 방법이다.
개발자가 Spring Framework에 의존성을 주입하면서 객체 간 결합을 느슨하게 해주는 것을 의미.
즉, 객체를 내부에서 직접 생성하는 것이 아니라, 외부에서 주입받아서 사용하는 것으로
형성된 의존 관계가 있다고 가정할 때, 사용된 객체에 변화가 생기면
해당 객체와 의존 관계를 가지고 있는 모든 클래스를 변경해야하는 번거로움을 줄이기 위한 방법.

[장점]
1. 결합도가 줄어 든다.
2. 유연성이 높아진다.
-> 의존 대상에 변화가 생길 때, 생성자의 파라미터만 변경하면 언제든 대체가 가능.
3. 테스트하기 쉽다.
4. 가독성이 높다.

 

#4. AOP (Aspect Oriented Programming) // 관심 지향 프로그래밍

애플리케이션의 핵심 로직에서 공통적인 기능따로 분리하는 것.

#공통 관심 사항
애플리케이션 전반에 걸쳐 공통적으로 사용되는 기능들의 관심사

#핵심 관심 사항
애플리케이션의 주목적을 달성하기 위한 핵심 로직에 대한 관심사


[장점]
1. 코드의 간결성을 유지
2. 객체 지향 설계 원칙에 맞는 코드 구현
3. 코드의 재사용

 

#5. PSA (Portable Service Abstraction) / 일관된 서비스 추상화

1. 추상 클래스 Child 생성

2. 추상 클래스를 상속하는 하위 클래스 생성

3. 추상 클래스를 구현한 클래스들을 객체화 할 때 추상 클래스 타입으로 생성

추상화된  클래스 타입으로 생성함으로써, 클라이언트가 일관되게 상위 클래스(추상클래스)를 바라보며,
하위 클래스(상속받은 클래스)들의 기능을 사용하는 것이 PSA의 기본 개념.

 

<서비스 추상화 기법 >

클라이언트가 DB에 연결하기 위해 JdbcConnector를 사용하기 위한 추상화

DbClient는 DB 서비스를 이용하는데 있어 Connection이 필요로 하지만,
3가지 종류의 DB Oracle, MariaDB, SQLite 에 연결해서 Connection을 얻는것이 아니라
JdbcConnector 인터페이스 하나만을 통해 Connection 객체를 얻고 있다.
즉 JdbcConnector는 클라이언트에서 이용하는 하나의 서비스가 되는 것이다.

클라이언트가 어떤 JdbcConnector 구현체를 사용하더라도,
Connection을 얻는 방법은 getConnection() 메서드를 사용해야 하므로 모두 동일하다.

즉, 일관된 방식으로 해당 서비스의 기능을 사용하고 있다는 의미이며,
이처럼 애플리케이션에서 특정 서비스를 이용할 때,
서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서
기술자체를 유연하게 사용할 수 있도록 하는 것을 PSA라고 한다.

 

[Spring Framework 정리]

1. POJO 
Java 외의 어떠한 규약이나 환경에 종속되지 않은 순수 객체 오브젝트

2. IoC / 제어의 역전
개발자가 객체 생성, 의존 관계 형성을 하는게 아닌, 프레임워크가 대신 해주는 것.

3. DI / 의존성 주입
IoC의 개념을 구체화 하는 방법.
특정 객체를 사용할 때 사용할 객체를 직접 생성하는 것이 아닌, 외부로부터 사용할 객체를 주입받는 것.

4. AOP / 관심사 분리
애플리케이션의 핵심 로직 기능공통 로직 기능분리한 것.

5. PSA / 일관된 서비스 추상화
클라이언트(서비스를 이용하는 쪽, 웹 브라우저)가 사용하고자 하는 기능을
상위 객체 (추상 클래스, 인터페이스)만을 사용 객체로 이용하고,
기능은 해당 상위 객체를 상속/구현한 하위 클래스의 기능을 사용함으로써
서비스 기능에 대한 접근 방식은 일관되게 유지하며 기능을 유연하게 사용하는 것.

 

[Spring Boot]

Spring Framework는 기능이 많은 만큼, 환경설정이 복잡한 편이다.
Spring BootSpring Framework를 사용하기 위한 설정을 자동화한 Spring Framework 확장 버전.

즉, 실행환경이나 의존성 관리 등의 인프라 관련 등은 자동화 처리하여 
사용자들이 신경쓸 필요 없이 바로 코딩을 시작할 수 있게 해주는 것이 Spring Boot의 키 포인트이다.

 

[Spring Framework와 Spring Boot의 차이점]

#1. 웹 애플리케이션 서버의 내장화
Spring Boot는 웹 애플리케이션 서버 Tomcat이 내장되어 있기 때문에 따로 설치할 필요가 없다.

#2. starter을 통한 dependency 자동화 관리 = 의존 라이브러리 자동 관리
starter는 특정 목적을 달성하기 위한 의존성 그룹이며 간편하게 dependency를 제공해준다.
즉, 필요한 라이브러리가 있다면
build.gradle (그레이들) or prom.xml (메이븐) 파일에 원하는 라이브러리를 추가해주면 된다.

#3. 애플리케이션 설정의 자동 구성
Spring Boot는 Starter 모듈을 통해 설치되는 의존 라이브러리를 기반으로
애플리케이션의 설정을 자동으로 구성한다. 

@SpringBootApplication  // (1)
public class SampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }
}

(1)과 같이 애너테이션만 추가하면 Spring Boot에서 자동 구성 설정을 활성화 해준다.


#4. 애플리케이션의 손쉬운 빌드
IDE에서 build 화면을 통해 애플리케이션 구현 코드를 손쉽게 빌드할 수 있고,
이를 직접 WAS (Web Application Server)에 올릴 필요가 없다.

* WAS (Web Application Server) *

더보기

서블릿 컨테이너라고도 부르며 대표적으로는 Tomcat이 있고 Spring Boot에 내장되어 있다.
즉, WAS는 구현된 코드를 빌드하여 나온 결과물(.jar)을
실제 웹 애플리케이션으로 실행되게 해주는 서버이다.


#5. 내장된 WAS를 통한 손쉬운 배포
Spring Boot는 Tomcat이라는 서블릿 컨테이너 혹은 웹 서버가 내장되어 있기 때문에, 구축할 필요 없다.
또한 작성한 코드를 빌드하여 생성한 jar 파일을 터미널에서 코드 한줄만 입력하면
WAS에 로드되어 서비스 가능한 웹 애플리케이션으로 실행이 될 수 있다.

java -jar <jar 파일명>.jar