정리/Spring

[Spring] Spring이란?

javaju 2021. 9. 9. 21:54

Spring이란?

  • Java언어 기반의 프레임워크
  • Java로 다양한 어플리케이션을 만들기 위한 프로그래밍 틀

프레임워크❓

  • 프로그램 기본 구조(뼈대)
  • 원하는 기능 구현에만 집중하여 빠르게 개발할 수 있도록 기본적으로 필요한 기능을 갖추고 있는 것.

쉽게 이해할 수 있도록 집을 짓는 것으로 비유를 해보자.

사용자가 집을 직접 짓기 위해 설계도를 직접 그리고 각각의 기초 작업들을 일일이 하는 것 보다, 전문가들의 도움을 받아 작업을 하면 더욱 쉽고 효율적으로 집을 지을 수 있는 것처럼 프레임워크를 사용한다면 프레임워크가 제공하는 여러 기능들을 사용해서 빠르고 효율적으로 프로그램을 구축할 수 있을 것이다.

 

프레임워크를 사용하면 뭐가 좋을까❓


개발 프로세스 간소화

프레임워크에서 제공하는 여러 도구와 패키지는 개발자가 스크립트를 처음부터 작성할 필요가 없고, 이미 만들어진 코드를 재사용하게 되므로 재사용성을 높이고, 시간과 비용을 아낄 수 있다.

 

유지보수 용이

프레임워크를 사용한다면 코드가 체계적이고 상대적으로 정형화되기 때문에, 개발자가 중간에 교체되더라도 위험이 적고, 이후 소스코드의 유지보수도 상당히 용이해진다.

 

보안

개발자는 일반적으로 SQL Injection, CSRF 등 외부 공격을 방어하기 위한 추가적인 소스코드를 작성해야하지만, 프레임워크를 사용하면 이러한 일들을 할 필요가 없다. 대부분의 프레임워크와 함께 제공되는 보안 기능들은 개발자가 웹 사이트 혹은 애플이케이션을 보호할 수 있는 방법을 제공하기 때문이다.

 

그럼 프레임워크의 단점은 없을까❓


사전학습

다양한 기능을 제공하고, 미리 만들어져있는 기능을 사용하기 위해서는 학습이 필요하다. 새로운 프레임워크를 학습하고 사용하기 위해서는 많은 공부가 필요하다.

 

제약사항

제공하고 있는 기능들 외에, 원하는 옵션을 추가하는 것에 굉장히 보수적일 수 있다.

사용법이 정해져 있고, 기본적으로 설계된 구조를 바탕으로 코드를 작성하고 기능을 완성해야하기 때문에 코드를 유연하게 개발하는데 있어서 한계가 있을 수 있다.

 

크기

프레임워크는 많은 기능을 제공한다. 이는 개발하면서 필요하지 않은 기능도 포함된다는 것을 의미하고, 불필요한 기능이 메모리를 차지하기 때문에 리소스 낭비로 이어질 수 있다.

 

 

💡스프링(Spring)의 특징 -⭐ 결합도를 낮춰 유연할 개발 가능하게 해준다!


  • 제어의 역전(IOC : Inversion of Control)
    • 프로그램의 생명주기에 대한 제어권이 웹 애플리케이션 컨테이너에 있다. 
    • 사용자가 직접 new 연산자를 통해 인스턴스를 생성하고 메서드를 호출하는 일련의 생명주기에 대한 작업들을 스프링에 위임
    • 객체관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있다는 장점이 있다.

 

  • 의존성 주입(DI)
    • 객체 사이에 필요한 의존 관계에 대해서 스프링 컨테이너가 자동으로 연결해 주는 것
    • DI를 이용하여 빈(Bean) 객체 관리, 스프링 컨테이너에 클래스를 등록하여 스프링이 클래스의 인스턴스를 관리해 준다.
    👉🏻스프링 컨테이너에 빈(Bean)을 등록하고 설정하는 방법
    1. XML 설정을 통한 DI - applicationContext.xml에서 설정
    2. 어노테이션을 이용한 DI
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //DI가 없는 예제
    @RestController
    public class Controller{
        Service service = new Service(); //객체간의 결합도↑
     
    @RequestMapping("/hello")
    public String hello(){
            return service.helloMessage();
        }
    }
    cs

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //DI가 있는 예제
     
    //service
    @Component
    public class Service{
        public String helloMessage(){
            return "hello~"
        }
    }
     
    //controller
    @RestController
    public class Controller{
        @Autowired
        Service service;
     
        @RequestMappint("/hello")
        public String hello(){
            return service.helloMessage();
        }
     
    }
    cs
    → 어노테이션으로 Service 객체의 인스턴스를 쉽게 얻을 수 있다. = 결합도↓

 

  • 관점 지향 프로그래밍(AOP)
    • 주요 핵심 기능과 핵심 기능 구현을 위한 부가적인 기능(로깅 작업, 데이터베이스 연결 및 트랜잭션 처리, 파일 입출력 등) 구현을 분리하여 각각의 관점별로 묶어서 개발하는 방식

그럼 왜 스프링 부트가 필요할까❓


  • Spring MVC 프레임워크를 사용할 때 applicationContext.xml이외에 다양한 설정을 통해 의존성을 주입해야한다.
  • 기본 프로젝트를 셋팅하는데 많은 시간 소요

그럼 Spring Boot는 뭐가 다를까❓


  • Spring Boot는 따로 설정할 필요 없이 단지 실행만 하면 된다!
  • spring-boot-starter-web을 사용하면 종속된 모든 라이브러리를 알맞게 찾아서 가져오기 때문에 종속성이나 호환 버전에 대해 신경 쓸 필요가 없다!

공부하면서 작성한 글입니다. 틀린 내용이 있다면 알려주세요!🙏🏻

 

 

👀 참고

https://dzone.com/articles/spring-vs-spring-boot

https://msyu1207.tistory.com/entry/Spring-VS-Spring-Boot-차이점을-알아보자