Baro's B
Spring Framework 란 ? 본문
모의 면접을 하면서이 문제에 대해서 질문을 받았는데 대답을 하지 못했다
내가 Spring Framework를 사용하면서 이걸 왜 몰랐을까 라는 생각을 하면서 한번 더 정리하기로 했다.
프레임워크(Framework)란 ?
프레임 워크가 나오기 전에는, 개발자들은 언어를 이용해 복잡한 방식을 통해 프로젝트를 만들었다. JAVA를 사용한 프로젝트는 EJB(Enterprise Java Beans) 방식을 많이 썼는데, 이 방식은 너무 복잡하고 어려워서 개발을 한다해도 실패 확률이 높았고 유지보수도 매우 어려웠다고 한다.
또 개발을 하면서 프로젝트마다 공통적으로 구현되는 부분들(ex. 보안, 로그, 트랜잭션 등)이 존재한다. 프로젝트마다 공통적인 부분을 매번 구현한다는 건 상당히 비효율적이였다. 개발자는 비즈니스 로직에만 몰두해도 시간이 부족한데, 이런 부분들까지 신경쓰기엔 너무 피곤했다. 프레임워크는 이렇게 해서 나오게 되었다.
처음부터 내가 혼자 다 만드는 것 보다 이미 만들어진걸 갖다 쓰는게 작업 시간이 훨씬 빠른건 당연하다. 그래서 우리는 개발할 때마다 누군가 이미 만들어놓은 구조를 갖다 써서 거기에 살(비즈니스 로직)을 붙이기로 했다. 여기서 구조가 바로 프레임워크다.
- 프레임워크 : 개발을 위한 기초 뼈대로, 코드로 만들어진 구조이다.
- 프레임워크의 장점 :
1) 개발 생산성이 좋아지고 유지보수가 안정적이다.
2) 효율적인 개발이 가능해진다.
3) 프로그램의 일정한 품질이 보장된다.
- 프레임워크의 단점 :
1) 프레임워크를 쓰려면 개발자의 학습을 필요로한다.
2) 개발자가 자유롭게 개발하는데에 한계가 있다.
그렇다면 우리가 사용하는
스프링 프레임워크(Spring Framework)는 ?
스프링 프레임워크란, 위에 정리 내용으로 정의 된 JAVA를 사용한 프레임워크이다.
Spring Framework의 특징
어.. ?
이 삼각형은 스프링의 3대 특징이라 한다.
스프링은 POJO를 기반으로 한 AOP. PSA. Ioc/DI 의 특징을 가진다는 이야기 이다.
여기서 POJO란 (Plain Old JAVA Object)
- 직역하면 순수한 오래된 자바 객체
- 프레임워크 없이도 돌아가는 순수한 자바 객체
- 특정 기술에 종속되지 않는 순수한 자바 객체
(특정 기술에 종속 : 결합력 높다 -> 확장성 낮아짐 -> 객체지향의 장점 사라짐)
자바의 객체 그 자체를 의미한다.
AOP (Aspect Oriented Programming) 관점 지향 프로그래밍
= 관심사의 분리
말 그대로 프로그램을 두 가지 관점으로 바라보겠다는 뜻이다.
첫 번째 관점 : 공통되는 부분 (공통 관심사항) cross-cutting concern
두 번째 관점 : 핵심이 되는 부분 (핵심 관심사항) core concern
- 공통 관심사항 cross-cutting concern
: 중복되는 공통 코드 (보안, 로그, 트랜잭션 등) - 핵심 관심사항 core concern
: 비즈니스 로직
공통 관심사항은 코드가 중복된다. 프록시 패턴을 사용해서 비즈니스 로직과 분리한다.
이렇게 두 가지 관심사로 분리하게 되면 개발자는 비즈니스로직에 더욱 집중할 수 있게 된다.
IoC (Inversion of Control) 제어의 역전/역행
이전에는 코드 관리(Control)는 개발자의 일이었다. 객체의 생성부터 소멸까지의 라이프사이클 제어권은 개발자가 갖고있었다.
그런데 개발자가 프레임워크 API를 사용하게 되면서, 설정파일을 통해서 객체의 라이프사이클, 클래스 등을 프레임워크가 직접 제어하게 되었다.
즉, 개발자가 직접 제어하는 부분을 프레임워크가 대신 제어하게 되어 제어권을 가지게 되었다는 말이다.
-> 그래서 제어의 역전이라고 한다.
나는 이부분에 대해서 조금 이해를 계속 못하고 있었다가 Ioc/DI 와 관련된 자료를 여러번 찾아 본 후에야 이해를 했다.
DI (Dependency Injection) 의존성 주입/ 종속성 주입
DI란 개발자가 Spring 프레임워크에 의존성을 주입하면서 객체 간 결합을 느슨하게 하는 것입니다.
객체 간 결합이 느슨하면 코드의 재사용성이 증가하고, 단위 테스트가 용이해집니다.
의존 : A 클래스에서 B 클래스에 있는 기능을 사용하는 것
(B 클래스 = 의존하는 객체)
의존하는 객체를 직접 생성(new)하지 않고, 스프링 컨테이너에서 의존하는 객체를 전달(주입) 받는 것.
쉽게 생각하면 객체 생성할 때 new를 사용하지 않는것.
스프링 컨테이너 : 객체의 라이프사이클(생성부터 소멸까지)을 관리하는 역할
(= IoC컨테이너, BeanFactory)
스프링 컨테이너가 관리하는 객체 : 빈(Bean)
Bean을 관리한다고 해서 BeanFactory라고도 함.
BeanFactory에 기능들을 추가한 것 중 애플리케이션컨텍스트(applicationContext)가 있다.
객체를 사용하려면 객체를 생성하고 인스턴스를 얻어야만 사용할 수 있다.
객체에 인스턴스를 얻기 위한 방법으로 new연산자, 인터페이스 호출, 팩토리 호출 방식이 있다. 이 일들을 스프링 컨테이너가 대신 해준다. 즉, 외부(스프링 컨테이너)에서 제어의 흐름을 관리한다는 것이다.
PSA (Portable Service Abstraction) 일관성 있는 추상화
스프링 라이브러리는 POJO를 쓰기 위해서 PSA 형태로 추상화 되어있다.
POJO를 사용하면서 다른 기능을 쓰기 위해서 중간 역할을 해주는 것이 필요하다. 그건바로..
- 어노테이션 (annotation)
- 서블릿 기반으로 동작
- 추상화 계층에 숨겨져있음
- 어노테이션만 선언하면 내부적으로 다 동작이 되도록 추상화되어있음.
- doGet(), doPost()나 extends, implements 등등을 없애고 대신 어노테이션을 사용.
이외에도
중복 코드 제거
예를 들어 JDBC 같은 템플릿을 사용할 때 중복되는 코드도 많고 복잡합니다. 이를 모두 제거합니다.
다른 프레임워크와의 통합
JUnit, Mockito와 같은 유닛 테스트 프레임워크와 통합이 간단합니다. 이를 통해 개발하는 프로그램의 품질이 향상됩니다.
와 같은 특징 및 장점을 가지고 있다.
참고
'JAVA' 카테고리의 다른 글
객체지향이란? (0) | 2023.02.06 |
---|---|
가비지컬렉션(Garbage Collection)이란? (0) | 2023.02.01 |
Spring Web MVC의 Dispatcher Servlet의 동작 원리 (0) | 2022.12.12 |
ORM 이란? (0) | 2022.11.28 |
JPA란? (0) | 2022.10.29 |