Spring in the real World

MeteorLee·2023년 1월 18일
0

Manning Publications의 <Spring Start Here>를 요약 정리했습니다.

Spring in the real World

Why should we use frameworks

프레임워크라는 애플리케이션을 구축하는 기능의 집합입니다. 애플리케이션 프레임워크는 앱을 빌드하는 데 사용하는 광범위한 도구와 기능 세트를 제공해 줍니다. 하지만 모든 기능을 다 사용할 필요는 없습니다. 만드는 애플리케이션이 요구하는 사항들에 대해서 알맞은 도구를 사용하는 것이 프레임워크를 올바르게 사용하는 것입니다.

책에서 프레임워크를 가구에 비유합니다. 이케아와 같은 곳에서 산 옷장은 알맞은 구성 요소와 조립하는 방법을 알려주는 설명서를 받게 됩니다. 여기서 약간의 차이가 있는데 옷장의 요소뿐만 아닌 탁자, 의자와 같은 제품들의 구성 요소 또한 받게 되는 것인데, 내가 필요한 원하는 구성 요소만을 사용해서 조립하는 것을 애플리케이션 프레임워크와 비슷하다고 할 수 있습니다.

사실 프레임워크에 대한 아이디어는 새로운 것이 아니고 항상 존재해왔습니다. 초창기부터 개발자들은 이미 존재하는 코드들의 일부를 재사용해왔습니다. 시간이 지남에 따라 수많은 코드들이 재사용되는 과정에서 많은 애플리케이션이 비슷한 요구 사항이 존재하는 것을 알게 되었습니다.

  • 로그, 오류, 경고 및 정보 메시지는 모든 앱에서 발생합니다.
  • 대부분의 애플리케이션은 트랜잭션을 사용하여 데이터를 처리합니다. 트랜잭션은 데이터의 일관성을 관리하는 중요한 메커니즘입니다.
  • 대부분의 애플리케이션은 공통된 취약점에 비슷한 프로텍트 메커니즘을 사용합니다.
  • 대부분의 애플리케이션은 통신하기 위해 비슷한 방법을 사용합니다.
  • 대부분의 애플리케이션은 캐싱, 데이터 압축과 같은 유사한 메커니즘을 통해 성능을 향상시킵니다.
  • ...

비즈니스 로직 코드는 애플리케이션이 비즈니스 요구 사항을 구현하는 코드로 말합니다. 사용자가 기대하는 기능을 구현한 코드 부분을 비지니스 코드라고 합니다. 하지만 모든 앱은 보안, 로깅, 데이터 일관성 등 다른 측면들도 추가로 처리해야 합니다. 그렇기에 앱에 구현된 비즈니스 로직 코드는 위의 공통된 부분들에 비해 작습니다.

그렇기에 우리는 매번 동일한 기능을 다시 작성하지 않고 동일한 부분을 재사용하여 효율적으로 애플리케이션을 만드려고 합니다.

  • 직접 개발하는 것보다 재사용함으로써 시간과 비용을 절약합니다.
  • 많은 앱에서 이미 사용하고 있는 구현 부분들은 다른 사람들이 테스트를 했기에 버그가 발생할 가능성이 적습니다.
  • 동일한 기능을 이해하는 많은 개발자가 있으므로 커뮤니티의 조언을 얻을 수 있습니다.

The Spring ecosystem

스프링을 프레임워크라고 하지만 훨씬 더 복잡한 구조를 가지고 있습니다. 스프링은 하나의 생태계와 같다고 할 수 있습니다. 일반적으로 개발자가 스프링 프레임워크를 참조한다면 다음과 같은 소프트웨어 기능의 일부를 참조합니다.

  1. Spring Core
    기본 기능을 포함하는 Spring의 기본 부분 중 하나입니다. 이러한 기능 중에 스프링 앱의 인스턴스를 관리할 수 있게 해주는 스프링 프레임워크의 기본인 Spring Context가 포함됩니다. 또 Spring Aspect가 포함되는데 앱에서 정의한 메서드를 조작하는 데 도움을 줍니다. 이런 스프링을 구성하는 기본적인 기능들을 가지고 있습니다.
  2. Spring model-view-controller (MVC)
    HTTP 요청을 제공하는 웹 애플리케이션을 개발할 수 있게 해주는 스프링 프레임워크의 일부입니다.
  3. Spring Data Access
    스프링의 기본 부분 중 하나로 앱이 지속성 있는 계층을 이용해서 SQL 데이터 베이스에 연결하는 데 필요한 도구를 제공합니다.
  4. Spring testing
    애플리케이션에 대한 테스트를 시행하는데 필요한 도구를 제공합니다.

스프링 코어

스프링 코어는 스프링 프레임워크의 가장 기본적인 메커니즘을 제공합니다. 스프링은 Inversion of Control(IOC) 원칙을 기반으로 작동하여 빈을 제어하는 등 스프링의 근간이라 할 수 있는 기능들을 제공합니다.

스프링 데이터 액세스

애플리케이션은 처리하고 있는 데이터를 유지하는 것이 중요합니다. 데이터베이스 작업을 기본으로 하며 데이터의 지속성을 관리하는 데 사용할 데이터 액세스 모듈을 제공합니다.

스프링 MVC

스프링으로 개발된 가장 일반적인 웹 애플리케이션이며 다양한 방식으로 웹 애플리케이션과 서비스를 작성할 수 있는 수많은 기능을 제공합니다. 오늘날의 수많은 애플리케이션이 가장 일반적으로 사용하는 서블릿 방식을 사용합니다.

스프링 테스트

스프링 테스트 모듈은 단위 테스트, 통합 테스트를 작성하는 데 사용하는 많은 도구들을 제공합니다. 테스트는 굉장히 중요하며 놓쳐서는 안 되는 부분입니다.

스프링 생태계 프로젝트

스프링의 생태계는 앞부분의 기능들보다 훨씬 더 많습니다. 여기에는 Spring Data, Spring Security, Spring Cloud, Spring Batch, Spring Boot과 같이 많은 프로젝트가 있습니다. 이러한 프로젝트는 함께 사용도 가능합니다. 예를 들어 Spring Boot, Spring Security Spring Data 모두 사용하여 앱을 만들 수 있습니다.

Spring in real-world scenarios

스프링 프레임워크에 대한 기본 지식을 알게 되었다면 스프링 프레임워크를 사용할 시기와 이유를 알 수 있습니다. 하지만 많은 개발자들이 단순하게 백엔드 애플리케이션에서만 스프링을 사용하는 것을 보았습니다. 사실 스프링 프레임워크는 다른 부분에서도 충분히 사용할 수 있습니다.

  1. 백엔드 앱 개발
  2. 자동화 테스트 프레임워크 개발
  3. 데스크톱 앱 개발
  4. 모바일 앱 개발

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

백엔드 애플리케이션은 서버 측에서 실행되는 시스템의 일부이며 데이터를 관리하고 클라이언트의 요청을 처리하는 책임을 가지고 있습니다. 또한 사용자 데이터 처리하는 작업을 합니다. 백엔드 앱은 여러 방식으로 다른 앱과 상호 작용하고 데이터 베이스를 사용하여 데이터를 관리하는 일을 합니다.

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

자동화 테스트는 개발자가 애플리케이션이 예상대로 작동하는지 확인하기 위해 사용하는 스프트웨어의 구현 부분입니다. 소규모 시스템에서는 테스트를 수동으로 수행해도 상관없지만 규모가 커지고 흐름이 중요한 애플리케이션일 경우 효율적인 자동 시스템을 구축하는 것이 중요합니다.

데스크톱, 모바일 앱에서 스프링 사용

데스크톱과 모바일 앱 또한 스프링을 통해 개발되기도 합니다. 데스크 톱 애플리케이션은 다양한 웹과 모바일 앱과 상호 작용하기에 자주 개발되지는 않지만 스프링 IOC 컨테이너를 통한 인스턴스 관리를 이용하여 깔끔한 구현과 뛰어난 유지보수를 제공하기 때문입니다. 모바일 안드로이드는 굉장히 드문 경우이지만 스프링을 통해서 개발이 가능하다는 점은 언급할만한 가치가 있습니다.

When not to use frameworks

프레임워크가 만능처럼 보이지만 사용을 피해야 하는 이유도 분명히 존재합니다. 너무 많은 도구를 사용했을 때의 부작용 이거나 간단한 시스템을 너무 어려운 방법으로 처리한다거나 여러 이유가 있습니다.

  1. 가능한 작은 메모리를 이용해서 특정 기능을 구현해야 하는 경우
  2. 특정 보안을 요구 사항으로 구현해야 할 경우 오픈 소스 프레임 워크를 사용하지 말아야 함
  3. 프레임워크를 사용하는 경우가 사용하지 않는 경우보다 많은 사용자 정의 작업을 해야 하는 경우
  4. 이미 작동하고 있는 앱을 프레임워크로 변경해도 아무런 이점이 없을 수도 있음

작은 메모리 공간

애플리케이션을 작게 만들어야 하는 경우 스프링 프레임워크의 종속성을 초기화하는 등의 작업을 하는 것은 너무 큰 메모리를 차지하게 됩니다. 따라서 가능한 작은 크기의 애플리케이션을 개발해야 하는 경우에는 Doker, Kubernetes와 같은 방식을 차용하는 것이 좋습니다.

보안 요구 사항에 따른 사용자 지정 코드를 작성

국방 또는 정부 조직과 같이 특수한 보안 사항이 중요한 경우에 오픈 소스 프레임워크는 보안 상 좋지 않습니다. 물론 오픈 소스이기에 많은 사람들이 취약점을 발견하고 이를 수정하여 높은 보안성을 가지니까 괜찮다고 할 수 있지만 이런 정보조차 공개하고 싶지 않을 수도 있습니다.

사용자 정의 기능이 너무 많음

프레임워크의 구성 요소를 사용하여 개발하는 것보다 그냥 사용자 정의 구성 요소를 개발자 스스로 만드는 것이 더욱 코드가 짧은 경우도 있습니다. 대부분의 경우 프레임워크를 활용하고 남은 부분을 사용자 정의로 처리하지만 사용자 정의의 크기가 프레임워크의 부분보다 압도적으로 많을 수 있기에 조심해야 합니다.

프레임워크로의 전환

이미 만들어진 애플리케이션을 프레임워크로 전환하면 더 좋지 않을까?라는 생각을 자주 할 수 있습니다. 하지만 변경하는 부분에서 기존 애플리케이션이 작동하는 방식과 프레임워크의 작동 방식 사이에서 문제가 발생할 수 있습니다. 그렇기에 프레임워크로의 변경이 마땅한 이점을 주지 않을 수 있습니다.

책의 목표

  • 스프링 컨텍스트를 사용하고 프레임워크에서 관리하는 객체 중심으로 주변 부분을 공부합니다.
  • 스프링 앱의 메커니즘을 구현하여 데이터 베이스를 연결하고 지속성을 부여합니다.
  • 스프링으로 구현된 REST API를 사용하여 앱 간의 데이터 교환을 설정합니다.
  • 기존 구성 방식을 사용하는 기본적인 앱을 빌드합니다.
  • 스프링 앱의 표준 클래스 설계에서 모범 사례들을 사용합니다.
  • 스프링 구현 부분을 적절하게 테스트합니다.

이 외에도 JDBC Template을 배우고 Hibernate 등에 대해서 학습합니다.

정리

  • 애플리케이션 프레임워크란 애플리케이션 개발을 위한 기본 구조를 제공하는 소프테웨어 기능 모음입니다. 애플리케이션 구축을 위한 골격을 지원하는 역할을 합니다.
  • 앱을 직접 개발하는 대신 구현된 기능을 조립하는 방식을 제공해 앱을 보다 효율적으로 빌드하는데 도움을 줍니다. 이를 통해 시간 절약과 버그가 있을 위험성을 낮출 수 있습니다.
  • 스프링과 같은 널리 알려진 프레임워크는 많은 사람들이 사용하기에 많은 유사한 문제에 직면하게 됩니다. 따라서 많은 사람들이 이 문제를 해결하고자 하기에 내가 문제를 직면했을 때 도움을 얻을 수 있는 많은 기회를 얻을 수 있습니다.
  • 애플리케이션 구현 시 프레임워크를 사용하지 않는 것 또한 생각해야 합니다. 프레임워크를 사용하기로 결정했더라도 다른 대안을 생각해야 합니다. 프레임워크의 목적이나 누가 사용하는지(규모) 등을 고려해야 합니다.
  • 스프링은 단순한 프레임워크가 아닌 생태계에 가깝습니다. 애플리케이션마다 알맞은 프레임워크들을 선택해서 이를 통해 구현하기에 단순한 프레임워크가 아닙니다.
  • Spring Core : 스프링의 기반을 구축하고 컨텍스트, 애스팩트, 기본적인 데이터 접근 기능을 제공해 줌
  • Spring Data : 지속성 있는 계층 구조를 만들기 위해 높은 레벨의 안정적인 기능들을 제공함. 이를 통해 굉장히 쉬운 방법으로 데이터 작업을 처리할 수 있음
  • Spring Boot : COC 방식을 적용하는데 도움이 되는 스프링 프레임워크

생각

OREILLY의 스프링 관련한 책 중에서 상당히 높은 점수를 받고 있어서 한번 읽게 되었는데 나와 너무 잘 맞는 책이라서 선택하게 되었다. 책이 영어로 되어있어서 많이 불편하긴 하지만 내가 선호하는 방식으로 책이 구성되어 있어서 1장을 다 읽자마자 이 책을 공부해야겠다고 생각했다.

지금까지 스프링에 관해서 여러 번 배우려고 노력도 했었는데 매번 좌절되었다. 가장 큰 이유는 DI니 IOP니 이해가 가지 않는 내용들로 시작해서 일단 하면서 배워 그러면 나중에 설명해 줄게 의 방식이 나와 너무나도 맞지 않았기 때문이다. 나는 이론을 알아야 예제도 볼 수 있는 아주 꽉 막힌 인간이기 때문이다. 그렇기에 이 책의 1장을 보자마자 드는 생각은 이게 스프링을 설명해주는 책이지 라는 생각을 많이 하게 되었다. 물론 내가 모자라서다.

Spring

사실 스프링이 무엇인지 정확하게 이야기할 수 없었다. 그냥 프레임워크의 일종? 정도였다. 하지만 이 책은 1장부터 스프링 프레임워크란 무엇인지 정확하게 설명해주고 있어서 좋았다. 단순한 프레임워크가 아닌 하나의 생태계와 같은 넓은 범위의 스프링을 나타내는 것이었다. 그렇기에 나는 스프링 부트와 스프링 데이터를 함께 사용할 수 있다는 사실조차 몰랐다. 이제야 스프링이 어떻게 생겼는지 정확하게 알게 되었다.

스프링은 만능이 아니다. 나는 자바 웹 개발자가 되기에 열심히 공부를 하고 있었기에 스프링을 배우면 모든 것을 할 수 있지 않을까?라는 생각을 했다. 거기다가 블로그들의 글을 보면 스프링의 단점? 초기 세팅이 어렵고 난이도가 높다 정도였기에 와 진짜 만능이구나 라는 생각을 했다. 하지만 스프링 또한 단점이 있고 이런 부분을 보니까 다른 관점에서 스프링을 바라볼 수 있게 되었다. 이렇게 나는 스프링을 바라보는 지식의 깊이가 늘게 된 것 같다.

스프링 코어

한 번도 들어보지 못한 개념이었다. 스프링을 구현하는 가장 기본적인 요소지만 처음 들어봤다. 1장에서 스프링 코어의 중요성을 얘기하고 다음 장에서 이를 중심적으로 다룬다고 하기에 집중해서 공부할 예정이다. 그리고 가장 중심부를 단단하게 다져서 주변 부분으로 뻗어나가는 공부 방식으로 공부하려고 한다.

마무리

스프링을 어떻게 서든 공부해야지 했고 엄청나게 도전하고 IOC REST 이런 부분만 어떻게 해보려고 끙끙되다가 만난 한줄기 빛 같은 책이다. 하면서 배우고 이 정도만 다루면 회사에서 지장이 없다고 하는 강의는 그만 듣고 싶다. 나는 어떻게 스프링이 생겼고 작동하는지 궁금했고 왜?라는 질문에 대답을 얻고 싶기에 이 책을 선택했다.
물론 걱정되는 점도 많다. 영어로 된 책이다 보니까 이해하고 공부하는데 시간이 많이 걸린다. 그냥 많이 걸리는 것이 아닌 엄청 많이 걸린다. 내 영어 실력이 아주 형편없기 때문일 것이다. 이 글을 작성할 때도 영어를 번역하는 과정에서 굉장히 애를 먹었다. 하지만 포기할 생각은 없다.

생각해 보면 내가 쉽게 배우는 것은 남들도 쉽게 배울 것이다. 어렵게 깊게 배우고 내 것으로 만들기 위해 노력할 것이다.

도움 받은 곳

Spring Start Here

profile
코딩 시작

0개의 댓글