자바의 오픈소스 애플리케이션 프레임워크 중 하나로, 스프링의 기본철학은 특정 기술에 종속되지 않고 객체를 관리할 수 있는 프레임워크를 제공하는 것 입니다. 그래서 컨테이너로 자바 객체를 관리하면서 의존성 주입과 제어의 역전을 통해 결합도를 낮추게 됩니다.
IoC는 Inversion of Control의 약자로 제어의 역전을 의미합니다. 제어권이 사용자에게 있지 않고, 프레임워크에 있어서 필요에 따라 사용자의 코드를 호출하게 됩니다. 스프링에서는 인스턴스의 생성부터 소멸까지 개발자가 아닌 컨테이너에서 대신 관리하게 됩니다.
DI는 Dependency Injection의 약자로, 의존성 주입을 의미합니다. 객체간의 의존관계를 미리 설정해두면 스프링 컨테이너가 의존관계를 자동으로 연결해줍니다. 이렇게 되면 직접 의존하는 객체를 생성하거나 검색해서 가져올 필요없어서 결합도가 낮아지는 장점이 있습니다.
디스패처 서블릿의 dispatch는 "보내다"라는 뜻을 가지고 있습니다. 그리고 이러한 단어를 포함하는 디스패처 서블릿은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)라고 정의할 수 있습니다.
이것을 보다 자세히 설명하자면, 클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿 컨테이너가 요청을 받게 됩니다. 그리고 이 모든 요청을 프론트 컨트롤러인 디스패처 서블릿이 가장 먼저 받게 됩니다. 그러면 디스패처 서블릿은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 컨트롤러를 찾아서 작업을 위임합니다.
여기서 Front Controller(프론트 컨트롤러)라는 용어가 사용되는데, Front Controller는 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러로써, MVC 구조에서 함께 사용되는 디자인 패턴입니다.
Spring MVC는 Dispatcher-Servlet의 사용으로 web.xml의 역할을 축소시켜준다. 기존에는 모든 서블릿에 대해 URL 매핑을 활용하기 위해서 web.xml에 모두 등록해주어야 했지만, dispatcher-servlet이 해당 어플리케이션으로 들어오는 모든 요청을 처리해주면서 작업이 상당히 편리해졌다.
AOP란?
Aspect-Oriented Programming의 약자이다.
흩어진 Aspect들을 모아서 모듈화 하는 기법이다.
서로 다른 클래스라고 하더라도 비슷한 기능을 하는 부분(ex 비슷한 메서드, 비슷한 코드)이있다. 이 부분을 Concern이라고 한다.
이 때 만약 노란색 기능을 수정하여야하면, 각각 클래스의 노란색 기능을 수정해주어야 하기 때문에, 유지 보수 면에서 불리하다.
이것을 해결한 방법이 AOP이다.
흩어진 기능들을 모을 때 사용하는 것이 Aspect이다. 각각 Concern 별로 Aspect를 만들어주고, 어느 클래스에서 사용하는 지 입력해주는 방식이다.
aspect
Advice(부가기능) + PointCut(advice를 어디에 적용시킬 것인지 결정)
AOP의 기본 모듈이다.
핵심기능 코드 사이에 침투된 부가기능을 독립적인 aspect로 구분해 낼수 있다.
구분된 부가기능 aspect를 런타임 시에 필요한 위치에 동적으로 참여하게 할 수 있다.
싱글톤 형태의 객체로 존재한다.Target
핵심 기능을 담고 있는 모듈로 타겟은 부가기능을 부여할 대상이 된다.Advice
타겟에 제공할 부가기능을 담고 있는 모듈Join Point
어드바이스가 적용될 수 있는 위치Pointcut
어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식이다.
포인트컷 표현식은 execution으로 시작하고 메서드의 Signature를 비교하는 방법을 주로 이용한다.Weaving
포인트컷에 의해서 결정된 타겟의 조인 포인트에 부가기능(advice)를 삽입하는 과정을 뜻한다.
AOP가 핵심기능(타겟)의 코드에 영향을 주지 않으면서 필요한 부가기능(advice)를 추가할 수 있도록
해주는 핵심적인 처리과정이다.
필터(Filter)는,
J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다.
즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되는 것이고(스프링 빈으로 등록은 된다), 디스패처 서블릿 전/후에 처리하는 것이다.
인터셉터(Interceptor)는,
J2EE 표준 스펙인 필터(Filter)와 달리 Spring이 제공하는 기술로써, 디스패처 서블릿(Dispatcher Servlet)이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다. 즉, 웹 컨테이너에서 동작하는 필터와 달리 인터셉터는 스프링 컨텍스트에서 동작을 하는 것이다.
디스패처 서블릿은 핸들러 매핑을 통해 적절한 컨트롤러를 찾도록 요청하는데, 그 결과로 실행 체인(HandlerExecutionChain)을 돌려준다. 그래서 이 실행 체인은 1개 이상의 인터셉터가 등록되어 있다면 순차적으로 인터셉터들을 거쳐 컨트롤러가 실행되도록 하고, 인터셉터가 없다면 바로 컨트롤러를 실행한다.
필터(Filter) vs 인터셉터(Interceptor) 차이 정리 및 요약
위의 표에 적힌 내용들 중에서 각각이 사용되는 용도에 대해서는 자세히 살펴보도록 하자. 일부에서 필터(Filter)가 스프링 빈으로 등록되지 못하며, 빈을 주입 받을 수도 없다고 하는데, 이는 잘못된 설명이다. 이는 매우 옛날의 이야기이며, 필터는 현재 스프링 빈으로 등록이 가능하며, 다른 곳에 주입되거나 다른 빈을 주입받을 수도 있다.
DispatcherServlet
- web.xml에 정의되어 있으며, sevlet-context.xml 설정 파일을 읽어 구동한다.
- Front Controller라고도 한다.
- 클라이언트의 모든 Request를 받아 제어한다.
- Controller에 요청을 전달하고 결과값을 View에 전달한다.
HandlerMapping
- 요청 URL에 매핑되는 Controller를 찾아 DispatcherServlet에 반환한다.
HandlerAdapter
- HandlerMapping을 통해 받은 Controller에 맞는 메서드를 탐색한다.
Controller
- 클라이언트의 요청을 처리한 후, 비지니스 로직과 서비스를 처리하여 View에 전달할 객체를 Model에 저장한다.
View Name
- Controller의 처리 후, View에 해당하는 View Name을 저장하여 반환한다.
Model
- Controller에서 처리 후, View에 전달할 객체를 저장하는 곳.
View Resolver
- Controller가 반환한 View Name을 기반으로 맞는 View를 찾아 DispatcherServlet에 반환한다.
View
- DispatcherServlet이 전달한 View를 호출하고, Model객체에서 필요한 객체를 가져와 클라이언트에 응답한다.
스프링 프레임워크(Spring Framework)는,
자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 간단히 스프링(Spring)이라고도 불린다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다.스프링 프레임워크는,
기능이 많은만큼 환경설정이 복잡한 편이다. 이에 어려움을 느끼는 사용자들을 위해 나온 것이 바로 스프링 부트다. 스프링 부트는 스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화하여 사용자가 정말 편하게 스프링을 활용할 수 있도록 돕는다. 스프링 부트 starter 디펜던시만 추가해주면 바로 API를 정의하고, 내장된 탐캣이나 제티로 웹 애플리케이션 서버를 실행할 수 있다. 심지어 스프링 홈페이지의 이니셜라이저를 사용하면 바로 실행 가능한 코드를 만들어준다. 실행환경이나 의존성 관리 등의 인프라 관련 등은 신경쓸 필요 없이 바로 코딩을 시작하면 된다. 그리고 바로 그것이 스프링의 키 포인트이다.
Spring Boot는 Spring framework와 몇 가지면에서 차이가 있다.
- Embed Tomcat을 사용하기 때문에, (Spring Boot 내부에 Tomcat이 포함되어있다.) 따로 Tomcat을 설치하거나 매번 버전을 관리해 주어야 하는 수고로움을 덜어준다.
- starter을 통한 dependency 자동화 :
아마 Spring 유저들이 가장 열광한 기능이 아닐까 싶다. 과거 Spring framework에서는 각각의 dependency들의 호환되는 버전을 일일이 맞추어 주어야 했고, 때문에 하나의 버전을 올리고자 하면 다른 dependeny에 까지 영향을 미쳐 version관리에 어려움이 많았다. 하지만, 이제 starter가 대부분의 dependency를 관리해주기 때문에 이러한 걱정을 많이 덜게 되었다.- XML설정을 하지 않아도 된다.
- jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능하다.
- Spring Actuaor를 이용한 애플리케이션의 모니터링과 관리를 제공한다.
Annotation은 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 합니다. Annotation을 활용하여 Spring Framework는 해당 클래스가 어떤 역할인지 정하기도 하고, Bean을 주입하기도 하며, 자동으로 getter나 setter를 생성하기도 합니다. 특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행할 수 있습니다.
@Component
개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation입니다. Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록합니다.@ComponentScan
Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면, Context에 bean으로 등록합니다. @ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 등록해줍니다.@Bean
@Bean Annotation은 개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용합니다.@Controller
Spring에게 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용하는 Annotation입니다.@RequestHeader
Request의 header값을 가져올 수 있으며, 해당 Annotation을 쓴 메소드의 파라미터에 사용합니다.@RequestMapping
@RequestMapping(value=”“)와 같은 형태로 작성하며, 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드가 실행됩니다. Controller 객체 안의 메서드와 클래스에 적용 가능합니다.@RequestParam
URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있는 Annotation으로 아래와 같이 사용합니다. Json 형식의 Body를 MessageConverter를 통해 Java 객체로 변환시킵니다.@ModelAttribute
클라이언트가 전송하는 HTTP parameter, Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 연결(바인딩)합니다. RequestBody와 다르게 HTTP Body 내용은 multipart/form-data 형태를 요구합니다. @RequestBody가 json을 받는 것과 달리 @ModelAttribute 의 경우에는 json을 받아 처리할 수 없습니다@ResponseBody
@ResponseBody은 메소드에서 리턴되는 값이 View 로 출력되지 않고 HTTP Response Body에 직접 쓰여지게 됩니다. return 시에 json, xml과 같은 데이터를 return 합니다.@Autowired
Spring Framework에서 Bean 객체를 주입받기 위한 방법은 크게 아래의 3가지가 있습니다. Bean을 주입받기 위하여 @Autowired 를 사용합니다. Spring Framework가 Class를 보고 Type에 맞게(Type을 먼저 확인 후, 없으면 Name 확인) Bean을 주입합니다.
- @Autowired
- 생성자 (@AllArgsConstructor 사용)
- setter
@GetMapping
RequestMapping(Method=RequestMethod.GET)과 똑같은 역할을 합니다.@PostMapping
RequestMapping(Method=RequestMethod.POST)과 똑같은 역할을 합니다.@SpringBootTest
Spring Boot Test에 필요한 의존성을 제공해줍니다.@Test
JUnit에서 테스트 할 대상을 표시합니다.
Lombok의 대표적인 Annotation과 역할
@Setter
Class 모든 필드의 Setter method를 생성해줍니다.@Getter
Class 모든 필드의 Getter method를 생성해줍니다.@AllArgsConstructor
Class 모든 필드 값을 파라미터로 받는 생성자를 추가합니다.@NoArgsConstructor
Class 기본 생성자를 자동으로 추가해줍니다.@ToString
Class 모든 필드의 toString method를 생성한다.
Spring 3.0
Spring3.0 부터 Java5가 지원된다. 기존에 유지하던 하위호환성에 Generic 이나 가변인자(varargs) 등과 같은 개선사항이 추가된다.
- 전체 프레임워크를 하나의 spring.jar 파일로 제공하던 부분을 여러개의 jar 파일로 나누어 제공한다.
- SPEL(Spring Expression Language)가 도입되었다. c) Rest API 에 대한 지원이 추가되었다.
- OXM(Object Xml Mapping) 기능이 추가되어 설정을 Xml 형태로 할 수 있게 지원한다. ex) Java annotation 을 이용해서 DI 의 지원이 가능하다.
Spring 4.0
Spring 3.0 이 Java5+ 버전들에 대해 지원을 한다면 Spring 4.0 버전은 Java 8 의 특징들을 적용할 수 있게 지원한다.
- Starter Pack 이 생겨서 초보 개발자들에게 큰 진입장벽인 POM 설정을 도와준다.
- 기존에 사용하지 않지만 호환성을 위해 남겨져있던 Deprecated Package 들이 제거되었으며 Hibernate 3.6 이상, EhCache 2.1 이상, Groovy 1.8 이상, Joda-Time 2.0 이상 등 새로운 Dependency 들에 대해 지원한다.
- Java6, Java7, Java8 의 고유 기능들에 대해 지원한다. 람다식, Optional, Callback Interface 등의 기능을 Spring framework 레벨에서 사용할 수 있다.
- Java EE 6, 7 에 대해 고려되어 있다. JPA 2.0 과 Servlet 3.0 에 대한 지원이 포함되어 있다는 뜻이다.
- Groovy 를 이용한 Bean 설정이 가능하다. 자세한 사용법은 GroovyBeanDefinitionReader 문서를 참조하자.
- Core 컨테이너들의 기능 지원이 확대되있다. 먼저 Repository 들이 좀 더 쉽게 Inject 될 수 있으며, 각종 Metadata Annotation 들을 이용한 Custom Annotation 작성이 가능하다. @Lazy 를 이용한 Lazy Injection 이나 @Order 을 통한 Ordered Interface, @Profile 을 통한 프로필 버전 관리가 쉬워졌다.
- Web 을 개발하기 위한 도구들이 생겼다. @RestController 같은 것들이 그것이다.
- Web Socket 이나 STOMP 등의 프로토콜을 같이 지원한다.
- 테스트 환경이 개선되었다. Framework 레벨에서 Mock 을 위한 ServletContext 를 별도로 지원한다.
Spring 5.0
Spring 5.0 은 JDK 8+, 9 등에 대해서 지원하며 Java8을 표준으로 사용한다.
- 코어로직에 있어서 JDK 8의 특징들이 강화되었다.
- HTTP 메시지 코덱의 XML과 JSON 지원에 대한 구현이 Encoder 와 Decoder 의 사용을 통해 추상화 되었다.
- 웹에 대한 지원이 향상되었다. 특히 Protobuf 3.0 지원이 적용되었다.
MVC1
웹브라우저 요청을 JSP가 처리, JSP가 Controller와 view 기능 모두 담당합니다.
쉽게 말씀드리면, 하나의 jsp페이지 내에서 controller는 자바, view는 html, css 이벤트는 자바스크립트를 사용합니다.
Model은 jdbc 인터페이스로 DB 조작하면서 class를 정의합니다.장점
페이지 흐름이 단순하고 구조가 간단하여 중소형 프로젝트에 적합합니다.단점
유지보수가 어려워서 웹 규모가 커질수록 복잡해집니다.
개발자와 디자이너 역할 분담이 어려워서 원할한 의사소통이 필수입니다.
규모가 작고 유지보수 적은 경우 채택이 필요합니다.
MVC2
웹 브라우저 요청을 controller에서 처리합니다.
controller는 요청에 대한 로직처리를 model로 보내고, model은 결과를 view로 보내여 사용자에게 응답하게 됩니다.
model은 mvc1, mvc2 모두 동일합니다.
view는 jsp로 구성되어 있으며, 자바는 포함되지 않고 jstl을 사용해 결과를 표현합니다.장점
유지보수, 확장에 용이하며 controller와 view의 분리로 명료한 구조를 가집니다.
개발자와 디자이너 역할 분담이 확실합니다.단점
구조 설계를 위한 시간이 많이 소요되어 개발이 어렵습니다.
높은 수준의 이해도가 필요하여 개발팀 팀원의 수준이 높아야 합니다.
규모가 크고 유지보수 많은 경우 채택 필요합니다.
ORM은 Object Relational Mapping의 약자로, 관계형 데이터베이스를 OOP언어로 변환해주는 기술입니다. 그래서 비즈니스 코드가 DB 테이블에 바로 접근하게 도와줍니다.
JPA는 ORM을 위해 자바에서 제공하는 API입니다. 자바 객체와 DB 테이블을 매핑하는데요. 구현체로는 하이버네이트가 있습니다.
장점으로는, 비즈니스 로직에 집중하고 객체중심의 개발을 할 수 있게 됩니다. 그리고 메소드를 호출하는 것만으로 쿼리를 수행해서 생산성이 향상되고, 유지보수 비용이 줄어듭니다. 그리고 특정 DB에 의존하지 않게 됩니다.
하지만 단점으로는, 직접 SQL을 호출하는 것보다는 조금 느리구요. 그리고 복잡한 쿼리같은 것은 메소드로 처리가 힘듭니다.
객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀더 쉽게 할 수 있게 도와주는 개발 프레임워크로써 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거 합니다. MyBatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있습니다.
요약
자바의 관계형 데이터베이스 프로그래밍을 좀더 쉽게 만들어주는 개발 프레임워크이고 SQL쿼리문과 프로그램 코드를 분리할수 있다는 장점을 가집니다.
JPA(ORM)
- 장점
- RDB에 종류와 관계없이 사용 가능하다. 추후 DB 변경이나 코드 재활용에 용이하다.
- 기본적인 CRUD 제공과 페이징 처리 등 상당 부분 구현되어 있어 비지니스 로직에 집중할 수 있다.
- 테이블 생성, 변경 등 엔티티 관리가 간편하다.
- 쿼리에 집중할 필요 없어 빠른 개발이 가능하다.
- SQL을 몰라도 된다는 뜻은 아니다. JPA는 SQL을 잘할수록 훨씬 더 잘 사용할 수 있다.
위 말의 뜻은 select * from user 같은 쿼리를 직접 작성할 필요 없이 Java 코드로 간편하게 사용할수 있다는 뜻
- 단점
- 어렵다.
: 단방향, 양방향, 임베디드 관계 등 이해해야할 내용이 많으며, 연관관계 이해 없이 잘못 코딩 했을 시 성능상의 문제와 동작이 원하는대로 되지 않는 일이 발생한다.
ex) Board 엔티티에 List의 형태로 Reply 엔티티가 있을 시, 단방향 연관관계인 경우 하나의 reply가 변경되어도 모두 삭제되고 다시 전부 insert되는 경우
하나의 Board 조회 시 reply를 Join이 아닌 여러개의 select문으로 하나하나 읽어오는 문제
MyBatis(SQL Mapper)
- 장점
- JPA에 비해 쉽다.
: SQL 쿼리를 그대로 사용하기에 복잡한 Join, 튜닝 등을 좀더 수월하게 작성 가능하다.- SQL의 세부적인 내용 변경 시 좀 더 간편하다.
- 동적 쿼리 사용 시 JPA보다 간편하게 구현 가능하다.
- 단점
- 데이터 베이스 설정 변경 시 수정할 부분이 너무 많다. (Oracle의 페이징 쿼리를 MySQL에서 사용 불가능!)
- Mapper작성부터 인터페이스 설계까지 JPA보다 많은 설계와 파일, 로직이 필요하다.
- 특정 DB에 종속적이다.
Spring JDBC는 JDBC의 모든 저수준 처리를 스프링 프레임워크에 위임하므로써, Connection 연결 객체 생성 및 종료, Statement 준비/실행 및 종료, ResultSet 처리 및 종료, 예외 처리, 트랙잭션 등의 반복되는 처리를 개발자가 직접하지 않고 Database에 대한 작업을 수행할 수 있습니다.
SQL Query 수행하기 위해 필요한 저수준 작업을 내부적으로 처리해주고 보다 추상적인 기능을 제공하는JdbcTemplate, SimpleJdbcInsert, NamedParameterJdbcTemplate 객체와 Helper 객체(RowMapper) 등을 포함한다.
따라서,
JdbcTemplate 등의 객체를 이용하면 Connection 연결/종료와 같은 세부적인 작업을 직접 처리하지 않아도 된다.
또한,
JDBC에서 발생하는 에러는 Runtime Exception이다. 따라서, 이를 일반 예외(Exception)로 감싸 처리해주어야 하는데 Spring JDBC는 이를 내부적으로 커스텀한 일반 예외로 변환해 전파해준다.
DAO(Data Access Object)
데이터 사용기능 담당하는 클래스 입니다. DB 데이터 조회나 수정, 입력, 삭제와 같은 로직을 처리하기 위해 사용합니다. DAOInterface/DAOImplement 로 구분지어 명세와 구현 분리하며 개발합니다. 만약 Mybatis연동 때처럼 Interface만 필요한 경우 그냥 DAO라고 명시할 수 있습니다.DTO(Data Transfer Object)
데이터 저장 담당 클래스입니다. Controller, Service, View처럼 계층 간의 데이터 교환을 위해 쓰입니다. 로직을 갖고 있지 않으며 순수한 데이터 객체이며 getter, setter 메소드만을 갖고 있습니다.VO(Value Object)
값 오브젝트로써 값을 위해 쓰입니다. read-Only 특징(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)을 가집니다. DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있습니다.
Framework란 소프트웨어 환경에서 복잡한 문제를 해결하거나 서술하는데 사용되는 기본 개념 구조입니다. 뼈대가 되는 부분을 미리 구현한 클래스, 인터페이스 , 메소드 등의 모음이라고 할 수 있습니다. 프레임워크는 설계자가 의도한 여러 디자인 패턴으로 구성되어 있습니다. 따라서 개발자가 에플리케이션의 구조적 설계를 신경 쓸 필요가 없습니다. 또한 일정 수준 이상의 품질을 보증하는 코드를 비교적 빠르고 편하게 완성 및 유지보수할 수 있는 솔루션이라고 할 수 있습니다.
라이브러리와 프레임워크는 애플리케이션의 틀과 구조를 결정한다는 측면에서 활용도가 상당히 유사하나 라이브러리는 특정 기능이 필요할 때 호출해서 쓰는 도구 모음입니다. 프레임워크가 큰 뼈대는 이미 잡혀있고 그 안의 내용물을 채우는 느낌이라면 라이브러리는 개발자가 호출해서 능동적으로 사용하는 것이라고 볼 수 있습니다. 즉, 프레임워크는 꼭 써야되는 것과 지켜야되는 룰이 있는 반면 라이브러리는 쓰든 안쓰든 개발자 마음대로 할 수 있다는 점에서 차이가 있습니다.
(+) Spring Framework
특징
AOP는 Aspect Oriented Programming의 약자로, 관점 지향 프로그래밍이라고 합니다. 애플리케이션의 핵심적인 기능과 부가적인 기능을 분리해 Aspect라는 모듈로 만들어 설계하고 개발하는 방법입니다. OOP는 Object Oriented Programming의 약자로 객체 지향 프로그래밍이라고 합니다. OOP와 AOP는 서로 상반되는 개념은 아니며 오히려 OOP를 더욱 OOP답게 사용할 수 있도록 하는 것이 AOP입니다.
공통적 기능을 모든 모듈에 적용하기 위한 방법으로 상속을 이용하는데 Java에서는 다중 상속이 불가능합니다. 그리고 기능 구현 부분에서 핵심 코드와 공통 기능 코드가 섞여있어서 보기에도 불편하고, 효율성이 떨어집니다. 이러한 이유로 AOP가 등장했습니다.
💡 주요 용어