본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2024-2 SpringBoot 스터디] 조상혁 #3주차

반응형

이 글은 스프링 핵심 원리 - 기본편을 기반으로 작성되었습니다.

 

이번 강의의 목적

  • 스프링 기본 기능 학습
  • 스프링 본질의 이해
  • 객체 지향 설계를 고민하는 개발자로 성장

위 목적을 되새기면서 강의를 들을 수 있도록 해야겠다.

 

객체 지향 설계와 스프링

 

작은 이야기..

스프링이 없던 시절 자바 개발은 EBJ 라는 툴이 가장 많이 사용 되었다.

다만 단점이 좀 있었는데 사용하기 어렵고 의존적이며 또한 비싸다는 것이다.

이 단점이 별거 아닌것 같지만 당시 개발자들은 EBJ를 버리고 순수 자바 개발로 돌아가자고 할 정도로 

여론이 좋지 않았다. 이 자바의 추운 겨울에 한줄기 빛 스프링과 하이버네이트가 오픈소스로 등장하고

스프링은 지금의 사실상 표준기술이 되었다.또한 하이버네이트는 JPA 를 이루는 근간으로 새롭게 재탄생 하였다.

이렇게 추운 자바 개발은 새로운 봄(spring)을 맞이하였다...

 

스프링

필수

  • 스프링 프레임워크: 스프링 애플리케이션을 개발하기 위해 필요한 핵심 프레임워크입니다. DI(Dependency Injection)와 AOP(Aspect-Oriented Programming) 등의 기능을 제공합니다.
  • 스프링 부트: 스프링 프레임워크 기반 애플리케이션을 더 빠르고 쉽게 설정할 수 있도록 도와주는 도구입니다. 내장된 웹 서버와 자동 설정 기능을 제공합니다.

선택

  • 스프링 데이터: 데이터베이스와의 상호작용을 단순화해주는 모듈입니다.
  • 스프링 세션: 세션 관리를 위한 모듈로, 클러스터링 환경에서 세션을 쉽게 관리할 수 있습니다.
  • 스프링 시큐리티: 인증과 권한 관리를 제공하는 보안 모듈입니다.
  • 스프링 Rest Docs: RESTful API 문서를 쉽게 작성할 수 있도록 도와줍니다.
  • 스프링 배치: 대용량 데이터를 처리할 때 유용한 배치 작업 기능을 제공합니다.
  • 스프링 클라우드: 마이크로서비스 환경을 위한 클라우드 기능을 제공합니다.

필수 프레임 워크에 시비스에 따라 알맞는 툴을 결합하면 된다.

위에 소개되지 않은 툴들은 스프링 공식 문서에 존재한다.

 

Spring | Projects

Spring Framework Provides core support for dependency injection, transaction management, web apps, data access, messaging, and more.

spring.io

 

스프링 부트

 

스프링을 편리하게 사용하기 위한 도구이다.

 

스프링은 자바에 봄을 가져왔지만 완벽했던건 아니다. 

 

설정이 좀 복잡하다는 단점이 있었는데 우스갯 소리로 설정을 마치면 스프링 개발의 반이 끝났다... 라고 할 정도?

 

그런 단점을 극복 시켜준 것이 바로 스프링 부트이다.

아마 부트가 없었다면 스프링이 이렇게까지 쓰이지 않았을지도 모른다는 생각이 든다.

 

스프링부트가 없다면??

더보기

스프링 부트(Spring Boot)가 없던 시절의 스프링 애플리케이션 개발은 설정과 환경 구성에 더 많은 시간과 노력이 필요한 복잡한 작업이었습니다. 스프링 부트 이전에는 주로 다음과 같은 방식으로 개발이 이루어졌습니다.

1. 설정 파일 작성의 어려움

스프링 애플리케이션 개발 시, XML 파일을 사용하여 다양한 설정을 직접 작성해야 했습니다. 의존성 주입, 데이터베이스 연결, 트랜잭션 설정 등을 포함한 거의 모든 설정을 XML로 관리했기 때문에 설정 파일이 방대해지고 관리가 어려웠습니다. 각종 XML 파일이 많아지면서 애플리케이션이 커질수록 설정 관리가 복잡해지고 실수가 발생하기 쉬웠습니다.

2. 환경 구성 복잡도

스프링 부트는 내장 웹 서버(Tomcat, Jetty 등)를 제공하여 애플리케이션을 단일 JAR 파일로 실행할 수 있지만, 스프링 부트 이전에는 외부 WAS(Web Application Server)에 WAR 파일을 배포하여 실행해야 했습니다. 이로 인해 서버 환경에 맞춰 일일이 배포하고, WAS의 설정까지 신경 써야 했습니다.

3. 종속성 관리 문제

스프링 부트 이전에는 의존성 버전 충돌이나 호환성 문제를 개발자가 직접 해결해야 했습니다. 스프링 부트는 스타터 종속성(spring-boot-starter)을 통해 프로젝트에 필요한 기본 종속성을 일괄적으로 관리해 주지만, 그전에는 모든 라이브러리 버전을 직접 맞춰야 했습니다. 이 과정에서 종속성 충돌이 자주 발생했으며, 이를 해결하는 데 많은 시간이 소요되었습니다.

4. 프로젝트 초기 설정의 복잡성

스프링 부트는 애플리케이션 기본 구조를 자동으로 생성하고, 설정을 간소화하여 개발 시작이 훨씬 쉬워졌습니다. 그러나 스프링 부트 이전에는 프로젝트의 초기 디렉터리 구조를 설정하고 기본 설정을 만드는 과정이 까다로웠습니다. 각종 설정을 직접 추가해야 했으며, 이는 초보자에게 높은 진입 장벽이 되었습니다.

5. 설정과 코드의 분리 어려움

XML과 자바 코드가 분리되어 있어, 개발 중에는 자주 XML 파일과 코드 파일을 오가야 했습니다. 이로 인해 개발 속도가 느려지고, 관리가 어려웠습니다. 스프링 부트는 애노테이션 기반 설정을 통해 코드에서 바로 설정을 관리할 수 있게 하여, 개발자가 더 쉽게 설정을 수정하고 확인할 수 있도록 도와줍니다.

요약

스프링 부트 이전의 스프링 개발은 초기 설정과 배포 환경 구성에 많은 시간과 노력이 필요했고, 설정의 복잡성 때문에 실수할 여지가 많았습니다. 스프링 부트는 이러한 과정을 크게 단순화하고, 설정 자동화 및 기본 설정 제공을 통해 개발 생산성을 높여줬습니다. 이를 통해 스프링 프레임워크의 사용이 더욱 편리해지고, 개발자들이 비즈니스 로직 구현에 집중할 수 있게 되었습니다.

왜? 스프링이 만들어 졌을까?

핵심개념 : 스프링은 자바기반이다. 따라서 객체 지향 언어가 가진 강력한 특징을 살리는 것!!

 

 

++ api 잘쓰는 것 != 스프링을 잘하는 것

 

좋은 객체 지향 프로그래밍 이란?

객체 지향 프로그래밍 : 현실 세계의 개념을 객체로 표현하여 코드의 재사용성과 확장성을 높이는 프로그래밍 패러다임

 

객체 지향의 특징 - 다형성의 실생활 비유

 

세계를 역할과 구현으로 분리

 

운전자 : 자동차를 운전할 수 있음 즉) 자동차의 역할을 의존

자동차 구현 : 여러 종류의 자동차

 

운전자는 "자동차"를 운전할 수 있기에 K3 아반떼 테슬라를 모두 운전할 수 있다.

 

이러한 구분 덕분에 새로운 자동차가 나오더라도 운전자는 운전할 수 있음.

- 굉장히 유연함

 

개발에서의 다형성

 

역할과 구현의 구분으로 세상이 단순해지고,유연해지며 변경에도 용이.

클라이언트는 인터페이스만 알면 내부구조를 몰라도 바뀌어도 사용에 지장이 없다.

 

역할 = 인터페이스

구현 = 인터페이스 구현체

 

객체를 설계할 때 필요한 역할로 먼저 구조를 만들고 구현을 시작

 

 

 

유연 , 변경 , 협력을 기억하며 인터페이스를 설계해야한다.

 

스프링과 객체 지향

 

다형성이 가장 중요하다!! 그렇기에 스프링은 자바의 다형성을 극대화 시켜준다.

제어의 역전(Ioc) , 의존관계 주입(DI)은 다형성을 활용하여 편안하게 다룰 수 있도록 해준다.

 

새로운 제어의 역전이라는 개념이 등장했다.

 

그래서 뭔가 알아보았는데 

 

제어의 역전(Inversion of Control, IoC)이란

객체 간의 제어 흐름을 직접 관리하지 않고, 외부에서 필요한 객체를 주입하여 의존성을 관리하는 디자인 패턴입니다.

그냥 의존성 주입의 다른 말인거 같기도 하다.

 

그래서 둘의 차이점을 GPT 에게 물어보았다.

 

Ioc 와 DI는 서로 관련되어 있지만 Ioc가 좀 더 상위의 개념이고 DI는 Ioc의 구현 방법중 하나인 것 같다.

 

좋은 객체 지향의 5가지 원칙

 

클린코드 라는 책에서 정의한 5가지 원칙인데 책을 읽으면 좋을거 같아 좀 찾아보니 가격이 좀 있어서 빌리는게 좋을듯.

아래와 같이 전자책 빌려주는 사이트 꽤 있으니 찾아서 이용해보면 좋을 것 같다.

아 참고로 아래 사이트에는 클린코드가 없다,,..

 

경기도사이버도서관 | 전자책서비스

 

ebook.library.kr

 

 

SRP : 하나의 클래스는 하나의 책임만 가져야 한다. 

++ 중요한 것은 변경! 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것

 

OCP : 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.

++ 다형성을 잘 이용하여 기존 역할에서 기능을 추가하는 방향으로 가야한다.

++ 반드시 지킬 수는 없지만 객체를 생성하고,연관관계를 맺어주는 별도의 설정자가 필요하다.

 

LSP : 프로그램 객체는 정확성을 깨뜨리지 않으면서 하위 인스턴스로 바꿀 수 있어야 한다.

++ 오류나 컴파일의 이야기가 아니라 엑셀 밟으면 앞으로 가는 것과 같은 규칙

 

ISP : 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

++ 자동차 인터페이스 -> 운전 인터페이스 , 정비 인터페이스 

 

DIP : 프로그래머는 추상화에 의존해야하지, 구체화에 의존하면 안된다.

++ 구현 클래스 말고 인터페이스만 바라보는 설계가 중요하다.

 

객체 지향과 스프링

 

정리 실무 고민

 

인터페이스를 도입하면 추상화라는 비용이 발생한다.

기능을 확장할 가능성이 없다면, 구체 클래스를 직접 사용하고, 향후 꼭 필요할 때 리팩터 링해서 인터페이스를 도입하는 것도 방법이다.

 

실습

 

기본 세팅과 요구사항

기본적으로 자바가 제공하는 기능을 사용할 것이기에 사실 boot는 필요 없으나!

빠른 시작을 위해 추가 라이브러리를 설치하지 않고 시작할 것이다.

 

기획자가 위와같은 요구사항을 가져왔을 때를 상정하고 개발을 시작한다.

요구사항을 보며 어째서 결정이 안된 것과 바뀔걸 확정하고 오지 않는가.... 라는 생각이 좀 들기도 한다.

 

 

회원 도메인 설계

받은 기능들을 정리해보자.

회원 : 가입 조회 , 일반 VIP , DB(미확정)

 

협력관계는 아래와 같이 설정된다.

 

 

회원 도메인 테스트

 

주문 할인 도메인 설계

기능들을 정리해보자.

주문, 등급별 할인 , VIP 1000원 고정 할인(변동가능) - 할인은 없을 수 있으며 변경가능성 높음

 

협력관계는 아래와 같이 설정된다.

 

 

주문 할인 도메인 테스트

 

 

 

후기 ..

 

분명 이전 강의에서는 좀 더 느렸던거 같은데.. 돈을 내고 강의를 사서 그런걸까.. 랩을 하시는 강사님이 좀 낯설다..

반응형