[Tech Interview]
Spring이란 무엇인가요?
Spring이 이야기하는 장점에는 무엇들이 있을까요?
(EJB와 비교해서 설명하면 좋을듯)
EJB (Enterprise Java Bean)
EJB는 스프링을 설명하기에 좋은 도구가 될 듯합니다.
EJB는 Enterprise Java Bean 의 약자입니다.
우선 Bean 은 객체라고 이해하면 좋습니다.
Java Bean 이란 자바 객체를 재사용 가능하도록 정의한 것입니다.
즉, Enterprise Java Bean은 엔터프라이즈(기업)급 어플리케이션을 개발할 때, 자바 객체를 재사용 가능하도록 정의하여 편리하게 개발 할 수 있도록 발표한 스펙이라고 이해하면 됩니다.
그럼 편리한 개발이란 무엇일까요?
편리한 개발이란 개발자가 복잡하고 실수하기 쉬운 로우레벨의 기술에 많이 신경쓰지 않고도, 애플리케이션의 핵심인 사용자의 요구사항, 즉 비지니스 로직을 빠르고 효과적으로 구현하게 하는 것을 의미합니다.
EJB는 이러한 '편리한 개발'을 목표로 삼았고, 약속대로 엔터프라이즈(기업) 개발의 고민거리와 부담을 덜어줬습니다.
하지만 EJB는 이 과정에서 실수를 합니다.
그 결과 편리한 개발이라는 목표를 달성하는 데 실패합니다.
EJB의 실수는 침투적인 방식을 채택합니다.
침투적 방식이란 어떤 기술을 적용했을 때 그 기술과 관련된 코드나 규약 등이 코드에 등장하는 경우입니다.
쉽게 말해, 개발자의 코드에 난입해서 지저분하고 복잡한 코드를 만들어 버린 것입니다.
이것은 복잡함을 가중시킵니다.
또 EJB는 EJB라는 환경과 스펙에 종속되는 코드만 사용가능하게 했습니다.
EJB라는 틀 안에서 자바 코드를 만들게 강제함으로써 상속구조, 다형성 적용 등, 자바 언어가 원래 갖고 있던 장점을 침해합니다.
스프링
스프링은 비침투적 방식을 통해 EJB를 보완합니다.
스프링은 EJB의 실수를 반면교사 삼았습니다.
스프링은 기술적인 복잡함과 비지니스 로직을 다루는 코드를 깔끔하게 분리해 주었습니다.
동시에 이 분리 기술이 코드에 직접적으로 들어나지 않도록 했습니다.
이것이 바로 스프링이 성공할 수 있었던 비법입니다.
스프링은 EJP를 적용했을 때 발생하는 복잡함의 문제를 두 가지로 분류하였습니다.
1. 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적이다.
서비스 추상화를 통해 로우레벨의 기술 구현 부분과, 그 기술을 사용하는 인터페이스를 분리하고, 환경과 세부 기술에 독립적인 접근 인터페이스를 제공하는 것이 이 문제에 대한 가장 좋은 해결책입니다.
스프링이 제공하는 템플릿/콜백 패턴은 반복적인 작업 흐름과 API 사용 코드를 제거함으로써 코드를 핵심 로직에만 집중하도록 도와줍니다.
2. 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장한다.
기술과 비즈니스 로직을 분리하기 위해서 스프링은 AOP 기술을 사용합니다.
AOP 란 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍입니다.
관점 지향이란, 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화하는 것입니다.
여기서 핵심적인 관점은 우리가 적용하고자 하는 핵심 비즈니스 로직입니다.
부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로킹, 파일 입출력 등이 있습니다.
기술적인 코드가 여기저기 중복돼서 나타날 때, 기술적인 작업을 처리하는 방식이 변경될 경우 많은 곳을 수정해야 합니다. AOP는 기술을 다루는 코드로 인한 복잡함을 기술 그 자체 이상으로 불필요하게 증대되지 않도록 도와주는 가장 강력한 수단입니다.
결론
스프링은 '자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크'입니다.
평범한 자바 클래스(POJO-Plain Old Java Object)를 이용하여
EJB의 기능을 유지하면서(엔터프라이즈 개발을 편하게 해주는),
복잡성을 제거해 코드를 단순하고 가볍게 만들었고(경량급),
스프링에 특화된 인터페이스 구현을 요구하지 않는 등 간소화를 실현합니다.
또 여러 객체들 간의 의존성을 해결(DI) 하고 제어(IOC) 하며 객체들의 라이프 사이클을 관리해줍니다.
특정 기술에 종속되지 않고(비침투적인 기술), 객체를 관리할 수 있는 컨테이너를 제공하는 것이 스프링의 기본 철학입니다.
ps. DI/IOC 에 대해서는 다음 포스팅에서 정리해 보겠습니다.
[Tech Interview] 태그로 작성한 글은 다음 git 저장소의 기술인터뷰 질문을 주제로 공부한 내용을 담고 있습니다.
https://github.com/Lob-dev/Junior-Back-end-Developer-Concepts/blob/main/Job%20interview.md
REFERENCE
https://12bme.tistory.com/157?category=682904
https://engkimbs.tistory.com/746
'STUDY > 서버' 카테고리의 다른 글
[서버] CI/CD 그리고 Jenkins (젠킨스) (0) | 2022.02.21 |
---|---|
[TI/SPRING] IOC, DI 정의/ 장점 (0) | 2022.02.18 |
백엔드 개발자 기술면접 질문 정리 (0) | 2022.01.27 |
[SERVER][SPRING] 검색하기 API (0) | 2022.01.21 |
[SERVER][HTTP, AJAX 통신, WebSocket, SSE] 특징, 장단점 (0) | 2022.01.20 |