안녕하세요 ! 민 입니다 . 오늘은 스프링을 처음 시작해보려고 합니다 . ( 진짜 처음은 아니고 스프링을 조금 만져보다가 스프링을 사용하면 코드가 줄어들고 사용이 몹시 간단하다고 하였는데 실제로 하다보니까 뭔가 편한 것 같으면서도 오류도 많이 생기고 원리를 잘 모르니까 뭔가 코딩을 하면서도 마음에 안 들더라고요 ~~ 필자가 사용하고 느끼면서 궁금해져서 ) 그래서 오늘은 스프링을 처음 시작하는 기념으로
1. 스프링을 사용하는 이유
2. 스프링의 개념
3. 현재 보고있는 개념 인강을 같이 공유해보려고 합니다 .
스프링을 사용하는 이유는 몹시 많고 다양합니다 . 일반적으로 알려진 스프링만의 특이점을 살펴보면
Spring 만의 특이점
Spring의 특징은 아래와 같다.
- 경량 컨테이너
- 제어의 역전
- 의존성 주입
- 관점 지향 프로그래밍
- 트랜잭션 관리
- MVC Pattern 등이 있다.
네 이렇게 다양한 장점이 존재하는데요 .
그럼 이거를 먼저 보기전에 원초적으로 저희가 스프링을 사용하는 이유가 뭔지 궁금할것입니다 . 스프링을 사용하는 이유는 간단하게 '코드를 줄여주고 개발자가 코딩에 집중하도록 만들어주는 것 입니다 ' 🥸
뭔가 당연한 내용을 왜 말하냐고 싶겠지만 그 당연한 이유를 알기위해서 이제부터 개념에 대해서 세세하게 들어가보겠습니다 .
🤔 스프링의 개념이라 이거 어디서부터 시작해야할지 감이 잘 오지않지만
시작해보겠습니다 .
하지만 바로 스프링의 개념으로 넘어가기이전에 스프링을 알기위한 기본적인 지식이 필요합니다 바로 '라이브러리'와 '프레임워크'의 차이인데요 .
라이브러리와 프레임워크의 차이는 아실수도 있지만 모르는 분들을 위해서 말씀드리겠습니다 .
이 사진으로 보시면 바로 이해가 안 되시겠지만
'프레임워크'는 '라이브러리'를 포함하고 있다는 것을 전제로
라이브러리는 저희가 개발을 하기 위해서 이미 만들어진 것들을 가져와서 사용한다고 생각하시면 쉽겠습니다 . ( 이미 만들어진 책을 가져와서 개발을 하기 쉽게 사용한다. )
프레임워크는 라이브러리를 '뼈대'로 만들어둬서 사용자가 작성한 코드가 프레임워크에 의해서 사용된다는 것을 의미합니다 . ( 정해진 룰이 존재해서 까다로움 ).
그럼 여기서 알게된 점은 '프레임워크는 라이브러리를 포함하고 있고
라이브러리는 가져다 쓰기 편하고 프레임워크는 뼈대가 존재하며 뭔가 쓰기가 어려워보인다 . 이 정도로 해석할 수가 있겠죠 ?
그럼 '뼈대'가 존재하는 게 '라이브러리'와 '프레임워크'의 차이냐고 물어보실 수 있는데 '주도권' (flow) 라는 차이가 둘 사이에 존재합니다.
여기서 사용자는 라이브러리를 꺼내서 썻지만 그에 반해서 프레임워크는 사용자가 작성한 코드를 끄집에 내서 쓰기 때문에 둘 차이가 '주도권'의 차이가 존재하는 것 입니다 .
그럼 이렇게 '라이브러리'와 '프레임워크'라는 개념을 숙지한 상태로 스프링의 개념에 대해서 이해해보겠습니다. 같이 가시죠 ! 🏃♂️🏃♂️🏃♂️
자 드디어 스프링의 개념으로 왔습니다 . 저희가 지금 이해하려고 하는 스프링은 '스프링 프레임워크'로 방금 알려드렸던 프레임워크로써 동적인 웹 사이트를 개발하기 위한 여러 서비스를 제공한 기술입니다.
이 스프링은 앞에서 말씀드렸던 특징이 존재합니다 .
Spring 만의 특이점
Spring의 특징은 아래와 같다.
- 경량 컨테이너
- 제어의 역전
- 의존성 주입
- 관점 지향 프로그래밍
- 트랜잭션 관리
- MVC Pattern 등이 있다.
경량 컨테이너라는 것은 바로 '일부' -> '일부' , '전체' -> '전체'
라는 말로 의미하면 쉽습니다 . 저희가 개발을 하면서 사용하는 하는 라이브러리나 필요한 요소들이 있을겁니다 . 근데 필요한 요소가 있고 필요하지 않은 요소가 존재하는데 모두 가져오는 것은 문제가 있습니다 😫
그런 문제를 해결하기 위해서 '일부'를 가져올 때는 '일부'만 가져오는 것이 경량 컨테이너라고 합니다 .
위에서는 제어의 역전과 의존성 주입이라고 되어있는데 저는 의존성 주입과 제어의 역전이라고 읽고 시작하려고 합니다 . 그 이유는
의존성 주입을 알고 그 상위개념인 제어의 역전을 아는 게 더 좋다고 생각하기 때문입니다 .
다들 결합도? 에 대해서 알고 계신가요 ?
결합도는 과연 높은 게 좋은 지 낮은 게 좋은 지 아시나요 ??
필자는 정보처리산업기사 시험에서 알게되었지만 결합도는 낮은게 좋답니다 .
왜 ?? 결합도가 높을 경우에는 결합되어 있는 것을 수정하게 될 경우 다른 것들도 수정해야해서 수정과 유지보수 등에 어려움이 존재하기 때문이죠 !
그럼 결합도에 대해서 설명하였으니 DI는 결합도를 낮추는 작업이라고 생각하시면 되겠습니다 .
의존 관계 주입이라는 것은 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법이다. (new 연산자를 이용해서 객체를 생성하는 것이라고 생각하면 된다)
(관게를 직접 만든다 -> 강한 결합
관계를 주입받아 -> 느슨한 결합(이게 좋은거임🥰)
여기서 스프링을 사용하지 않을 경우에 interface를 만들고 class를 만들고 번거로움을 겪어야 하는 경우가 발생하는데 ,,
이 번거로움을 해결해주는 것이 스프링 IoC 컨테이너 입니다 !
스프링 IoC 컨테이너란?
- 가장 중요한 인터페이스는 BeanFactory, ApplicatonContext이다
- 애플리케이션 컴포넌트의 중앙 저장소이다.
- 빈 설정 소스로 부터 빈 정의를 읽어들이고, 빈을 구성하고 제공한다.
- 빈들의 의존 관계를 설정해준다.(객체의 생성을 책임지고, 의존성을 관리한다)
저희가 따로 관계를 정의해줄 필요없이 스프링을 이용하면 @component로 간단하게 설정해주면 bean으로 만들어주고 bean으로 등록될 경우에는 의존성을 주입시켜준 다는 것 입니다 .
controller , service , repository ( 이 부분에 대해서는 지금 모르셔도 됩니다 .)
이번에는 제어의 역전입니다 !
제어의 역전의 의존성 주입의 상위 개념입니다.
스프링 컨테이너가 필요에 따라 개발자 대신 Bean을 관리해줍니다 .
개발자가 직접 new 연산자를 사용하고 생성하고 의존관계를 맺던 것과 달리
Spring에 존재하는 xml파일과 어노테이션 방식을 이용해서 Bean(객체) 에 등록하면 (생성 -> 의존성 설정 -> 초기화 -> 소멸)를 전부 관리해준다.
즉, 객체에 대한 제어권이 컨테이너로 역전되기 과정이 발생합니다. 이것을 제어의 역전이라고 합니다.
🥸 정리 !!
Spring은 IoC컨테이너를 이용해서 번거롭게 할 필요없이 bean 파일을 등록시킨다 . 기존과 달리 하나하나 생성하고 의존성을 주입할 필요가 없이
bean 파일로 등록시키면 Spring이 알아서 의존성을 주입시켜준다 . 이렇게해서 결국결합도가 낮아지고 코드를 적게 사용할 수 있다
자 이제 DI를 이해하셨다면 거의 다 왔습니다 . 마지막까지 더 파이팅해봐요 !!
스프링의 또 다른 특징은
일반적인 웹 개발(oop)와 달리 (aop)를 사용하다는 것 인데요 .
oop 개발은 장점도 존재하지만 단점도 존재하는데 바로 데이터를 모아서 분리하고 낮은 결합도를 가지지만 중복 코드가 많아져 가독성과 확장성이 몹시 떨어지는데요
하지만 AOP를 이용한다면 무분별하게 중복되는 코드를 한 곳에 모아 중복 코드를 제거하고 공통기능을 한 곳에 보관함으로 공통 기능 하나를 수정해서 결과적으로는 모든 공통 기능이 수정되는 효율성을 높일 수 있습니다 !
이렇게 스프링의 개념과 특징을 여러가지 알아봤는데요 . 이것말고도 스프링은 다양한 개념과 특징이 존재하지만 오늘 설명드린것중 2번 DI에 관련된 개념은 몹시 중요하기 때문에 꼭 읽어보셨으면 좋겠습니다 .
스프링개념을 공부하면서 필자의 느낀점
프로그래밍을 할 때 먼저 이걸 왜 사용하냐부터 생각하여야 했는데 무턱대고 뭔가를 만드는 과정을 먼저 하려고 하다보니 중간에 항상 원리로 되돌아왔던 것 같습니다 . 차근차근 코딩을 하는 하루가 되셨으면 좋겠습니다 . 오늘 하루도 빡코(빡세게 코딩)
많은 것을 배웠습니다, 감사합니다.