안녕하세요! 이번에 스프링에 대해 공부하면서 공부한 것을 정리도 할 겸 게시글을 작성하게 되었습니다.
 
스프링 그 이전에 프레임워크가 무엇인지부터 감이 안잡히는 분들이 많을 것이라 생각됩니다. 저 또한 대학교에 다니면서 스프링을 무작정 배웠지만 프레임워크에 대한 이해도 없이 무작정 코드를 복붙만 하다보니 스프링을 왜 배워야하는지도 모르겠고 아예 흥미를 놓게 되더라구요.
 
그래서 스프링이 정말 싫었었는데 백엔드 개발 공부를 시작하면서 눈 딱 감고 스프링 공부를 해 보니 기초를 이해하니까 스프링이 이렇게나 유용하구나 생각되었습니다.
 
이 게시글들로 인해 이전의 저와 같이 스프링이 복잡하게만 느껴지고 스프링 공부에 손이 가지 않는 사람들에게 조금이나마 도움이 되었으면 좋겠습니다.

사실 스프링이 JAVA 개발자를 더 편하게 만들어주려고 나온거라 스프링이랑 친해질수록 좋답니다ㅎㅎ

예제는 인프런 사이트의 강의인 김영한씨의 ‘스프링 핵심 원리 - 기본편’을 참고하였습니다.
제가 이 강의를 보면서 스프링 독학을 시작하였고, 꽤 괜찮은 내용이 많아서 김영한씨의 인프런 강의를 보면서 공부하는것도 추천드립니다!
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8


프레임워크

프레임워크는 소프트웨어 개발을 수월하게 하기 위해 미리 틀과 기능들을 만들어 놓어 놓은 것

프레임워크는 위와 같습니다. 그래서 저희는 그 틀에 맞게 구성하고 기능들을 사용하면서 품질과 생산성을 향상시킬 수 있어요.

스프링은 바로 위의 “로드 존슨”이라는 아저씨와 그에게 오픈 소스 프로젝트를 제안한 “유겐 휠러”, “얀 카로프”가 힘을 합쳐 만든 프레임워크입니다. 저희는 이 천재 아저씨들이 만들어놓은 효율성 좋은 틀에서 이제 개발을 하면 되는겁니다!
 
그러므로 저희는 새로운 개발 언어를 배우는 것이 아닌 JAVA 기반 프로젝트를 만들면서 그 프로젝트를 더 깔쌈하게 만들 수 있는 스프링이란 프레임워크를 적용시키고, 스프링이 우리 프로젝트에 해줄 수 있는 좋은 기능들이 뭐가 있는지 배워가는 것으로 생각하시면 됩니다.

💡여러 언어별 프레임워크

모든 언어에서 프레임워크를 사용하려면 스프링을 사용하는 것은 아닙니다.
JAVA나 KOTLIN 프로젝트에 사용되는 프레임워크가 스프링입니다.
그렇다고 JAVA나 KOTLIN에만 프레임워크를 적용할 수 있는것은 아니고, 각각의 언어 별 다양한 프레임워크가 있습니다.
Python: Django, Flask
Ruby: Rails
NodeJS: NestJS
등등이 있습니다.


스프링 VS 스프링 부트

사실 저는 이번에 스프링을 다시 공부하면서 스프링 부트를 처음 들어보게 되었습니다. 그러다 보니 제일 먼저 궁금한게 스프링과 스프링 부트의 차이더라구요.

스프링스프링 부트
기반JAVA 기반스프링 기반
설정개발자 직접 설정자동 설정
장점원하는 세밀한 설정 가능자동으로 의존성 관리, 간편한 설정
단점직접 의존성 관리가 필요, 복잡한 설정세밀한 설정이 힘드…나?

간단하게 생각하면 스프링 부트가 스프링을 훨씬 편하게 설정할 수 있도록 해주는 친구라고 생각하면 됩니다.
이전에 대학교에서 스프링을 배울 때는 서버도 따로 깔고 설정도 해줘야 하고 또 설정 파일은 엄청 길고…진짜 막막했었거든요. 그래서 저희는 그냥 스프링이 아닌 스프링 부트를 사용해서 예제를 진행하겠습니다. 확실히 써보니까 엄청 간결해지고 간편해진걸 느꼈습니다.


스프링을 사용하는 이유

스프링을 굳이 사용 안하고 JAVA로 순수 프로젝트 구성을 하면 되지 않을까? 생각될 수도 있을 것 같습니다.
JAVA를 공부하다 보면 객체지향이라는 말을 엄청 들었을 것입니다. 저도 진짜 많이 들었는데요. 하지만 작정하고 객체지향적으로 프로젝트를 구성하기는 여간 어려운게 아니었습니다.

스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 해줍니다.

객체 지향이라는 말 자체가 애매모호하게 느껴지실 분이 많으실거라 생각됩니다. 스프링을 공부하면서 이 또한 한층 더 깊게 이해하게되는 계기가 될 것이라 생각됩니다.
 
스프링 부트는 또한 더 편한 많은 특징들을 가지고 있습니다.

  • 내장 서버: 별도의 웹 서버를 설치하거나 배포할 필요 없이 내장된 톰캣, 제티, 언더토우 등의 웹 서버를 사용하여 애플리케이션을 실행할 수 있습니다.
  • 스타터 의존성: 스프링 부트에서는 자주 사용되는 라이브러리들을 모아놓은 스타터 의존성을 제공하여 메이븐이나 그래들과 같은 빌드 도구에서 간단하게 설정할 수 있습니다. 예를 들어, 웹 개발에 필요한 스프링 MVC, 잭슨, 톰캣 등의 라이브러리들을 포함하는 spring-boot-starter-web 의존성을 추가하면 됩니다.
  • 자동 구성: 스프링 부트에서는 애플리케이션에 필요한 설정들을 자동으로 구성해줍니다. 예를 들어, spring-boot-starter-web 의존성을 추가하면 웹 애플리케이션 개발에 필요한 디스패처 서블릿, 컨트롤러 매핑 등의 설정들이 자동으로 적용됩니다. 또한, application.propertiesapplication.yml 파일에서 간단하게 추가적인 설정들을 변경할 수 있습니다.
  • 프로덕션 준비 기능: 스프링 부트에서는 애플리케이션의 상태를 모니터링하거나 관리할 수 있는 다양한 기능들을 제공합니다. 예를 들어, /actuator 엔드포인트를 통해 애플리케이션의 상태 정보나 메트릭 정보 등을 확인할 수 있습니다. 또한, 로깅, 캐싱, 이메일 전송 등의 기능들도 쉽게 사용할 수 있습니다.
  • 관례에 의한 설정: 스프링 부트에서는 관례에 따라 일부 설정들을 기본값으로 적용합니다. 예를 들어, 메인 클래스가 위치한 패키지를 최상위 패키지로 인식하여 그 하위 패키지의 컴포넌트들을 자동으로 스캔합니다. 또한, src/main/resources/static 폴더에 정적 리소스 파일들을 위치시키면 자동으로 리소스 핸들러로 등록됩니다.

요약하자면 설정 파일에서 자주 사용되는 라이브러리들을 간단하게 추가할 수 있고, 웹 서버는 따로 구성할 필요없이 내장되어 있으며, 지정된 구조에 맞게 프로젝트를 구성하면 스프링이 알아서 각각에 맞는 기능을 제공해 줍니다. 이로인해 개발자가 신경써야할 사항이 정말 많이 줄어들어 기능 개발에만 집중할 수 있는 환경이 된 것이죠.


다음으로

스프링이 좋은 객체 지향 애플리케이션을 개발할 수 있게 해준다 했으니 객체 지향에 대해 더 자세히 알아보도록 하겠습니다. 아마 기깔난 장점이 있기 때문에 여러 개발자들이 객체지향을 많이 외치고 있는거겠죠?
 
실습은 객체지향에 대해 짚어본 다음 진행됩니다.
객체 지향적으로 구성되지 않은 프로젝트부터 시작해 객체 지향 원리를 적용해보고, 스프링에서 지원해주는 여러 기능들을 사용해 보면서 더 간결해지고 이해, 변경하기 쉬워지는 내 코드들을 보면서 보람을 얻어가실 수 있게 되었으면 좋겠습니다.

감사합니다!!!

👉다음 글 보러가기