Spring Framwork

EUNJI LEE·2023년 7월 14일
1

Spring

목록 보기
2/13
post-custom-banner

Spring Framwork

Java 플랫폼을 위해 만들어진 오픈 소스 어플리케이션 프레임 워크로 스프링(Spring)이라고도 부른다. 동적인 웹 사이트를 개발하기 위한 여러가지 서비스들을 제공한다.

스프링 프레임 워크는 자바 객체를 담고 직접 관리한다. 객체의 생성과 소멸, 라이프 사이클을 관리하고 스프링 컨테이너로부터 필요한 객체를 가져와 사용할 수도 있다.

Spring 특징

✅ IOC (제어 반전)

스프링 프레임워크는 IOC 기반의 프레임워크라고 한다. IOC는 Inversion of Control의 약자로 제어의 역전이라는 뜻인데 일반적으로 여태 만들어왔던 프로젝트들이 사용자가 객체를 결정해서 생성하고 의존성 객체 생성, 실행할 메소드를 직접 지정해서 사용자가 전부 컨트롤 했다면 스프링 프레임워크는 이런 것들을 스프링에게 위임하여 스프링이 직접 제어하도록 하는 것이다.

✅ DI (의존성 주입)

스프링은 설정 파일(xml)이나 어노테이션을 통해서 객체 간의 의존 관계를 설정한다. 때문에 개발자가 직접 의존 객체를 생성할 필요가 없어진다. 의존성을 주입하면 설정된 클래스 간의 의존 관계를 바탕으로 컨테이너가 자동으로 연결해주게 된다. ➡️ IOC와 연관된다.

✅ AOP (관점 지향 프로그래밍)

AOP는 Aspect Oriented Programming의 약자로 스프링에서는 트랜잭션, 로깅, 보안 등 여러가지 모듈, 계층에서 공통적으로 필요로 하는 기능을 따로 분리해서 관리한다.

Java로 개발하는 것 역시 객체 지향 프로그래밍(OOP : Object Oriented Programming)으로 관심사가 같은 데이터를 한 곳에 모아서 분리하고 결합도를 낮춰서 독립적이고 유연한 모듈로 캡슐화 해서 프로그래밍 한다. 하지만 이렇게 분리하는 과정에서 중복되는 부분들은 각 기능마다 똑같이 구현해야 하는 비효율적인 문제가 발생하는데 AOP는 공통된 부분은 분리 시키고 필요한 시점에 공통 로직을 가져다 사용함으로써 중복 코드를 제거할 수 있다.

✅ POJO

Plain Old Java Object의 약자로 평범한 자바 객체라는 뜻을 가진다. POJO는 setter, getter를 가진 단순한 자바 객체로 보는데 이런 단순한 객체는 의존성이 없기 때문에 유지 보수에 있어서 편리하다는 장점을 갖게 된다. 이런 장점으로 객체 지향적인 다양한 설계에 도움을 주게 된다. 스프링은 이런 POJO 기반의 프레임워크로 POJO를 지원한다.

✅ JDBC

스프링은 MyBatis나 Hibernate 등의 데이터베이스를 처리하는 영속성 프레임워크와 연결할 수 있는 인터페이스를 제공한다.

✅ MVC

스프링은 MVC 디자인 패턴을 통해서 웹 어플리케이션의 Model, View, Controller 사이의 의존 관계를 DI 컨테이너에서 개발자가 아닌 서버가 객체를 관리하도록 하는 웹 어플리케이션을 구축했다.

✅ PSA

PSA는 Portabl Service Abstraction의 약자다. 스프링에서 여러 모듈을 사용할 때 별도의 추상화 레이어를 제공하는데 스프링을 사용하면서 JPA를 사용한다고 하더라도 Spring JPA를 사용해서 추상화 하게 되므로 구현할 때 개발자가 EcilpseLink나 Hibernate 중 어떤 것을 사용한다고 해도 모듈의 의존 없이 프로그래밍을 가능하게 하는 것이다. 이런 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는데 이것을 서비스 추상화라고 한다.

스프링 동작 구조

가장 먼저 web.xml을 구동하게 되는데 web.xml에는 상단에 가장 먼저 실행되는 Context Listener가 등록되어 있다.

<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring/root-context.xml
		</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

여기서 <cotext-param>에 등록한 매핑된 root-context.xml 파일을 찾는다.

root-context.xml 파일을 처리하고 나면 파일에 등록되어 있는 Bean(객체)들을 실행한다. root-context.xml이 처리된 후에는 DispatcherServlet이라는 서블릿과 관련되어 설정이 작동한다.

DispatcherServlet은 내부적으로 웹 관련 처리의 준비 작업을 진행한다. 내부적으로 웹 관련 처리의 준비 작업을 진행하기 위해 사용하는 파일이 있고 servlet-context.xml이다.

servlet-context.xml을 로딩하고 해석하면서 등록된 Bean(객체)들을 기존에 만들어진 Bean(객체)들과 같이 연동하게 된다. 이 때, servlet-context.xml을 로딩하고 해석할 때는 XmlWebApplicationContext라는 객체를 이용한다.

그러고 나면 HandlerMapping에서 처리를 담당할 Controller 객체를 찾는데 HandlerMapping 인터페이스를 구현한 여러 객체 중 @RequestMapping이라는 어노테이션이 적용된 것을 기준으로 판단한다.

실행할 컨트롤러를 찾았다면 HandlerAdapter를 이용해서 해당 컨트롤러를 동작 시킨다.

컨트롤러에서는 데이터를 받은 다음 Service로 가서 비즈니스 로직을 통해 DAO, DTO를 이용해 DB와 연결해 원하는 결과를 가지고 다시 Service에서 가져오고 Controller에서는 Service로부터 얻은 결과를 통해 View를 결정해준다.

그 결과를 ViewResolver가 리턴 값을 받아서 설정된 상태로 처리하게 된다. 보통 리턴값은 String을 사용해서 아래와 같은 ViewResolver를 servlet-context.xml에 등록해놓고 화면 전환에 사용한다.

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<!-- 반환된 String 앞에 value값을 붙인다, -->
		<beans:property name="suffix" value=".jsp" />
		<!-- 반환된 String 뒤에 value값을 붙인다, -->
	</beans:bean>
profile
천천히 기록해보는 비비로그
post-custom-banner

0개의 댓글