본문 바로가기
백수/Spring

Spring 기초

728x90
반응형

Spring란
자바의 웹 프레임 워크로 자바언어를 기반으로 사용됩니다.
자바로 다양한 애플리케이션을 만들기 위한 프로그래밍 툴이라고 생각하면 됩니다.
Spring를 사용하면 중복 코드의 사용을 줄이고 비즈니스 로직을 더 간단하게 사용 가능 합니다.
또 다른 사람의 코드를 참조하여 사용하기 편리함으로 오픈 소스를 사용하기 좋은 구조를 가지고 있습니다.
간단히 Spring는 자바를 쉽게 사용할 수 있게 해주는 오픈 소스 프레임워크입니다.

프레임워크란 
소프트웨어 개발에 있어서 하나의 뼈대의 역할을 하는 것입니다.
자주 쓰이는 기능을 한 곳에 모아 놓은 클래스들의 집합니다.

특징
POJI
프레임워크로서 일반적인 J2EE 프레임워크에 비해 특정 라이브러리를 사용할 필요가 없어
개발이 비교적 간단하고 기존 라이브러리의 지원이 용이합니다.
단순 자바 오브젝트로 의존성이 없으며 간결한 코드를 작성 가능합니다.
특별한 클래스, 인터페이스를 구현하지 않아도되 자유롭게 코드를 작성할 수 있습니다.
의존성이 줄어들어 테스트, 유지 보수가 편리한 유연성을 가집니다.

관점지향프로그래밍(AOP)
코드를 작성하는 경우 다수의 모듈에 공통적으로 나타나는 부분이 존재하는데 이를 횡단 관심사라 합니다.
모듈 각각 고유한 로직을 핵심 관심사라 하고 모듈을 구성하고 있는 코드는 핵심관심사와 횡단관심사가 합쳐진 것입니다.
트랜잭션, 로깅, 보안 등 여러 모듈, 여러 계층에서 적용되며 이런 코드들을 실제 비즈니스 로직과 분리할 수 있도록 도와줍니다. 

AOP 주입 방법
XML을 이용한 AOP
어노테이션을 이용한 AOP
 - @Aspect 어노테이션은 클래스를 AOP에서 사용하겠다는 의미이며 @Before 어노테이션은 대상 메서드 실행 전에 이 메서드를 실행하겠다는 의미

의존성 주입(DI)
객체간의 의존관계를 관리하는 기술이라 생각하면 됩니다.
의존성 관계란 객체와 객체의 결합 관계입니다.
어떤 객체가 필요로 하는 객체를 자기 자신이 직접 생성하는 것이 아니라, 외부에 있는 다른 곳에서 자신이 필요로 하는 객체를
주입받는 것을 말합니다.
각 객체가 서로 의존하는 관계가 될 수 있도록 의존성을 주입하면 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 빈설정
정보를 바탕으로 컨테이너가 자동으로 연결해 줍니다.

의존성 개입(DL)
컨테이너에서 객체를 관리하기 위해 별도의 저장소에 빈을 저장하고 개발자들은 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 빈을 검색합니다.

의존성을 주입하는 방법
XML을 통한 의존성 주입
생성자를 통한 의존성 주입
 - 생성자에 인자로 주입하고자 하는 객체를 넣어 줍니다.
 - 스프링 설정 파일에서는 <constructor-arg> 태그와 ref 속성을 이용합니다.
속성을 통한 의존성 주입
 - 내부적으로 set method를 사용합니다.
 - 스프링 설정 파일에서는 <property> 태그를 사용해야 하며 name 속성값이 호출하고자하는 메서드의 

   이름이어야 합니다.
 - name에는 변수명을 적어주면 스프링에서 name에는 변수명을 적어주면 스프링에서 name의 첫 글자를 대문자로 바꾸고
   앞에 set 키워드를 붙여 set method를 실행합니다.
어노테이션을 통한 의존성 주입
 - 스프링에서는 @Autowired 라는 어노테이션을 통해 의존성을 주입합니다.
 - @Autowired는 속성의 설정자 메서드에 해당하는 역할을 자동으로 수행됩니다.
 - 이와 비슷한 역할을 하는 자바 어노테이션으로 @Resource 어노테이션입니다.
 - 차이점으로는 bean을 탐색할 때 우선순위로 하는 기준이 어떤 것이냐 입니다.

제어반전(loC)
컨트롤의 제어권이 개발자가 아니라 프레임워크에 있음을 말하면 
객체의 생성부터 모든 생명주기의 관리까지 객체의 제어원이 바뀐것을 의미합니다.
IoC컨테이너는 다른 용어로 빈 팩토리 애플리케이션 컨텍스트라고도 불림
스프링의 IoC컨테이너는 일반적으로 애플리케이션 컨텍스트라고 말함


IoC컨테이너란
어떠한 객체의 명세서를 작성하고 스프링 라이브러리는 해당 명세대로 객체를 생성
생성된 객체 들을 보관하는 공간을 의미

EJB / Enterprise Java Bean (엔터프라이즈 자바빈) 
효율적으로 서버 관리를 해주고 프로그램 관련 문제들을 알아서 처리해 준다는 개념
연결관계가 복잡하고 무겁고 독립적이지 못함

PSA
일관성 있는 서비스 추상화 입니다.
스프링 프레임워크에서는 서비스 추상화를 위해 다양한 어댑터를 제공합니다.
스프링의 경우 OXM, ORM, 캐시, 트랜잭션 등 다양한 기술에 대한 PSA 즉 API를 제공합니다.

모듈
Spring-core
ioc 컨테이너와 DI를 구현하는 코드 포함
코어 컨테이너의 주요 컴포넌트는 Bean-Factory이다
Spring-core 바로 위에 있으면서 Spring-core에서 지원하는 기능 외에 추가적인 기능들과 좀 더 쉬운 개발이 가능하도록 

지원 유저 인터페이스 및 타당성 검증이라는 애플리케이션의 기반 성능, JNDI, EJB의 지원, 메일 송수신 기능 등을 지원
Spring-context
스프링 IoC컨테이너를 사용하여 개발을 지원하는 모듈
Spring을 컨테이너로 만든 것이 핵심 모듈의 BeanFactory라면 Spring을 프레임워크로 만든 것이 콘텍스트 모듈입니다.
이 모듈은 국제화된 메시지, 애플리케이션 생명주기 이벤트, 유효성 검증 등을 지원함으로써 BeanFactory의 개념을 확장 합니다.
Spring-aop
aop를 지원하는 모듈로 애플리케이션 전반에 걸쳐 반복적으로 발생하는 로직들을 모듈화해서 관리할 수 있도록 도와줌
Spring 기반 애플리케이션에서 객체에 트랜잭션 관리 서비스를 제공합니다.
EJB 컴포넌트에 의존하지 않고도 선언적 트랜잭션 관리를 애플리케이션과 결합이 가능 합니다.
Spring-dao
추상 레이어는 다른 데이터베이스 벤더들의 예외 핸들링과 오류 메시지를 괸라하는 중요한 예외 계층을 제공합니다.
이 예외 계층은 오류 핸들링을 간소화하고 예외 코드의 양도 줄여줍니다.
데이터베이스와의 통신을 담당하는 객체이고 애플리케이션과 데이터베이스 사이의 인터페이스 역할 담당
Spring-orm
객체 관계형 도구를 사용할 수 있도록 지원
하이버네이트, jpa, mybatis 등과의 연동을 지원 기능 제공
Spring-web
웹 개발에 필요한 기능 지원
Spring-mvc
웹 프레임워크로 mvc를 통해 웹 개발을 하면 클라이언트에서 요청한 uri를 처리하고 필요한 모델 데이터를
가져와 뷰에 전달하는 것까지 간단하게 처리 가능
Spring-beans
Bean 클래스와 BeabFactiry 인터페이스 제공
스프링 컨테이너를 이용해서 객체를 생성하는 기본 기능을 제공

구성요소
ServletContainer (서블릿 컨테이너)
Client로 부터 http요청을 받아 서블릿 로직을 처리할 수 있는 구성요소입니다.

서블릿 이란
javax.servlet 패키지에 정의된 인터페이스로 자바 class 파일로 된 서버로직이라고 볼 수 있습니다.
대표적으로 Tomcat가 있습니다.

DispatcherServlet (디스패처 서블릿)
Spring framework (스프링 프레임워크)에서 front controller역할을 합니다.
실제 동작하기 위한 로직 요청에 대해 처리할 수 있도록 해줍니다.
요청이 오면 실제로 로직을 수행할 컴포넌트로 요청을 보내주는 역할을하고 반환을 받는 역할 입니다.
다른 웹 프레임워크들에서 사용되는 Front Controller의 역할을 한다.
가장 앞단에서 클라이언트의 요청을 처리하는 Controller로써 요청부터 응답까지 전반적인 처리 과정을 통제한다.

HandlerMapping (핸들러 매핑)
스프링 프레임워크에 작성된 여러 Controller(컨트롤러) 중에서 로직을 수행할 컨트롤러를 확인해주는 컴포넌트 입니다.
DispatcherServlet가 전달해준 HTTP 요청을 처리하고 결과를 Model에 저장합니다.

ModelAndView
Controller에 의해 반환된 Model과 View가 Wrapping 된 객체입니다.
말 그대로 Model, View가 같이 들어 있는 객체라고 생각 가능 합니다.

Controller(컨트롤러)
개발자가 직접 개발하는 컴포넌트로, http request를 개발자가 처리할 수 있도록 개발하는 컴포넌트 입니다.

Service(서비스)
개발자가 직접 개발하는 컴포넌트로 비지니스 로직을 수행하는 컴포넌트 입니다.

DAO
개발자가 직접개발하는 컴포넌트로, Database에 직접적을 접근하는 객체 입니다.

ViewResolver (뷰 리졸버)
ViewName을 기반으로 어떤 View 파일을 사용할것인지 확인해주는 컴포넌트입니다.
ModelAndView를 처리하여 View를 그리는 역할 입니다.
Model에 저장된 데이터를 사용해 View를 그리고 사용자는 그 View를 보게 됩니다.

View (뷰)
개발자가 직접개발하는 컴포넌트로, 보통 UI화면을 의미합니다.

동작 구조
1. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회 합니다.
2. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회 합니다.
3. 핸들러 어댑터 실행 : 핸들러 어댑터를 실행합니다.
4. 핸들러 실행 : 핸들러 어댑터가 실제 핸들러를 실행합니다.
5. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 요청을 처리하고 반환하는 정보를 ModelAndView로 변환해서 반환합니다.
6. ViewResolver 호출 : ViewResolver를 찾고 실행합니다.
7. View 반환 : ViewResolver는 View의 논리 이름을 물리 이름으로 변경하고 렌더링 역할을 담당하는 View 객체를 반환합니다.
8. View 렌더링 : View를 통해서 View를 렌더링합니다.

핸들러 매핑 vs 핸들러 어댑터
핸들러 매핑이란
DispatcherServlet이 요청에 맞는 핸들러를 찾는 과정 입니다.

핸들러 어댑터란
핸들러 매핑에서 찾은 핸들러 객체를 다룰 수 있는 어댑터 입니다.

다양한 핸들러의 return 타입은 String, ModelAndView 등 다양하며, Parameter로 들어오는 값도 HttpServletRequest로 받거나 
HttpServletResponse로 받는 등 다양한 형식으로 받을 수 있습니다.

컨테이너랑
특정 객체의 생성과 관리를 담당하면 객체 운용에 필요한 다양한 기능을 제공합니다.
애플리케이션 운용에 필요한 객체를 생성하고 객체 간의 의존관계를 관리한다는 점에서 스프링도 일종의 컨테이너라고 할 수 있습니다.

--------------------------------------
스프링 컨테이너
자바 객체의 생명 주기를 괸리하며 생성된 자바 객체들에게 추가적인 기능을 제공합니다.
스프링에서 자바 객체를 빈(Bean)이라 합니다.
즉 스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈을 생성,관리,제거 등)하며 생성된 빈에게 추가적인 기능을 제공하는 것 입니다.
스프링 컨테이너는 xml, 어노테이션 기반의 자바 설정 클래스로 만들수 있으며
스프링 부트를 사용하기 이전에는 xml을 통해 직접적으로 설정해야 했지만 스프링 부트가 등장하며 대부분 미사용합니다.

스프링 컨테이너 종류
빈의 생성과 관계 설정 같은 제어를 담당하는 IoC 오브젝트이고 빈 팩토리를 좀 더 확장한것 이 애플리케이션 컨텍스드 입니다.
애플리케이션 컨텍스트는 IoC 방식을 따라 만들어진 일종의 빈 팩토리로 둘 다 동일한 개념이라 생각 가능합니다.
Beanfactory
스프링 컨테이너의 최상위 인터페이스입니다.
빈을 등록 생성 조회 등의 빈을 관리하는 역할을 하며 getBean 메서드를 통해 빈을 인스턴스화 할 수 있습니다.
@Bean 어노테이션을 사용해 메서드의 이름을 스프링 빈의 이름으로 사용하여 빈 등록을 합니다.

ApplicationContext
빈 팩토리의 기능을 상속받아 제공합니다.
빈을 관리하고 검색하는 기능을 빈 팩토리가 제공하고 그 외의 부가 기능을 제공합니다.

스프링 컨테이너의 기능
빈의 인스턴스화, 구성, 전체 생명 주기, 제거까지 관리합니다.
 - 컨테이너는 개발자가 정의한 빈을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공합니다.
스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있습니다.
의존성 주입(DI)를 통해 애플리케이션의 컴포넌트를 관리할 수 있습니다.
스프링 컨테이너는 서로 다른 빈을 연결하여 애플리케이션 빈을 연결하는 역할을 합니다.
 - 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있습니다.
 - 메서드가 언제 어디서 호출되어야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않습니다.

스프링 컨테이너를 사용 이유
객체 간의 의존성을 낮추어(느슨한 결합) 결합도는 낮추고, 높은 캡슐화를 위해 스프링 컨테이너가 사용됩니다.
기존의 방식으로는 새로운 기능이 생기게 되며 변경 사항들을 수작업으로 수정해야합니다.
프로젝트가 커질수록 의존도는 높아질 것이고 그에 따라 코드의 변경도 많아질 것입니다.
스프링 컨테이너를 사용하면 구현 클래스에 있는 의존성을 제고하고 인터페이스에만 의존하도록 설계 가능 합니다.

728x90
반응형

'백수 > Spring' 카테고리의 다른 글

ORM(Object Relation Mapping)  (0) 2023.07.14
영속성(Persistence)  (0) 2023.06.20
Spring 프레임워크  (0) 2023.05.31
어노테이션 기초 정리  (0) 2023.05.30
스프링이란  (0) 2022.10.06