spring

[스프링 교과서] 기초

kimkim615 2024. 8. 23. 16:58

1.1 마이크로서비스 아키텍처로 진화

애플리케이션 프레임워크란, 애플리케이션을 개발을 위한 기본 구조를 제공하는 소프트웨어 기능의 집합.

그래서 프레임워크의 모든 기능을 사용할 필요 없음. 적절하게 기능을 선택해서 사용하면 됨

프레임워크의 선택과 사용은 애플리케이션의 설계 및 아키텍처와 연결됨

 

1.2 스프링 생태계

스프링은 단순한 프레임워크는 아니고, 여러 프레임워크의 생태계다 

 

1. 스프링 코어

기본 기능을 포함하는 스프링의 기반. 스프링 컨텍스트(앱의 인스턴스를 관리할 수 있게함), 스프링 애스펙트(앱에서 정의한 메서드를 가로채고 조작함), 스프링 표현언어(특정 언어로 스프링 구성내용 작성 가능)

 

2. 스프링 모델-뷰-컨트롤러 (MVC)

HTTP 요청 처리하는 웹 애플리케이션 개발 가능 

 

3. 스프링 데이터 액세스

SQL 데이터베이스에 연결해서 앱 영속성 계층 구현 가능

 

4. 스프링 테스팅

스프링 애플리케이션 테스트 작성

 

1.2.1 스프링 코어의 이해: 스프링 기초

앱에 통합되는 기본 메커니즘을 제공하는 스프링 프레임워크의 일부분임

제어 역전(IoC) 원칙을 기반으로 작동 -> 스프링에 제어 권한을 넘김. 그래서 애플리케이션이 프레임워크(의존성)으로 제어되어 실행됨

 

1.2.2 스프링 데이터 액세스 기능을 사용한 앱 영속성 구현

스프링은 데이터베이스와 협업하는데, 데이터 영속성을 관리하는데 데이터 액세스 모듈을 사용함

ex) JDBC 사용, Hibernate와 같은 객체 관계형 매핑

 

1.2.3 웹 앱 개발을 위한 스프링 MVC 기능

스프링으로 개발된 가장 일반적 애플리케이션은 웹 애플리케이션.

스프링 MVC로 오늘날 많이 사용되는 표준 자바 서블릿(Servlet) 방식으로 앱 개발 가능

 

1.2.4 스프링 테스트 기능

단위(unit) 및 통합(integration) 테스트를 작성하는데 사용할 수 있는 다양한 도구 제공

 

1.2.5 스프링 생태계의 프로젝트

스프링 데이터, 스프링 시큐리티, 스프링 클라우드, 스프링 배치, 스프링 부트 등 프로젝트가 존재함

위 프로젝트를 모두 사용해서 앱 만들기 가능

스프링 데이터로 영속성 기능 확장

-> 최소한의 코드로 쉽게 DB에 연결하고 영속성(persistence) 계층 사용할 수 있게 해줌

스프링 부트

-> 구성보다 관례(convention-over-configuration) 개념을 도입한 프로젝트 중 하나임

프레임워크의 모든 구성을 사용자가 설정하는게 아니라, 스프링부트가 정의할 수 있는 기본 기능 제공한다는 뜻

그래서 기본 구성에서 시작해서 관례와 다른 부분을 변경하는게 더 효율적임

 

1.3 실제 시나리오에서 스프링

일반적으로 스프링 프레임워크 사용하기에 적합한 사례

1. 백엔드 앱 개발

2. 자동화 테스트 프레임워크 개발

3. 데스크톱 앱 개발

4. 모바일 앱 개발

 

1.3.1 백엔드 앱 개발에서 스프링 사용

백엔드 앱은 다른 앱과 여러 방식으로 상호 작용하고 DB를 사용해서 데이터 관리함. 예를 들어서

사용자 - 데이터 관리 위해서 클라이언트 앱과 상호 작용

클라이언트 앱 - 백엔드 앱에 사용자 요청을 처리하도록 요청

백엔드 앱 - 다른 백엔드 솔루션들과 직접 통신, 메세지 브로커를 사용하고 메세지를 큐 OR 토픽에 추가

다른 백엔드 솔루션 - 백엔드 앱에 직접 요청을 보냄

 

스프링은 이러한 구현에 필요한 모든걸 제공하고 모든 아키텍처 스타일에 매우 적합함

 

스프링 IoC 컨테이너 -> 객체 인스턴스를 더 쉽게 관리하고, 스프링이 제공하는 다른 기능과 결합함

스프링 MVC -> 클라이언트 앱이나 다른 백엔드에서 호출되는 REST 엔드포인트 구현

스프링 시큐리티 -> 인증과 인가(권한 부여) 구성

스프링 데이터 -> SQL과  NoSQL 데이터베이스에 접속

스프링 부트 -> 복잡한 구성 쉽게 설정하고, 앱 구현에 더 적은 코드로 작성

 

1.3.2 자동화 테스트 앱에서 스프링 사용

우리가 구현하는 시스템의 END-TO-END 테스트를 위해 자동화 테스트(예상대로 작동하는지 확인하는 테스트)를 사용함

이러한 어플리케이션은 백엔드 앱만큼이나 복잡해지므로,  테스트를 검증하는 앱을 별도의 팀에서 구현하는게 제일 효율적임.  

 

팀은 테스트 환경에 테스트 앱을 배포함. 일반적으로 Git과 같은 버전 관리 시스템 저장소에 저장함

젠킨스(Jenkins)과 같은 도구는 테스트를 정기적으로 실행하고 팀에 피드백을 전송함

 

테스트 앱에서는

스프링 MVC로 다른 시스템에서 보낸 호출을 시뮬레이션하고,

스프링 인테그레이션으로 큐나 토픽에 메세지를 보내고,

스프링 데이터로 SQL 데이터베이스에 접속할 수 있음

 

1.4 프레임워크를 사용하지 말아야 할 때

1. 가능한 한 작은 메모리에 특정 기능을 구현해야될 때

애플리케이션을 가능한 한 작게 만들기 위해서, 요즘은 서비스가 컨테이너(도커, 쿠버네티스 ...)로 제공되는 경우가 많다

최대한 빨리 폐기하고 다시 생성할 수 있어야하므로 앱 크기는 매우 중요함

 

2. 특정 보안 요구 사항으로 오픈 소스 프레임워크 사용하지 않고 맞춤형 코드를 구현해야될 때

국방 또는 정부 기관 분야의 앱에서는 보안때문에 맞춤형 코드가 필요하다.

 

3. 과도한 맞춤화 작업이 필요해서 더 많은 코드를 작성해야 할 때가 있음

기능을 처음부터 개발하기보다 프레임워크의 구성 요소와 조합 방식을 맞춤화해야하므로

 

4. 이미 해당 기능을 제공해서 사용시 이점이 없을 때

프레임워크를 사용하는게 항상 최선의 선택은 아니다