[Java:Spring Framework] 01. 스프링의 개념
⭐️ 프레임워크 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 사용 예제
(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" />
(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>