스프링자체가 싱글톤을 보장해줘서 , 스프링내에선 싱글톤 안써도 됨
-Junit5
@AfterEach,@BeforeEach : 테스트가 시작되기 후, 전 마다 수행되는 어노테이션
@AfterEach// 메소드에 붙음 , 다음 테스트에 영향을 주지 않기 위해 종료되어야할 리소스를 처리하는 부분
@BeforeEach// 메소드에 붙음 , 테스트 할 때의 초기 환경을 setup
@Test//Junit이 수행할 코드 ,메소드에 붙음
given (ㅇㅇ 주어졌을때) -> when (ㅇㅇ 실행했을때 ) -> then (결과가 ㅇㅇ 이어야되) 로직으로 수행됨
then부분 ex)
Assertions.assertThat(출력값).isEqualTo(기댓값);
Assertions.assertThat(컬렉션객체).contains(member1,member2);
( Junit 5 기준 명령어 참고 )
템플릿 엔진(뷰 템블릿) : html 에다가 자바코드를 중간중간 삽입하는 것 , jsp(legacy) 타임리프(new)
정적 HTML 문서 : 항상고정된 HTML
동적 HTML 문서 : 시시각각 변화되는 회원목록같은 HTML
동적 HTML case : 서블릿+자바내부 html (very old) , 템플릿 엔진단독 이용 , 서블릿+템플릿엔진(new)
-JSP
JSP도 서블릿으로 변환됨, 따라서 request, response를 사용가능함
JSP는 자바코드를 그대로 다 사용할 수 있다.
JSP는 <% ~ %> 에 자바코드를 입력할 수 있다
<%= ~ %> 에서는 자바코드를 출력한다
-서블릿과 JSP의 한계
서블릿만으로 뷰화면을 만들려면 , 자바코드 내부에 html 을 써줘야한다는 불편함이 존재
서블릿과 JSP로 뷰화면을 만든다면 , 뷰파일에 자바영역과 , HTML 영역이 둘다 존재 ( 커밋시 문제 , 역할이 너무많음 , 유지보수의 지옥 )
=> MVC 패턴의 등장 (보여주는것과 비즈니스로직과의 분리) ( JSP는 뷰를 그리는 것에만 집중하게함 )
변경의 라이프사이클이 다른것들(비즈니스로직,UI)을 분리해주는것이 유지보수에 좋다
-MVC 패턴1(legacy)
컨트롤러(Servlet): 비즈니스 로직을 다 수행 , Model에 데이터를 담음 , 뷰로 제어권을 넘김
모델(Model)객체 : 데이터담기는 곳
뷰(ex JSP): Model에 있는 데이터를 참고해서 뷰를 완성하고 , 클라이언트에게 보냄
-MVC 패턴2(new) ( CS 에서 배웠던 부분과 약간 다르지만 , 뭐 비슷하다 )
컨트롤러 : HTTP요청이 옳바른지 스펙을 확인 , 서비스 호출 , 종합적인 조종역할
서비스,리포지토리 : 비즈니스 로직, 데이터 접근 수행
모델(Model)객체 : 데이터 담기는 곳
뷰(ex JSP): Model에 있는 데이터를 참고해서 뷰를 완성하고 , 클라이언트에게 보냄
Servlet을 컨트롤러로 , JSP 를 뷰로처리
request.setAttribute 는 임시저장소 지만 , Model에 데이터가 들어감
컨트롤러에서는 HttpServletRequest객체.setAttribute("이름","값") 으로 Model에 데이터를 넣을수 있고,
뷰에서는 request.getAttribute("이름")로 Model에서 데이터를 꺼낼 수 있다
RequestDispatcher dispatcher =request.getRequestDispatcher(jsp파일경로문자열);//Controller->view 로 이동할때 사용
dispatcher.forward(request,response); // 다른 서블릿이나 JSP로 이동할 수 있는 기능 , 서버내부에서 다시 호출이 발생 ,리다이렉트(웹브라우저에 갔다가 서버로 재요청)와 다르게 서버내부이동임,
Client->Server->Servlet 의 dispatcher->jsp->client
경로 ex) 현재 페이지 : http://localhost:8080/servlet-mvc/members/new-form
상대경로 : 클라이언트에서 save 호출시 -> http://localhost:8080/servlet-mvc/members/save
절대경로(추천) : 클라이언트에서 /save 호출시 -> http://localhost:8080/save
WEB-INF 폴더 : WEB-INF 내부에 있는 파일들은 컨트롤러를 거쳐야지 불려 질수 있음 ( 외부에서 호출 불가능 )
-redirect vs forward
redirect : client에 응답이 나가고 , HTTP헤더의 로케이션값으로 다시 서버에 요청하면서 로케이션값이
웹 브라우저의 url로 변경이됨 , 즉 server->client 가 두번 발생
forward : 서버 내부에서 일어나는 호출이기때문에 클라이언트가 전혀 인지하지 못함
jsp에서 request.getAttribute("이름") 으로 모델객체내용을 받을 수 있지만 너무 김 , 대신에..
${이름.필드변수} 로 바로 호출 가능 (프로퍼티 접근법, 필드변수만 적으면 상황에 맞게 자동으로 get or set이 호출)
jsp 선언부에 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 를 호출 하여 jstl 이용가능
MVC 패턴에서 , client에서 오는 요청은 무조건 먼저 Controller를 거친다 ( 규칙 )
-MVC 패턴의 한계 ( jsp 와 servlet 만으로 구현한 mvc 패턴 )
컨트롤러내의 dispatcher 중복
viewPath="/WEB-INF/views/members.jsp" 의 내용중복
HttpServletRequest , HttpServletResponse 객체들이 꼭 사용되는 것은 아님 , service메소드 인자로 항상 쓰인다는 문제
공통처리가 어렵다 ( 로그처리 , 각종 중복코드 , 중복호출문제 )
=>
프론트 컨트롤러 패턴 : client 로부터 요청이 올때 다양한 공통처리를 미리 설계 해주는 객체(수문장역할)를 경유하여 서블릿으로 통하게 하는 방식 ( SPRING MVC 의 핵심 ) ,
대표컨트롤러를 두어 이후 나오는 컨트롤러들이 호출되게함