Spring & Spring Boot

bluewind8791·2022년 4월 24일
0

Spring

목록 보기
1/5
post-thumbnail

Spring Framework

Spring 생태계

스프링이란 Spring Framework, Spring Boot, Spring Data 등등의 여러 프로젝트의 모음을 의미합니다.

이런 스프링은 대표적인 웹 개발뿐만 아니라 여러가지를 할 수 있는 기능을 제공하고 있습니다.

Spring Framework

Spring Framework 하위에는 여러가지 Spring JDBC, Spring Web MVC, Spring Test, Spring AOP, Spring Web Socket 등등의 여러가지 하위 모듈을 가지고 있습니다.

Spring Framework는 객체 지향의 대표적인 언어인 자바를 활용하여 객체 지향의 특징을 잘 활용할 수 있게 해주며, 개발자들은 핵심 비즈니스 로직 구현에만 집중할 수 있게 해주는 프레임워크.

즉, Spring Framework의 전략은 비즈니스 로직과 엔터프라이즈 기술을 처리하는 코드를 분리시키는 것입니다. 이를 통해서 개발자는 객체 지향에 초점을 맞추어 비즈니스 로직에 집중하여 개발할 수 있게 되며, 이를 돕기 위해서 Spring에서는 DIIoC와 같은 기술을 제공해 줍니다.

초기 Spring 기본 설정만 잘 해놓는다면, 스프링 관련 코드를 신경 쓸 일이 거의 없다.

Spring Framework의 특징

Spring Framework의 특징으로서는 "스프링 삼각형"을 들 수 있습니다.

POJO

POJO는 간단하게 '자바 오브젝트'라고 이해할 수 있습니다.

PSA(Portable Service Abstraction)

  • 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 사용자에게 편의성을 제공하며, 이 기술을 다른 기술 스택으로 간편하게 바꿀 수 있는 확장성을 가진 서비스를 의미합니다.
  • 이는 사바라다님의 블로그에 잘 정리되어 있으니 읽어보시는걸 추천드립니다.

IoC (Inversion of Control: 제어의 역전)

스프링에서는 일반적인 자바 객체를 new로 생성하여 개발자가 관리하는것이 아닌, Spring Container 에 모두 맡기게 됩니다. 즉, 개발자에서 프레임워크로 객체 관리의 제어 권한이 넘어갔음으로 '제어의 역전'이라 합니다.

DI (Dependency Injection : 의존성 주입)

  • 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜 줍니다.
  • DI 장점으로써는 아래와 같습니다.
    • 의존성으로 부터 격리시켜 코드 테스트에 용이하다.
    • DI를 통하여, 불가능한 상황을 Mock과 같은 기술을 통하여 안정적으로 테스트 가능하다.
    • 코드를 확장하거나 변경할 때 영향을 최소화한다. (추상화)
    • 순환 참조를 막을 수 있다.

AOP(Aspect Oriented Programming)

  • 관점(Aspect)지향(Oriented)프로그래밍의 약자.
  • 관점 지향은 '어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화.
  • AOP를 사용하여, logging, transaction 관리, security에서의 적용 등 AspectJ와 같이 완벽하게 구현된 AOP와 통합하여 사용이 가능합니다.
  • 스프링 어플리케이션은 대부분 특별한 경우를 제외하고는 MVC 웹 어플리케이션에서 Web Layer, Business Layer, Data Layer로 정의합니다.
    • Web Layer : REST API를 제공하며, Client 중심의 로직 적용.
    • Business Layer : 내부 정책에 따른 로직 개발. 주로 해당 부분을 개발한다.
    • Data Layer : 데이터베이스 및 외부와의 연동 처리.

Spring Boot

기술이 발전하고 Spring Framework가 지원하는 더 다양한 기능이 생기기 시작하면서, 초기 Spring 기본 설정이 많아지고 복잡해지게 되면서 Spring Boot 프로젝트가 생기게 되었습니다.

그러므로, Spring Boot는 Spring 프로젝트 중 하나로, Spring Framework를 쉽게 사용하게 해주는 도구이지, Spring Framework와 별개로 사용할 수 있는 프로젝트가 아닙니다.

Spring Boot는 독립적이며, 운영할 수 있는 수준의 Spring 기반 어플리케이션을 쉽게 만들 수 있게 해줍니다. 또한 최소한의 설정으로 Spring 플랫폼과 서드파티 라이브러리를 사용할 수 있습니다. 대부분 Spring Boot 어플리케이션은 최소한의 Spring 설정을 필요로 합니다.

Spring Boot는 Spring 어플리케이션을 쉽게 만들 수 있게 해준다.

Spring Boot를 사용하면 달라지는 점

1. 의존성 관리

기존 Spring Framework는 개발에 필요한 모듈의 의존성을 각각 다운받아 줘야 했으며, 각 모듈의 버전을 개발자가 하나하나 명시해줘야 했습니다.

이로 인하여 모듈간의 의존성이 존재하는 경우도 있으며, 모듈의 버전이 달라 충돌하는 문제점이 있었습니다.

그러나 Spring Boot는 spring-boot-starter를 지원하여 자주 사용하게 되는 모듈간의 의존성과 조합을 제공해 줍니다.

2. 자동 설정

기존 Spring Framework에서는 XML이나 자바를 이용하여 설정해야 하는 부분들이 굉장히 많았습니다.
하지만 Spring Boot에서는 application.yml 파일에 약간의 설정만으로도 구현이 가능해집니다.

이는 Spring Boot가 자동 설정을 해주기 때문입니다. 자동 설정의 단계는 아래와 같습니다.

  1. Classpath에 라이브러리 jar 파일이 등록되면 spring.factories에 있는 관련 설정이 실행되게 됩니다.
  2. 자동 설정 후보 클래스의 @Conditional~ 조건에 따라 bean으로 등록됩니다.
  3. spring-configuration-metadata는 자동 설정에 사용할 프로퍼티 정의 파일로, application.yml이나 application.properties에 작성한 값으로 프로퍼티를 세팅한 후, 구현되어 있는 자동 설정에 값을 주입시켜줍니다.

3. 내장 WAS

기존 Spring Framework에서 웹 어플리케이션을 개발하고 난 후, 배포하려면 아래의 단계가 필요했습니다.

  1. 어플리케이션 WAR 패키징
  2. WAS 설치
  3. WAS에 WAR파일 올리기

하지만 Spring Boot에는 WAS가 내장되어 있어 사용자가 위의 설정을 하지 않아도 바로 WAS에 프로젝트를 올릴 수 있습니다.

4. 모니터링

Spring Boot의 모듈 중 하나인 Actuator는 어플리케이션의 관리 및 모니터링을 지원하여 상용 서비스 수준에서 필요로 할 모니터링 기능을 엔드포인트로 미리 만들어서 제공합니다.

End Point

  • /health : 어플리케이션의 상태 정보
  • /metrics/{name} : 어플리케이션의 metric 정보 (system cpu usage, process files.open 등)
  • /beans : 어떤 bean이 등록되어 있는지
  • /loggers/{name} : 어플리케이션의 logger 구성

주의할 점

  • Actuator는 민감 정보도 많이 제공하기 때문에 운영 시에는 Spring Security 등을 이용하여 보안에 신경써야 합니다.
  • Actuator의 데이터를 영구 저장소에 저장해주지 않으면 없어질 수 있습니다.

스프링 부트의 특징

  • 스프링 부트는 단순하게 실행되며, 프로덕션 제품 수준의 스프링 기반 어플리케이션을 쉽게 개발할 수 있도록 합니다.
  • 스프링 부트 어플리케이션에는 최소한의 Spring 구성만이 필요합니다.
  • java -jar 로 실행하는 자바 어플리케이션을 만들 수 있습니다.
  • Tomcat, Jetty, Undertow 같은 servlet이 내장되어 있기 때문에, WAR 파일을 배포할 필요가 없습니다. (기본값은 Tomcat)
  • Build Tool로써 Maven 과 Gradle 을 지원합니다.
  • 대규모 프로젝트 운영환경에 필요한 비 기능적 기능도 제공합니다. (보안, 모니터링 등등)
  • 스프링에서 불편했던 XML 구성 요구사항이 없어졌습니다.

Annotations

스프링 주요 Annotations

  • @Aspect : 자바에서 널리 사용하는 AOP 프레임워크에 포함. AOP를 정의하는 클래스에 할당.
  • @Pointcut : 기능을 어디에 적용시킬지, 메소드나 Annotation 등 AOP를 적용시킬 지점 설정.
  • @Before : 메소드 실행하기 이전
  • @After : 메소드 성공적으로 실행 후, Exception이 발생하더라도 실행
  • @AfterReturing : 메소드 호출 성공 실행 시 (Not Throws)
  • @AfterThrowing : 메소드 호출 실패 예외 발생 (Throws)
  • @Around : Before / After 모두 제어

스프링부트 주요 Annotations

  • @SpringBootApplication : Spring boot application 으로 설정
  • @Controller : View를 제공하는 controller로 설정
  • @RestController : REST API 를 제공하는 controller로 설정
  • @RequestMapping : URL 주소를 mapping
  • @GetMapping : HTTP GetMethod URL 주소 mapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @RequestParam : URL Query Parameter mapping
  • @RequestBody : HTTP body를 Parsing mapping
  • @Valid : POJO Java class의 검증
  • @Configuration : 1개 이상의 bean을 등록할 때 사용
  • @Component : 1개의 클래스 단위의 bean을 등록할 때 사용
  • @Bean : 1개의 외부 라이브러리로부터 생성한 객체를 등록 시 사용
  • @Autowired : DI를 위한 곳에 사용
  • @Qualifier : @Autowired 사용 시 bean이 2개 이상일 때 명시적 사용
  • @Resource : @Autowired + @Qualifier 의 개념
  • @Aspect : AOP 적용시 사용
  • @Before : AOP 메소드 이전 호출 지정
  • @After : AOP 메소드 호출 이후 지정, 예외 발생 포함
  • @Around : AOP 이전/이후 모두 포함, 예외 발생 포함
  • @AfterReturing : AOP 메소드의 호출이 정상일때 실행
  • @AfterThrowing : AOP시 해당 메소드가 예외 발생할때 지정

출처

profile
NO EFFORT, NO RESULTS

0개의 댓글