IT's 우

[Spring] Spring 이란? 본문

CS/Spring & JPA

[Spring] Spring 이란?

디우 2023. 7. 8. 11:17
728x90

 

 

1. 스프링 정의

Spring 이란?

 👉 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크

 

  • 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공
  • POJO 기반의 구성으로 자바 코드를 이용해서 객체를 구성하는 방식 그대로 스프링에서 사용할 수 있다.
  • DI(의존성 주입)을 통한 객체 관계 구성을 지원한다.
  • AOP(횡단 관심사 분리) 지원
  • MVC 구조로 계층이 분리되어 관리하기 수월하다.
  • 배치 애플리케이션 스프링 배치가 있다.

 

2. 프레임워크(Framework)

👉 응용 프로그램이나 소프트웨어 솔루션 개발을 수월하기 위해 구조, 틀이 제공된 소프트웨어 환경
  • 소프트웨어 개발에 하나의 뼈대 역할
  • 자주 쓰일 만한 기능들을 한데 모아 놓은 유틸(클래스)들의 모음이다.
  • 기본적인 설계나 필요한 라이브러리는 알아서(의존성 주입 해주면) 할 테니 개발자는 개발 역량에 집중할 수 있다.

 

라이브러리와 프레임워크의 차이점

  • 라이브러리
    • 소프트웨어를 개발 할 때 사용되는 자원의 모임, 필요할 때 자유롭게 사용하는 도구
  • 프레임워크
    • 응용 프로그램이나 소프트웨어 솔루션 개발을 수월하기 위해 구조, 틀이 제공된 소프트웨어 환경
  • 프레임워크는 전체적인 흐름을 스스로가 쥐고 있으며 사용자는 그 안에서 필요한 코드를 짜 넣는다. 반면에 라이브러리는 사용자가 전체적인 흐름을 만들며 라이브러리를 가져다 쓰는 것이라고 할 수 있다.

 

3. 스프링 프레임워크의 특징

1) IoC(Inversion of Control, 제어 반전)

 👉 객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미
  • 개발자는 JAVA 코딩 시 new 연산자, 인터페이스 호출, 데이터 클래스 호출 방식으로 객체를 생성, 소멸시킨다.
  • 여기서 IoC란 객체의 생성부터 소멸까지 개발자가 아닌 스프링 컨테이너가 대신 해주는 것.

 

2) DI(Dependency Injection, 의존성 주입)

👉 스프링 프레임워크에서 지원하는 IoC의 형태
클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것
  • 프로그램에서 구성 요소의 의존 관계가 소스코드 내부가 아닌
  • 외부의 설정 파일을 통해 정의 되는 방식
  • 장점
    • 스프링 자체에서 설정을 통해 연관 관계를 맺어줌으로써 객체 간 결합도를 낮춰준다.
    • 클래스의 재사용성을 높이고, 유지보수가 편리해진다.
    • 의존성 주입으로 인해 stub, mock 객체를 사용해 unit 테스트의 이점이 생긴다.
  • 단점
    • 의존성 주입을 위한 선행 작업이 필요해 간단한 프로그램에서는 번거롭다.
    • 코드 추적이 어렵다.

2023.07.18 - [분류 전체보기] - [Spring] IoC, DI

 

[Spring] IoC, DI

주입방식 을 먼저 알고 가보자! 수정자 주입 @Service public class UserService { private UserRepository userRepository; private MemberService memberService; @Autowired public void setUserRepository(UserRepository userRepository) { this.userRe

kjk04021.tistory.com

 

3) AOP(Aspect Object Programming, 관점 지향 프로그래밍)

 👉 관점 지향 프로그래밍으로 공통 관심 사항과 핵심 관리 사항을 분리하는 것을 의미

 

  • 소스 코드에서 여러 번 반복해서 사용하는 코드(흩어진 관심사)를 Aspect로 모듈화 하여 핵심 로직에서 분리해 재사용하는 것이라고 볼 수 있다.
  • 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법.
  • 특정 로직(로그, 성능테스트, 권한)을 모든 메서드에 적용하고 싶을 때, 일일이 추가하는 것이 아니라 로직을 만들어 적용할 수 있다.
  • 따라서, 비즈니스 로직 앞/뒤에 공통 관심 사항을 수행해 중복 코드를 줄인다.

AOP 적용 방식

  • 컴파일 시점
    • .java 파일을 컴파일러를 통해 .class를 만드는 시점에 부가 기능 로직을 추가
    • 모든 시점에 적용 가능
    • AspectJ가 제공하는 특별한 컴파이럴를 사용해야 하기 때문에 특별한 컴파일러가 필요한 점과 복잡하다는 단점이 있다.
  • 클래스 로딩 시점
    • .class 파일을 JVM 내부의 클래스 로더에 보관하기 전에 조작하여 부가 기능 로직 추가
    • 모든 지점에 적용 가능
    • 특별한 옵션과 클래스 로더 조작기를 지정해야 하므로 운영하기 어렵다.
  • 런타임 시점
    • 스프링이 사용하는 방식
    • 컴파일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 런타임 방식
    • 실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능이 적용
    • 프록시는 메서드 오버라이딩 개념으로 동작하기 때문에 메서드에만 적용 가능 → 스프링 빈에만 AOP를 적용 가능
    • 특별한 컴파일러나, 복잡한 옵션, 클래스 로더 조작기를 사용하지 않아도 스프링만 있으면 AOP를 적용할 수 있기 때문에 스프링 AOP는 런타임 방식을 사용 가능.

 

4) POJO(Plain Old Java Object) 방식

  • POJO는 JAVA EE를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하여 나타난 용어이다.
  • 평범한 구식 자바 객체로, 프레임워크 인터페이스나 클래스를 구현하거나 확장하지 않는 단순 클래스를 의미.
  • JAVA에서 제공하는 API 외에는 종속되지 않아 코드가 간결하고 테스트 자동화에 유리하다.
  • Spring에서는 도메인과 비즈니스 로직을 수행하는 대상이 POJO 대상이 될 수 있다.
  • 별도의 프레임워크 없이 JAVA EE를 사용할 때에 비해 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기본 라이브러리를 지원하기 용이하고, 객체가 가볍다.
  • 즉, getter.setter를 가진 단순한 자바 오브젝트를 말한다.

Spring Boot Framework와 Spring Framework의 차이점

 👉 Spring Framework는 기존에 EJB를 대신해 자바 애플리케이션을 더 쉽게 만들 수 있게 해 주고, Spring Boot Framework는 Spring Framework보다 개발자가 더더욱 개발에만 집중할 수 있도록 도와주는 프레임워크입니다.

 

Spring Framework

자바 EE 어플리케이션을 빌드할 수 있는 오픈소스 경량 프레임워크이다.

Spring Boot

spring + boot(strap). 스프링 부트는 기존 스프링 프레임워크 위에 구축되었다. 스프링 부트를 사용하면 독립 실행형(stand-alone) 프로덕션 등급(production-grade) 스프링 기반 애플리케이션을 쉽게 만들 수 있다.

스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화하여 사용자가 편하게 스프링을 활용할 수 있도록 돕는다.

 

첫 번째 차이점, Dependency

dependency를 설정해줄 때 설정해 줄 때 설정 파일이 매우 길고, 모든 dependency에 대해 버전 관리도 하나하나 해줘야 합니다.

다음 예시는 Spring Framework에서 web에 대한 dependency를 추가하는 코드입니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.3.5</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.5</version>
</dependency>

Spring Boot Framework의 경우 dependency를 Spring Framework보다 쉽게 설정해 줄 수 있습니다. 버전 관리도 자동으로 해줍니다.

다음 예시는 Spring Boot Framework에서 web에 대한 dependency를 추가하는 코드입니다.

implementation 'org.springframework.boot:spring-boot-starter-web'

빌드 툴은 Gradle을 사용하는 경우 위와 같이 build.gradle 파일에 dependency를 추가해 주면 Spring Boot로 웹 개발을 할 때 필요한 모든 dependency를 자동으로 추가하고 관리해 줍니다.

또 다른 예시로는 Spring Framework의 경우 test 프레임워크를 사용하고자 하는 경우 Spring Test, JUnit, Hamcrest, Mockito 등 모든 라이브러리를 추가해줘야 하지만, Spring Boot에서는 spring-boot-starter-test 만 추가해 주면 됩니다.

 

두 번째 차이점, Configuration

Spring Framework의 경우 configuration 설정을 할 때도 매우 길고, 모든 어노테이션 및 빈 등록을 설정해줘야 합니다.

@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver =
          new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        registry.viewResolver(resolver);
    }
}

 

Spring Boot Framework는 application.properties파일이나 application.yml파일에 설정하면 됩니다.

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf

 

 

세 번째 차이점, 편리한 배포

Spring Framework로 개발한 애플리케이션의 경우, war파일을 Web Application Server에 담아 배포했습니다.

Spring Boot Framework의 경우, Tomcat이나 Jetty 같은 내장 WAS를 가지고 있기 때문에 jar 파일로 간편하게 배포할 수 있습니다.

Spring Framework로 WAS를 정하고, 모든 설정을 마쳐 배포를 하는 것보다 훨씬 간단한 배포 방법입니다.


출처

https://velog.io/@alghrksl/Spring-Spring-이란-무엇인가

https://webclub.tistory.com/458

https://github.com/backtony/Backend_Interview_for_Beginner/blob/master/Spring %26 JPA.md

https://yamyam-spaghetti.tistory.com/56#spring framework-1

 

728x90
반응형

'CS > Spring & JPA' 카테고리의 다른 글

[Spring] Annotation  (0) 2023.07.24
[Spring] 람다식(Lambda Expression)  (0) 2023.07.19
[Spring] IoC, DI  (0) 2023.07.18
[Spring] 스프링 컨테이너(Spring Container)  (0) 2023.07.18
[Spring] MVC 패턴  (0) 2023.06.27