재밌고 어려운 IT를 이해해보자~!
Spring 프레임워크 구조 Update (버전별 정리) 본문
Spring 에서 MVC 패턴 구조
보통 Spring Boot 만 쓰는 회사는 잘 없다.
항상 처음보는 프레임워크를 만나게된다!
day065~day067 에서 설명한 내용을 잘 정리해보자
패키지 관리 (팀내협의)
클래스의 타입(자료형) 중심 90%
dto,dao,controller,action...
VS
기능 중심 10%
DispatcherServlet(FrontController)
버전 01
개발자가 직접만든 DispatcherServlet 사용
com.spring.controller.common.DispatcherServlet
버전 02
Spring 프레임워크에서 제공하는 DispatcherServlet 사용 (init이없음)
org.springframework.web.servlet.DispatcherServlet
DI(의존주입,init())을 위한 .xml(설정파일) 이 필요함
dispatcher-servlet.xml (xml이생겼네? 컨테이너가 더생긴것)
presentation layer(표현 계층)가 생성
Spring 프레임워크에서 제공하는 인코딩 필터 사용
※ not POJO(Sevlet,Filter,Listener) 객체등록은 서블릿 컨테이너가 담당
서블릿 컨테이너의 설정파일인 web.xml 에 등록해야함 (일반자바객체는 스프링으로 객체등록이 가능하지만 not POJO는 아니다)
※ 중프때했던 비동기Action(Servlet) -> 최프때 일반 Controller(POJO)로 변경예정!
※ filter는 servlet을 상속받은 클래스
어플리케이션 컨텍스트.xml을 대체하는 녀석 -> 스키마가 갖다. 기본 스키마만 넣어서 생성
우리가 만든 dispatcherServlet은
1. 멤버변수초기화
2. 생성자
3. 세터
4. @autowired
5. 의존주입
6. init() 메서드
을 하는 애가있다. (1~6)번까지는 같은역할을하며 정말정말 중요하다!
init을 web.xml에 할만한곳이 없기 때문에 init을 위한 xml을 추가한다.
Controller(Action)
버전 01
개발자가 직접만든 Controller 인터페이스 사용
output 이 ActionForward 이었는데
VR 가 등장하면서, String 으로 변경됨
※ 어디로(경로), 어떻게(방식:리다이렉트,포워드)
버전 02
Spring 프레임워크에서 제공하는 Controller 를 구현하여 impl(구현,상속)하여 사용 (개발시엔 extend, impl 둘다 상속이라고 부르기도한다)
org.springframework.web.servlet.mvc.Controller
기존에는 request(not POJO) 객체를 통해 데이터를 전달 -> 무거움
현재는 ModelAndView(mav,POJO) 객체를 통해 데이터를 전달 -> 가벼움
버전 03
@Component + implements Controller ▶@Controller
@Component
@Repository @Service @Component
@Aspect (AOS 위빙처리)
어노테이션을쓰면 Override가 사라져서 메서드 시그니쳐 강제가 안된다.
이럴경우 한 클래스에 2가지 기능을 담아서 관리가 가능하다 더 좋은건 아니고 다른것 (장단점이있다) ->
이럴경우 bean new 했던것을 @ new 하기때문에
bean new 가 사라지고
@에 이름이 붙는다.
@Component("main")
@Component("login")
메서드 강제가 풀려서 생기는 Mapping 이슈가있다. -> 이따가 해결
[web]
dispatcher-servlet
imple,
annotation
이거 3개로 controller.common에 있는java파일들이 필요가 없어진다.
redirect:alert.do ->리다이렉트
alert.do -> forward
HandlerMapping
버전 01
개발자가 직접만든 HM 사용
DI 로 생성자 주입을 사용
버전 02
Spring 프레임 워크에서 제공하는 HM 를 사용
org.springframework.web.servlet.handler.Simple
DI 로 setter 주입을 사용
☆주입하는 객체는 Map!!!!!!!
<prop key="/main.do>">new MainController()<</prop> new 대신 빈을 써보자!
<bean id="main" class="cohttp://m.spring.controller.board.MainController" />
bean 하고
<prop key="/main.do>">main<</prop>
이렇게 변경한다.
이제 xml에 붙는거라 컴파일이없다. 성능향상!
버전 03
@RequestMapping으로 요청매핑
output 으로 String 을 권장
요청메서드가 GET,POST,... 등을 작성하는 것을 권장 (ex method=RequestMethod.POST)
member.do GET--->SELECTONE
SELECT (GET 대부분 검색기능)
member.do POST--->UPDATE
CUD (POST 대부분 업데이트)
String 프레임워크에서 제공하는 VR 사용
org.springframework.web.servlet.view.InteralResourceViewResolver
DI로 setter 주입을 사용
특정 페이지의 URL을 알면, 별도의 권한이 없어도 접근이가능한 경우가 있다.
이 경우를 막기위해 C 파트에서 별도의 접근 권한 유효성검사를 구현해야한다!
Spring 에서는, 애초에 페이지를 WEB-INF 폴더에 은닉(하이딩)하여 저장함!!
WEB-INF 폴더의 하위는 오직 VR을 통해서만 접근가능함을 이용한것
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
mav.setViewName("test");
VR만을 통해서 /WEB-INF/views/test.jsp
은닉된 페이지에 접근 가능해짐!!!
@Repository -> 모델
@Service -> 모델을 사용하는애
@Controller // "Implements Controller"를 포함하는 @
개인메모 및 정리
index == 첫 요청 (톰캣도 그렇게 되어있다 따라서 항상 index.jsp)~
같은 요청을 보내면 안된다
요청과 응답을 보내는 방식은 다르다..?
#모델은 반환을 String으로 받는것을 추천
'코리아IT핀테크과정' 카테고리의 다른 글
Command 객체 (2) | 2024.03.07 |
---|---|
Spring 궁금증 정리 (0) | 2024.03.06 |
Data Base Connection Pool (0) | 2024.03.04 |
AOP(Aspect-Oriented Programming) (2) | 2024.02.29 |
xml, annotation(@) (4) | 2024.02.28 |