회고록(26) - Spring Framework의 특징
1. 데일리 일기
최근 공부하고 쉬는시간에 심리학과 관련된 유튜브들을 조금 봤다. 의지력의 양은 정해져 있기때문에
내가 특히 안좋아하는 나쁜 습관들(무분별한 유튜브, 술, 게임하기)은 의지력이 바닥 났을때 나오게 된다. 심리학적으로는 나쁜습관을 참아내는게 좋은 습관을 행하는 것보다 더 많은 의지력을 사용한다고 한다. 그러므로 나쁜 습관을 참아내려고 하기보다는 좋은습관을 행해서 스트레스를 관리해줄 필요가 있다고 느꼈다.
- 산책을 잠깐 간다거나
- 샤워를 한번 한다거나
- 청소 혹은 유산소 운동등을 한다거나
안 그래도 개발만해서 움직이지 않는데, 움직이는 좋은 습관들을 많이 만들어두어 나쁜습관이 생각나지 않도록 해야할 것 같다.
2. 오늘 배운 내용
Framework
Framework란?
거시적으로보면 애플리케이션을 만들기 위해 제공하는 뼈대, 틀을 의미한다.
소프트웨어의 설계, 구현의 재사용이 가능하게끔 일련의 협업화된 형태로 클래스를 제공하는 것을 말한다.
장점
- 밑바닥부터 코드를 작성하는게 아니라, 효율적으로 코드를 작성할 수 있다.
- 정해진 프레임 워크의 규약으로 인해 애플리케이션을 효율적으로 관리할 수 있다.
단점
- 중간에 Framework를 바꾸거나 완전 새롭게 만들어내기가 힘들다.
- Framework 규약들을 학습하는데 시간이 든다.
Framework vs Library
제어의 주도권이 누구에게 있냐로 다르다.
Library 는 애플리케이션을 개발할때 필요한 기능을 구현해놓은 코드의 집합체라고 할 수 있습니다. 그러므로 라이브러리에 구현되어 있는 기능을 개발자가 가져와서 애플리케이션을 완성하는데 사용한다.
Framework는 제공하는 기능들을 Framework가 동작하여 처리한다. 즉 애플리케이션 흐름을 Framework가 가지고 있습니다. 개발자는 다른 로직(비즈니스 로직) 에만 집중 할 수 있다.
Spring Framework를 사용하는 이유
왜 많고 많은 Framework중 Spring을 사용할까?
1. Java 언어
Java언어를 사용하기 때문에, 재사용성이 높고 변화와 확장에 유연한 객체지향적 설계가 가능하다.
또한 Spring은 다른 Java Framework들중 가장 안정적이다.
2. POJO 기반의 구성
3. DI 지원
4. AOP 지원
결국 모든 특징들의 공통점은 애플리케이션을 객체지향적으로 설계할 수 있기 때문이라고 할 수 있습니다.
위 특징들은 아래에서 하나하나 다루어 보도록 하겠습니다.
Spring Web Framework에 오기까지의 역사
JSP
View(html)와 서버로직들을 한 곳에서 작성했기 때문에 협업하기 매우 좋지않는 형식이었습니다.
Servlet
Servlet은 클라이언트 웹 요청 처리에 특화된 Java 클래스입니다. View에서 서버로직들을 분리하여 따로 클래스에 작성 할수 있었지만, 코드가 너무 길어 가독성이 떨어진다는 단점이 있었습니다.
Spring MVC
Servlet에서 하나하나 작업하던 클라이언트 요청데이터 가져오기, 응답데이터 만들기등의 작업을 Spring MVC를 통해 더 짧은 코드로 작성할수 있게 만들었습니다.
Spring boot
그러나 호환이 되는 모듈들을 가져오는 설정 작업에서 너무 오랜시간이 걸리게 되었습니다. 그리하여 설정의 복잡함을 줄여주는 Spring boot가 탄생하게 되었습니다.
Spring Frame work 특징
1. POJO(plain old java Object)
POJO란?
- 말 그대로 순수한 자바 객체를 의미한다.
- Java에서 Java스펙에서 정의하고 있지 않은 다른 기술, 규정이나 특정 환경에 종속되지 않은 Java 객체를 말한다.
- Servlet의 HTTPServletRequest, 등은 POJO라고 볼 수 없다.
- 객체지향의 원리대로 작성되어야한다.(SOLID)
- 아래 기술할 DI(IOC), AOP, PSA 를 통해 개발자는 POJO로 설계할 수 있다.
POJO가 필요한 이유
- 객체지향적인 설계를 제한없이 적용하기 위해서
2. IOC(Inversion of Control)와 DI(Dependency Injection)
IOC란?
- 애플리케이션 제어의 흐름이 개발자에서 Spring 프레임워크로 넘어가는 것을 말합니다.
- 일반적으로 main() 메서드에서 제어의 흐름이 동작하는 것이 아닌, Spring 안의 Servlet이 가지고있는 Service()가 웹 상에서 애플리케이션이 실행하도록 동작시켜 꺼지지않는 서버 동작이 가능합니다.
DI란?
- 한 클래스가 어떠한 기능을 동작을 위해 해당 기능을 가진 객체가 필요할때 생성자,수정자등을 통해 주입해주는것을 말한다.
- new 연산자를 통해 객체를 생성하면 강한 의존성을 가지게 되지만, DI를 통해 그리고 인터페이스를 활용하여 객체를 주입받으면 느슨한 관계의 의존성을 가지게 된다.
- 인터페이스에 의존하게 함으로써 OCP, DIP를 만족 시킬수 있다.
왜 DI가 필요할까?
- Java 애플리케이션으로 작성했을때의 엔드포인트(main())시점에 필요한 객체들을 Spring이 main 함수 밖에서 객체를 주입(DI)해주면서, 변화와 확장에 유연한 소스코드 작성이 가능해진다. 즉 개발자는 객체주입 보다는 좀 더 비즈니스 로직에 집중할 수 있게 된다.
3. AOP(Aspect Oriented Programming)
AOP란?
- 스프링에서 AOP란 공통적인 기능 로직(로깅, 트랜잭션, 보안)을 애플리케이션의 핵심 로직과 분리시켜주도록 하는 프로그래밍을 말합니다.
왜 필요할까?
- 코드의 간결성 유지(spring의 애노테이션으로 한번에 처리가능)
- 객체지향원리에 맞는 코드 구현(SRP)
- 코드의 재사용(유지보수가 용이해짐)
4. PSA(Portable Service Abstraction)
추상화란?
- Java에서 추상화란 어떤 클래스의 본질적인 특성을 일반화하는 것을 말한다.
추상화를 하는 이유?
- 추상화된 상위클래스를 일관되게 바라보며 하위 클래스의 기능을 동작할 수 있도록 함으로써 PSA 특징을 만들어 낼수 있습니다.
- 이를 통해 마찬가지로 변화와 확장에 유연한 설계가 가능합니다.
PSA란?
- 애플리케이션에서 사용하는 서비스에 추상화의 개념을 적용시킨 것을 말합니다.
- 다시말해 애플리케이션에서 특정 서비스(기능)를 이용할때, 서비스의 기능에 접근하는 방식 자체를 일관되게 유지하면서(인터페이스의 메서드) 서비스 자체를 유연하게 사용할 수 있도록 하는 것
- 인터페이스, 추상클래스에 하위 클래스 객체를 업캐스팅 하여 구현 할 수 있습니다.
PSA가 필요한 이유?
- 요구사항이 변경되었을때, 여러 서비스에 일관된 방식을 접근 할수있기 때문에 최소한의 소스코드 변경으로 유연한 변경이 가능하다.