spring 개념 및 장단점 / express.js vs spring
Spring 개념 및 장단점
Spring 개념
- 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크
- 특정 기술에 종속되지 않고(기술 비침투적) 객체를 관리할 수 있는 컨테이너를 제공하는 것
Spring MVC
- View - Controller - Service - Serviceimpl - DAO - DAOimpl - DTO
- 크게 보면 View / Controller / Service / DAO / DTO로 이루어짐
- View : 사용자에게 보여지는 화면. JSP를 통해 화면을 구성하고 Controller를 통해 서버와 연결
- Controller : View와 Service 사이를 연결. 클라이언트에서 입력한 URL에 맞는 View를 보여주고, View에서 처리하는 데이터를 Service로 전달
- Service : 실제 로직을 처리. Controller를 통해 화면과 연결되고, DAO를 통해 DB와 연결
- DAO : Data Access Object. 프로젝트와 DB를 연결. Mapper에 SQL을 명시한 뒤 Mapper와 함께 DB와 데이터를 주고 받음
- DTO : Data Transfer Object. VO(Value Object)라고도 불림. 데이터 교환을 위한 오브젝트. getter/setter 함수만 가지고 있으며 주로 DB 테이블과 매칭
- VO? 도메인에서 한개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체
Spring 장점
- 경량 컨테이너 - 객체의 라이프 사이클 관리 Java EE 구현을 위한 다양한 API 제공
- Bean LifeCycle
- 객체 생성 → 의존 관계 주입
- 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존 관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료
- 객체 생성 → 의존 관계 주입
- Java EE?
- Java SE 플랫폼 위에 구축
- 네트워크 애플리케이션을 개발하고 실행하기 위한 API 및 런타임 환경을 제공
- Servlet, JSON, Rest 반응형 클라이언트 API, WebSocket 등 지원
- Bean LifeCycle
- DI(Dependency Injection) 지원
- 컨테이너에서 request나 response를 만들어서 지원
- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 연결
- 객체의 의존관계를 외부에서 주입
- 생성자 주입, Setter 주입, 인터페이스 주입 등이 있다.
- A와 B 클래스가 있을 때, B 내부의 변경이 A에 영향을 끼칠 때, ‘A는 B에 의존한다’라고 한다.
- 장점
- 의존성이 줄어든다.(타 클래스의 변경에 덜 취약해진다.)
- 모의 객체를 주입할 수 있기 때문에 단위 테스트가 쉬워진다.
- 가독성이 높아진다.
- 재사용성이 높아진다.
- IoC(Inversion of Control) 지원
- 프로그램의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드 호출
- 스프링 컨테이너(IoC Container)는 프로젝트에서 사용되는 객체들을 Bean으로 관리하고 @Autowired 어노테이션을 이용해 객체를 주입
- DI를 통해 IoC 구현
- AOP(Aspect Oriented Programming) 지원
- 컨테이너와 함께 작업
- 트랜잭션, 로깅, 보안과 같은 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있음
- POJO(Plain Old Java Object) 지원
- POJO?
- 간단한 자바 오브젝트. 특정 '기술'에 종속되어 동작하는 것이 아닌 순수한 자바 객체
- 본래 Java의 장점을 살리기 위함
- Hibernate가 아닌 JPA를 사용함으로 ORM을 사용하는 데 있어 POJO를 유지
- ORM? Object Relational Mapping
- POJO?
- EJB(Enterprise JavaBeans)를 대신해 경량 컨테이너 사용
- 컴포넌트 교체가 쉬움
- EJB의 단점
- 단위 테스트가 어려움
- EJB 컨테이너 외부에서 실행이 어려움 → 테스트를 위해서 반드시 컨테이너에 배포 vs Spring DI
- 불필요한 메소드 구현
- 예외 처리가 번거로움
- in Spring, 모든 메소드에서 예외 처리를 구현하는 대신, 중앙 집중식 예외 처리를 수행하고 AOP를 사용해 주입
- 배포 불편
- 단위 테스트가 어려움
Spring 단점
- 선택적으로 도입할 수 없는 복잡한 기술
- IoC로 인해 개발자는 Spring에서 지원하는 기술에 대한 이해가 필요
- 프레임워크에 강력하게 종속되어 있어 제거할 수 없음
- IoC로 인해 개발자는 Spring에서 지원하는 기술에 대한 이해가 필요
- 너무 다양한 방법 제시
- 특정한 문제를 해결할 수 있는 단 한가지의 방법 대신, 여러 방법을 동시에 제공하는 경우가 많음
- Spring Boot vs Spring Framework
- XML 기반 의존성 vs Annotation 기반 의존성
- Reactive Web vs Servlet Web
- Spring Annotation vs 표준 호환(JSR-330, JSR-107) Annotation
- 특정한 문제를 해결할 수 있는 단 한가지의 방법 대신, 여러 방법을 동시에 제공하는 경우가 많음
- 많은 기능을 제공하고 탑재하여 무거움
- 높은 러닝 커브
Spring vs Spring Boot
Spring Boot?
- Embed Tomcat을 사용해 따로 tomcat을 설치하거나 버전 관리를 하지 않아도 됨
- tomcat?
- WAS(Web App Service). 자바 서블릿을 실행하고 JSP가 포함된 웹페이지 제공
- 자바 서블릿? 동적 웹페이지를 만들 때 사용되는 자바 기반의 웹 어플리케이션 프로그래밍
- JSP? Java Server Page : HTML 코드에 Java 코드를 넣어 동적 웹페이지 생성
- WAS는 컨테이너 기능이 존재하여 동적인 데이터를 처리 가능, 비즈니스 로직 O
- WS는 컨테이너 기능이 없어 정적인 데이터 처리, 비즈니스 로직 X
- 컨테이너 기능? 동적인 데이터를 처리해 정적인 페이지로 생성해주는 소프트웨어 모듈
- WAS(Web App Service). 자바 서블릿을 실행하고 JSP가 포함된 웹페이지 제공
- tomcat?
- starter를 통한 dependency 자동화(starter가 대부분의 dependency를 자동으로 관리)
- XML 설정 불필요
- jar 파일을 이용해 자바 옵션만으로 손쉽게 배포가 가능
- Spring Actuator를 이용한 어플리케이션의 모니터링과 관리 제공
Express.js vs Spring
Spring
- Spring MVC의 Multi-Thread 방식에서 I/O 작업이 수반된다면 자원의 낭비 발생
- Thread가 수행하는 요청과 응답에 대한 일처리에 비하여 I/O 작업은 훨씬 더 긴 작업을 가지고 있고 이러한 시간동안 Thread들이 블로킹
- Thread 수가 증가할 때마다 컨텍스트 스위칭이 빈번하게 일어나며, 이로 인한 성능 저하도 야기 가능
- Java를 사용하기 때문에 Type Safe함
Express.js
- 모든 클라이언트의 요청은 이벤트 루프로 들어가게 됨
- 이벤트 루프가 I/O와 같은 무거운 블로킹 작업들을 백그라운드에서 수행하고 이를 비동기 콜백 함수로 이벤트 루프로 반환
- I/O 작업이 아닌 CPU를 많이 사용하는 작업의 경우 작업이 끝날 때까지 blocking되므로 성능 저하 야기 가능
- 단순한 I/O 작업이 많고 연산 작업이 적을 경우 적합
- Node.js를 사용하므로 JSON 기반 DB와 함께 사용할 시 JSON 변환 과정 없이 사용 가능
- Javascript 기반이므로 프로젝트 규모가 커질수록 Type Safe하지 못함.
- Type Safe하지 못하기 때문에 IDE의 자동 완성 기능에 한계
- 싱글스레드를 사용하므로 메모리를 적게 사용함
Ref.
https://velog.io/@duckchanahn/Spring-이론정리
https://velog.io/@whitecloud94/스프링-프레임워크의-장단점-및-특징
https://velog.io/@outstandingboy/Spring-왜-스프링-프레임워크를-사용할까-Spring-vs-EJB-JavaEE
https://siyoon210.tistory.com/120
https://devlog-wjdrbs96.tistory.com/321
https://tecoble.techcourse.co.kr/post/2020-06-11-value-object/
'Programming > Java' 카테고리의 다른 글
[JAVA] Gradle (0) | 2022.07.19 |
---|---|
Maven (0) | 2022.07.13 |
[JAVA] 람다식 (0) | 2022.04.18 |
[JAVA] 제네릭 (0) | 2022.04.11 |
[JAVA] I/O (0) | 2022.04.05 |
댓글