Back-end

[Java:Spring Framework] 01. 스프링의 개념

Kamea 2022. 12. 17. 15:53

⭐️ 프레임워크 vs 라이브러리

 

프레임워크 : 뼈대나 기반구조 → 흐름을 프레임워크가 쥐고 있음
라이브러리 : 단순 활용 가능한 도구들의 집합 → 흐름을 사용자가 쥐고 있음

 

프레임워크는 가져다가 사용한다는 개념보다는 프레임워크에 들어가서 사용한다는 느낌/관점으로 접근할 수 있다.

라이브러리는 사용자가 가져다가 사용한다는 개념이다.

 

프레임워크는 변경이 어렵기 때문에 자신이 원하는 프레임워크를 제대로 가져다 쓸 수 있어야 한다. 


⭐️ Spring Framework란 무엇이고 왜 사용하는가

 

스프링 프레임워크는 자바 어플리케이션을 개발할 때 구조적 기능 틀을 제공하는 오픈소스 어플리케이션 프레임워크이다.

백엔드 코드를 구축할 때 프레임워크 없이 개발하려면 Servlet, JDBC 설정 등을 직접 모두 해야 하지만(heavyweight) 이러한 설정이 미리 되어있음으로 번거러움을 줄일 수 있기에 사용한다.(lightweight) 

 

약간 이런 느낌임. 

Spring "기본적인 틀은 우리가 줄 테니깐 너는 개발 로직만 (제대로) 짜~~ (친절)"

 

 

 

 

 

 

 

⭐️ Spring Framework의 특징

1. IoC (Inversion Of Control) : 제어 역전

Spring Framework에 역할(객체 관리)을 맡겨 주는 것

 

2. DI (Dependency Injection) : 의존성 주입

의존 관계 객체를 자동으로 주입하는 것으로 크게 3가지의 주입 방법이 있다.

(1) xml 주입

 

Book dto1 = new Magazine();
dto1.setXXXx(xxx);

Book magazine = new Magazine("a", "b"); // 생성자 중복 정의

// 다형성
Book magazine = new Magazine("a", "b");
Book comicBook = new ComicBook("a", "b");

BookDao dao = BookDao.getInstance();  // 싱글톤 - 하나의 객체

request.setAttribute(K, V);
session.setAttribute(K, V);

 

<beans>
	<!-- bean 필수 속성 : id, class -->

	<!-- 기본 생성자 injection -->
	<bean id="" class="" scope="singleton|prototype|request|session" />

	<!-- parameter 전달 생성자 injection, 선언 순서대로 값 전달, index="전달순서" -->
	<bean id="" class="">
		<!-- 문자열 값 : value, 빈 객체 id : ref -->
		<constructor-arg value="데이터" [index="0"] />
		<constructor-arg ref="" [index="1"] />
	</bean>

	<!-- parameter 전달 생성자 injection, 선언 순서대로 값 전달, index="전달순서" -->
	<bean id="" class="">
		<property name="멤버변수명" value="데이터" />
		<property name="멤버변수명" ref="빈객체_id" />
	</bean>

</beans>

 

bean 태그의 scope 사용 예제

더보기
scope=&rdquo;singleton&rdquo; 객체 출력 결과 &rarr; singleton이기 때문에 동일한 객체
scope=&rdquo;prototype&rdquo; &rarr; 다른 참조값

 

 

(2) 어노테이션(spring-context가 있어야 사용 가능, bean config.xml)

base-package에 지정한 패키지에 있는 클래스들 중 bean 설정(어노테이션)이 있는 클래스를 찾아감(스캐닝)

@Component : 사용자가 작성한 bean 객체
@Autowired : @Component 빈 객체에서 의존관계 객체 자동 주입
<context:component-scan base-package="com.ssafy.ws" />

<!-- 패키지를 여러개 가져올 경우 : 구분자가 , 임 --> 
<context:component-scan base-package="com.ssafy.ws, com.ssafy.model" />

 

applicationContext.xml의 네임스페이스에서 설정 가능

 

 

(3) configuration java class 에 코드 작성

 

 

 

 

 

 

⭐️ Spring Framework Web MVC 환경 설정

Web MVC Framework

더보기

MVC 구조 관계

 

 

MVC 구성 요소

DispatcherServlet  : Controller 에게 클라이언트 요청 전달 & Controller 리턴 결과 값을 view에 전달해 알맞은 응답 생성

HandlerMapping : 요청 매핑(어떤 controller가 처리할지 결정)

Controller : 요청 처리 후 Model 호출

ModelAndView : 응답을 위한 설정 객체

ViewResolver : View 객체 생성

View : 실제 응답 화면

 

 

 

MVC 요청 흐름

 

[1] DispatcherServlet 요청 수신(단일 Front Controller Servlet) → 요청을 수신하여 처리를 다른 컴포넌트에 위임 → 어느 Controller에 요청을 전송할지 결정

[2] DispatcherServlet은 Handler Mapping에 어느 Controller를 사용할 것인지 문의 → URL과 Mapping

[3] DispatcherServlet은 요청을 Controller에게 전송하고 Controller는 요청을 처리한 후 결과 리턴 → Business Logic 수행 후 결과 정보(Model)가 생성되어 JSP와 같은 view에서 사용됨

[4] ModelAndView Object에 수행 결과가 포함되어 DispatcherServlet에 리턴

[5] ModelAndView는 실제 JSP정보를 갖고 있지 않으며, ViewResolver가 논리적 이름을 실제 JSP이름으로 변환

[6] View는 결과 정보를 사용하여 화면을 표현함

 

 

web.xml : web application 관련 설정(DispatchServlet)

root-context.xml : 웹 이외(servlet 이 아닌) 관련 설정 + Model(DB) 관련 설정

servlet-context.xml : 웹 관련 설정

log4j.xml : 로깅 환경 설정 → 로그 레벨 설정 (<logger> 안의 <level value="사용할 레벨">)

 

 

 

 

 

 

 

 

⭐️ 로깅(Logging)

// 현재 클래스에서 사용하기 위한 로거 객체 생성
private static final Logger logger = LoggerFactory.getLogger(클래스명.class);

// 로그 메세지 출력
logger.info("메세지");
logger.info("{}, {} 메세지", arg1, arg2);
logger.info("Welcome home! The client locale is {}.", locale);

 

로깅 레벨

fatal : 심각
error : 오류
warn : 경고
info : 정보(권장)
debug : 개발 시 디버깅 목적

 

 

 

 

 

 

 

⭐️ Filter

POST 요청 시 한글 인코딩이 깨질 경우에 설정

 

<!-- web.xml > listener 뒤에 filter add -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>