본문 바로가기
학원수업/3월

03/09 국비교육 개발자과정 70회차-Pojo를 Spring 으로 옮기기 Spring legacy

by 코딩마스터^^ 2023. 3. 9.

Spring 흐름도

.sp

Bean 

xml->태그->전체,컴파일 안한다. 버전관리 용이하다. 

 

servlet-context.xml--->controller의 짝

spring-service.xml---->로직

spring-data.xml-------->다오

 

데이터에 등록이 되어있는것은 자바이다.

xml과 자바 사이를 알아야한다.

스프링 쪽에서 타임 리프?

view.js를 쓸 수 밖에 없다. 아무도 옛날방식인 xml을  관리 안한다....

 

자바와 myBtis레이어와 연결하는것은 스프링이 된다. 

myBatis-spring.jar

 

servlet-context.xml 에 controller클래스를 등록 해놨다.

 

태그를 이용 할때에

id

class

type

이 올 수 있다.

클레스는 쿠현체 클래스만. type에는 추상클래스 인터페이스도 가능

servlet태그 안에 이름이 init-param

뒤에있는 확장자가 .sp면 web.xml통해서 DispatcherServlet이 나오고 서블렛을 통해서 Bean주 나온다...?

beans는 라이프 사이클을 관리 해 준다.

beanFactory - 게으른

applicationContext -이른 인스턴스화

 

BeanFactory가 부모이다.

자식이 더 누리는 것이 많다.

메소드와 필드를 더 많이 쓸 수 있다. 부모것도 쓰고 내것도 쓰기때문에.

 

Logic은 spring-service.xml에 등록한다. 뭘로? Bean으로

 

SqlSessionFactoryBean 

xml에서 써야된다.

그 정보도 data.xml 에 들어있다.

 Mybatis.config는 Spring-data.xml에서 주입된다.

 

Logic클래스가 컨트롤러로 주입되어야되고 Setter객체메소드로 주입된다.

setter의 이름은 Logic.

Dao도 Logic에ㅜ 객체 주입을 해줘야한다.

이를 스프링 프레임워크가 해준다.

 

 스프링 프레임워크의 심장이 컨테이너이다.

두가지 컨테이너로 의존성을 주입 한다.

제어의 역전이 일어났다. 

내 맘대로 할 수 없다. 스프링이 한다.

 

자바기반위에 servletAPI가 있어야한다.

그위에 DispatcherServlet이 있다....

 

 

[ Dispatcher-Servlet(디스패처 서블릿)의 장점 ]

Spring MVC는 DispatcherServlet이 등장함에 따라 web.xml의 역할을 상당히 축소시켜주었습니다. 과거에는 모든 서블릿을 URL 매핑을 위해 web.xml에 모두 등록해주어야 했지만, dispatcher-servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주고 공통 작업을 처리면서 상당히 편리하게 이용할 수 있게 되었습니다. 우리는 컨트롤러를 구현해두기만 하면 디스패처 서블릿가 알아서 적합한 컨트롤러로 위임을 해주는 구조가 되었습니다.

 

[ Dispatcher-Servlet(디스패처 서블릿)의 동작 방식 ]

앞서 설명한대로 디스패처 서블릿은 적합한 컨트롤러와 메소드를 찾아 요청을 위임해야 합니다. Dispatcher Servlet의 처리 과정을 살펴보면 다음과 같습니다.

https://mangkyu.tistory.com/18

 

[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정

이번에는 servlet의 심화 또는 대표주자인 dispatcher-servlet에 대해서 알아보도록 하겠습니다. 1. Dispatcher-Servlet(디스패처 서블릿)의 개념 [ Dispatcher-Servlet(디스패처 서블릿) 이란? ] 디스패처 서블릿의

mangkyu.tistory.com

 

 

 

 

Pojo를  Spring으로 이관하기

 

<!--  확장자가 sp로 끝나면 servlet url 안에 매핑한다
Pojo 하던걸 스프링으로 이관하고 싶다. 스프링은 Bean을 관리해준다. 객체를 인스턴스화 해준다. 하나는 게으른-beanFactory 인스턴스화 두번째는 이른 인스턴스화-어플리케이션 컨택스트
Dependency Injection 객체주입 해준다. 두 객체가 해줌 beanFactory application
* 다된다. 앞에 모든형식 다 와도 뒤에 .sp붙으면 된다. URL패턴.
메인메소드가 없으니까 웹에서 돌릴것다. 크롬에서 요청. 크롬에서 요청하려면 url알아야한다.
DispatcherServlet 즉, 스프링이 제공하는 클래스가 인터셉트한다.
 
 -->

xml중심으로 매핑을 할수도 있지만 이제는 스프링 어노테이션으로 한다.

 

외우기!!!!!

/*
 * IoC(inversion of Control)개념
 * :역제어란 객체의 생성 및 생명주시에 대한 제어권은 
 * 기존방식
 * 자바기반으로 어플리케이션을 개발할 때 자바 객체를 생성하고 서로간의 의존관계를 
 * 연결시키는 작업에 대한 제어권은 개발되는 어플리케이션에 있음
 * 
 * 문제제기
 * :컴포넌트 간의 결합도가 높아서 컴포넌트의 확장 및 재사용이 어려운 문제점 발생함
 * 
 * IoC사용시
 * 제어권이 Container에게 넘어가 객체의 생명주기를 Container가 전담하게 됨(예, 서블릿, EJB)
 * 장점 : 컴포넌트 간의 결합도가 낮아져 컴포넌트의 재사용 및 확장이 쉽고 컴포넌트의 의존관계 변경이 쉬움
 * 
 * spring Container는 BeanFactory와 ApplicationContext라는 두가지 유형의 컨테이너를 제공함
 * 
 * BeanFactory
 * : 객체를 관리하는 고급 설정에 기법 제공
 * :Spring-bean.jar에 속함
 * :Bean 들에 대한 생성 소며으 Life cycle과 같은 
 * 컨테이너가 빈을 관리하기 위해 필요한 기본적 기능 제공
 * 게으른....
 * LAZY LAODING
 * getBean()메소드가 호출 될 때까지 bean의 생성을 미룸
 * 
 * ApplicationContext
 * BeanFactory 가 제공하는 모든 기능을 제공함
 * Spring  의 AOP기능, 메세지 지원, 자원 핸들링, 이벤트 위임
 * 웹 어플리케이션에서 사용하기 위한 WebApplicationContext와 같은 특정 ApplicationContext와의 
 * 통합 기능을 추가 제공함
 * 이른 인스턴스화
 * Context를 시작할 때 모든 Singleton Bean을 미리 로딩함으로써
 * 그 빈이 필요할 때 즉시 사용할 수 있도록 보장해줌
 * ->어플리케이션 동작시 Bean생성을 기다리지 않아도 됨
 * 
 * */

스프링을 경유 하려면 ClassPathXmlApplicationContext같은 것이 있어야한다.

xml에서 값을 읽어오는 고급 기법이다.

 

더이상...웹을 위한 전유물이 아니다.

자바 메인 메소드 안에서 객체주입을 받을 수 있다.

 

빈즈 안에 빈팩토리

커택스트안에 어플리케이션빈팩토리 들어있다.

xml말고 자바로 할 수 있게 해야되겠다...

xml을 걷어내고 어노테이션으로 바꿔줌->spring 4.0에서 요청객체와 응답객체가없어짐.

서블릿으로부터 완전한 독립이다.

요청 응답객체가 requestGetParam을 하지 않아도되니까.

 

스프링 해보기

insaList가 있다... 이걸 insaTest에서 꺼내쓰고싶다.

원래는 private로 해야되지만 public으로 연습한다.

프로퍼티 네임은 인스턴스 변수이다. setter이름이다!! 그래서 insaList에서 setter로 값을 넣어주는 변수와 이름을 맞춰야된다.

bean태그의 id와 같다.

InsaTest에서 InsaList를 가져온다.

객체주입은 xml에서 한다. 스프링이.

 

스프링과 자바를 섞을때는 생성자 객체주입법을 사용한다.

 

지금 내가 쓰고있는 spring legacy의 가장 큰 특징!

아직 http쓰는것으로 봐서 서블렛에 의존 하고 있다.

매핑을 해줬다. 반 스프링 느낌으로...

package com.example.demo.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class Listcontroller extends AbstractController {
	Logger logger =LoggerFactory.getLogger(Listcontroller.class);
	//@Autowired대신에 수동으로 하자
	List<String> insaBean2=null;
	public void setInsaBean2(List<String> insaBean2) {
		this.insaBean2 = insaBean2;
	}
	//메소드의 파라미터로 요청객제와 응답객체를 주입 받고 있다는것은 서블릿에 의존적인 프레임워크를 의미함
	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		ModelAndView mav=new ModelAndView();
		mav.addObject("insaBean",insaBean2);
		mav.setViewName("di/insaList");
		
		return mav;
	}

}

댓글