Spring과 SpringBoot의 특징, 핵심 프로그래밍 모델

JINNI·2024년 5월 15일
0

[TIL] Java+Spring

목록 보기
4/15

1. Spring

Java 기반의 백엔드 혹은 웹 풀 스택 개발을 지원하는 프레임워크로 speed, simplicity, productivity에 집중한다.

프레임워크란?

새로운 애플리케이션을 보다 효율적으로 개발할 수 있도록 하는 재사용 가능한 소프트웨어 구성 요소의 모음. 특정 소프트웨어 표준 및 프로토콜을 기반으로 재사용 가능한 코드 모듈이 포함되어 있다. 밀키트, 운송수단, 프랜차이즈 같이 구조화된 틀.


Spring의 특징

다른 백엔드 프레임워크와 다르게 Spring이 갖고있는 특징이 있다. Spring은 IoC/DI, PSA, AOP의 3가지 핵심 프로그래밍 모델을 지원한다.

💎POJO(Plane Old Java Object) 프로그래밍 지향

: 새롭게 추가되는 Class나 Interface들에 의존하는 것이 아니라, Java의 기본 객체들에 집중하여 개발하는 것에 집중하는 프로그래밍. 특정 환경이나 기술에 종속적이지 않아 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있으며 객체지향적인 설계를 제한없이 적용할 수 있다.
e.g. Getter, Setter, Constructor, toString

  • POJO는 순수한 Java 오브젝트를 지칭한다. 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트

  • POJO 프로그래밍은 POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법

    • Java나 Java의 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 함.
      e.g. getter, setter만 가지고 있는 코드
    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;
    }
    }
    • 특정 기술을 상속해서 코드를 작성하면 안 됨. 명시적으로 사용했던 부분을 하나하나 제거/수정해야 하는 일이 발생하므로 특정 기술에 종속적임.
      e.g. extends를 통한 상속
    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");
    		}
      }
    • 특정 환경에 종속적이지 않아야 함
      e.g. 순수 Java로 작성한 코드 내에서 Tomcat이 지원하는 API를 직접 사용하는 경우 Tomcat을 Zetty로 바꿔달라는 요구에 Zetty로 관련 코드를 모두 수정해야 함

💎IoC(Inversion of Control) & DI(Dependency Injection)

: 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. 생성자 주입

  • 객체가 생성될 때 딱 한 번 호출되는 것이 보장
  • 의존 관계에 있는 객체들을 final로 선언할 수 있음
  • 생성자가 하나일 경우 @Autowired를 생략할 수 있음
@RequiredArgsConstructor
// final이 붙은 의존해야 하는 객체에 생성자를 만들어줌
// 해당 어노테이션을 붙이면 생성자를 만들지 않아도 스프링이 자동 등록
public class MemberService {
    private final MemberRepository memberRepository;
}
  1. Setter메서드 주입
  • setter 메서드를 통해 DI
public class MemberService {
    
    private MemberRepository memberRepository;
    
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository){
    	this.memberRepository = memberRepository;
    }
    
}
  1. 필드 주입
  • 필드에 어노테이션을 붙여 DI
public class MemberService {
    @Autowired
    private MemberRepository memberRepository;
}

💎AOP(Aspect Oriented Programming)


: 관점 지향 프로그래밍이라는 의미로, 서버 애플리케이션 내의 로직을 핵심적인 관점, 공통적인 관점(부가적인 관점)으로 나누어 보고 그 관점을 기준으로 모듈화하여 관리할 수 있는 개발 방식 → 공통된 기능을 재사용하는 기법!
: 애플리케이션 전반에 걸쳐 공통적으로 사용되는 기능들에 대한 관심사를 공통 관심 사항(Cross-cutting concern), 주목적을 달성하기 위한 핵심적인 비즈니스 로직에 대한 관심사를 핵심 관심 사항(Core concern)이라고 함.

💎PSA(Portable Service Abstraction)

: 하나의 추상화로 여러 서비스를 묶어둔 것으로, 환경의 변화와 관계없이 일관된 방식으로 기술에 접근할 수 있는 환경을 제공하는 추상화 구조

  • 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것을 서비스 추상화라고 함. 서비스 추상화로 제공되는 기술을 다른 기술 스택으로 간편하게 바꿀 수 있는 확장성을 갖고 있는 것이 PSA
  • Spring에서는 내부 구현에 대해서 자세히 알지 못해도, 특정 class를 상속받거나 어노테이션을 사용하면, 해당 기능을 사용할 수 있도록 잘 추상화한 객체들을 제공
    e.g. Spring Web MVC, Spring Transaction, Spring Cache, JpaRepository, Spring Security, AspectJ
// JDBC 기반의 DB에 접근할 수 있고, JPA를 활용해 ORM 접근을 할 수 있음.
try {
	dbConnection.setAutoCommit(false);

	doSomething()...

	dbConnection.commit();

	System.out.println("Done!");

} catch(SQLException e) {
	dbConnection.rollback();
}
finally {
	...
    	dbConnection.close();
}


2. SpringBoot

Spring을 더 쉽게 사용하기 위해 만들어진 Spring 기반의 프레임워크

SpringBoot의 특징

1. 내장 웹 서버

  • 기존에는 별도의 외장 웹 서버를 설치하고, 프로젝트를 War 파일로 빌드하여 배포를 진행(처리 속도가 느리고 번거로움)
  • 내장된 서버(내장 Tomcat, Jetty, Undertow) 제공
  • SpringBoot에서는 Spring Web dependency를 추가할 경우 내장 웹 서버 Tomcat을 제공

2. 독립적으로 실행 가능한 Jar 파일로 프로젝트 빌드

  • 클라우드 서비스 및 도커와 같은 가상화 환경에 빠르게 배포할 수 있음
  • Jar : Java로 작성, 컴파일된 Bytecode를 실행에 필요한 다양한 자원과 함께 압축한 Java 명령어로 실행 가능한 파일을 부르는 명칭

3. 간단한 초기 설정

  • Spring Boot에서는 application.yml , application.properties 와 같은 설정파일을 만들어, 안에 설정을 작성해주면 쉽고, 빠르게 설정을 할 수 있습니다.
  • 설정파일에서 작성한 환경변수값들을 어노테이션(@Value)을 통해 쉽게 코드 내로 가져와 사용할 수 있음.(공개되면 안되는 계정 정보 등)
  • 설정파일에 실행환경을 명시하고, 실행 환경별로 서버 애플리케이션을 실행할 수 있음

4. 라이브러리 버전 관리 자동화

  • 의존성을 주입한 라이브러리의 버전 관리를 수시로 해줘야 하는 Spring의 단점을 보완, 기본적인 설정을 초기에 자동으로 설정
  • 여러 써드파티 라이브러리를 사용해 starter라는 묶음 의존성 라이브러리 패키지를 이용해 Maven/Gradle에서 버전 관리


참고자료

Why Spring?
프레임워크란?
[Spring] 스프링(Spring Framework)의 정의와 특징
싱글톤(Singleton) 패턴 - 꼼꼼하게 알아보자
Spring Boot

profile
천재 개발자 되기

0개의 댓글