본문 바로가기

MVC 패턴

MVC패턴 : 모델2


JSP 웹 앱 아키텍쳐는 모델1과 모델2로 나뉜다.
JSP가 클라이언트 요청에 대한 로직처리(DB) 응답페이지(HTML)에 대한 모두 처리를 하면 모델1, view에 대한 처리만 하면 모델2이다.

모델2구조는 MVC패턴을 웹에 도입한 구조이다.

- 모델1구조
뷰 + 컨트롤러(자바코드 즉, 서블릿 : req, res에 관련된 작업 한다. ) = JSP
자바빈즈(model) : DTO, VO 같은거. 
모델1 장점 : 직관적이다. 단점 : 유지보수 어렵다.JSP코드 복잡해진다. 확장성이 나쁘다


- 모델2구조 :MVC패턴

모델 : 서비스,DAO, 자바빈즈 : 로직을 처리하는 모든것, 컨트롤러에서 넘어온 데이터를 이용해서 작업을 수행하고, 그 결과를 컨트롤러에 넘겨준다. (일반 자바 코드)
(비즈니스 로직 : 서비스 / 데이터베이스 로직 : DAO / 자바빈즈 : DTO,VO)

뷰 : JSP : 모든 화면 처리 담당. 결과 출력만을 위한 코드만 존재
컨트롤러 : 서블릿 : 클라이언트 요청에 따른 Model 호출. 모델로부터 받은 결과를 request, session 등에 저장. redirect, forward 방식으로 JSP페이지 이용해서 출력


-MVC 패턴

클라이언트가 컨트롤러에게 request 요청. 컨트롤러(서블릿)은 서비스 모델 호출 서비스는 DAO 이용해서 데이터 가져옴.
서비스 모델은 컨트롤러에게 결과 넘겨주고 컨트롤러는 JSP한테 forward. JSP는 컨트롤러에게 결과 페이지 보내주고 컨트롤러는 클라이언트한테 response한다.

모델2 장점
: 뷰 코드, 로직 코드가 분리되어 코디 복잡X. 분업 용이 유지보수 쉽고 확장성 뛰어남
그러나, 구조 복잡해서 초기진입 어렵고 개발시간증가



<%@include file= ?>  은 그냥 그 안에있는 내용을 복사 붙여넣기 하는거
<jsp:include page= "" jsp> 는 그 파일 안에있는 HTML만을 가져온다!!!!!!!!! 
공통된 변수같은거 쓸 때는 <%@ include 가 편하다

reqeuset.getContextPath : 는 서버 context-path 내용을 가져온다.






jsp에서 다른페이지로 연결링크를 할때 jsp 파일로 바로 연결시키면, 파일 이름 바꿀 시 번거로워 진다,

그래서 클라이언트가 어떠한 요청을 하든 무조건 컨트롤러!!!!!!!  를 거친다( 단순 페이지 이동 )






세션: 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다
httpSession 
WAS의 메모리에 오브젝트 형태로 저장. 메모리 허용 용량까지 제한 없이 저장 가능

세션의 사용 예시 : 장바구니, 로그인 정보

request가 들어올 때 , 브라우저가 가지고 있는 세션 아이디를 가지고 온다.
만약 getSession(false) 라고 하면 세션을 새로 만들지 않고 NULL을 리턴해준다. ( 그냥 비워두거나 true이면 세션이 없으면 만든다)

setAttribute로 값 저장. get으로 얻기
세션 값 제거. 특정 이름 제거하거나, 모든 속성 제거가능ㄴ

브라우저가 종료되면 세션 사라진다!


-세션&쿠키
http프로토콜의 특징
  클라이언트가 서버에 요청. 서버는 요청 처리한 다음에 연결 해제 ( stateless)!!!!
왜 해제하냐? 지속적인 연결은 자원낭비. 근데 로그인 정보같은거 유지하고 싶으면
즉, 클라이언트단위로 상태정보 유지하고 싶으면 쿠키와 세션을 사용한다.

HTTP의 약점 보완위해 사용


-쿠키
서버에서 사용자으 ㅣ정보에 저장하는 정보 파일
사용자가 별도의 요청 안해도, 브라우저는 자동으로 헤더에 넣어서 서버로 보낸다.
키 밸류 형태이며 string 형태
브라우저마다 저장되는 쿠키 다르기때문에 서버에서는 브라우저 다르면 다른 사용자로 인식한다.

쿠키 왜 쓰냐?
 세션관리 : 아이디, 접속시간, 장바구니 등 서버가 알아야 할 정보 저장.
 개인화 : 사용자마다 그 사람에 적절한 페이지 보여준다
 트래킹 : 행동 패턴 분석


쿠키 동작 순서
클라이언트 요청 -> WAS는 쿠키 생성 -> 헤더에 쿠키 넣어서 응답 -> 브라우저는 넘겨받은 쿠키 저장


쿠키에서 유효 도메인 설정할 수 있다.
domain으로
path 설정하면 경로도 설정 가능 




프로젝트 서버 폴더에서 web.xml 보면 톰캣 설정이 있따.
그 중, session-timout 이 기본으로 30분으로 설정되어있다.  기본 세션 설정!!!!!

그리고 web-inf폴더의 web.xml 파일에서
welcome-file-list는 path 없었을 때 뜰 페이지 설정할 수 있다
그리고 각 에러에 대해 에러페이지 설정 가능


-쿠키 설정
new Cookie (키, 밸류) 로 생성
cookie.setMaxAge(초단위)
cookie.setPath(request.getContextPath());

// 클라이언트 응답에 담아준다.
response.addCookie(쿠키)




forward쓰다 보면, 새로고침 시 해당 요청으로 계속 보내져서, 리다이렉트로 해주는 게 좋거나
json으로 상태정보만 가지고온다.
혹은 만료된 페이지 설정? 캐시 컨트롤 (no-cache) 이용해서 기존의 데이터 다시 로드 안하게 해 줄 수 있다!!!!!!!!
헤더


WEB_INF는 톰켓 컨테이너가 관리하는 폴더이다. 실행 될 때, 컴파일 되는 파일을이 이 폴더 안에 들어간다. 

web.xml은 하나의 웹 앱에 해당되는 환경설정파일이다. 

웹 앱을 여러개 실행해서, 서로 접근하게 해 줄 수 있다. 서블릿 컨텍스트로 구분한다.
즉, 서블릿 콘텍스트를 여러개 만들어서 협력해서 개발한다. 특정 컨텍스트만 종료했다가 다시 실행할 수 있다.
서버가 구동중인 상황에서 새로운 서블릿 컨텍스트를 실행시킬 수 있다. -> 기능 추가 가능 
이렇게 작동하는게 서블릿 JSP기반 웹애플리케이션이다,

세션트래킹은 로그인을 할 때 사용한다.
stateless : request에 대한 response가 되면 연결이 끊어진다!
세션으로 수많은 클라이언트에 대한 연결을 유지하는 건 많이 힘들다. 그래서 stateless 프로토콜(HTTP) 사용한다

HTTP가 stateless하게 설계되었다 보니깐 연결이 되었다는 걸 알 수 있게 해주는 무언가가 필요햐다 , 그게 세션이다,

DBUtil에 한번 연결을 요청하면, 연결을 끊을 때까지 연결을 유지한다. 연결지향형이기 때문에 자원관리가 필요하다.

모든페이지에서 항상 사용하는 변수. 
<%=request.getContextPath() %>
→ /root


세션에는 절대 중복되지 않는 sessionID ( 세션 주소) 가 있다, 

여러개의 서버 앞에는 로드 밸런서라고 분배해주는 서버가 있다.
근데 접속할 때 요청을 보내는 서버가 다르면, 세션이 불일치한다. 이런 문제 발생 가능하다. 그래서 세션정보를 DB라는 곳에서 다시 매핑 시켜줘야한다.
그러다 보니 불편하다. 그래서 토큰 인증방식을 사용한다.



el문법에서 객체 내부 변수 접근할 때, getter가 필수이다!!!!!!!!!!!!!!!!!








월말 할 때 ajax 사용 안한다.

name: <%= request.getParameter("name") %>
name: ${param.name} // el 표현식은 null 핸들링 안해도 된다! ( 단, 비교연산자 쓸 때는 null 과 비교해야한다.)


test: ${test } <br>
root: ${root } <br>




프론트 컨트롤러



톰캣 설정 중, web.xml, context.xml, server.xml은 무조건 알아야 한다.

톰캣 서버파일 경로 중 ,wepapps 폴더 안에 넣으면 실행되지만, 테스트 위해서 이클립스가 서버 설정 복사해서 실행해준다.


RDBMS는 한번에 연결될 수 있는 최대 제한이 있다. 그래서 연걸하면 무조건 끊어야 하는데 연걸하는데 시간이 오래 걸린다.
그래서 미리 연결 해놓고 필요할 때마다 빌려주고 반납한다. 이 거를 pool이라고 부른다.

WAS에는 메모리 공간이 있다. POOL이라는 공간이 있다.
접속 인원이 많아도 톰캣은 1개고, 쓰레드가 여러개 만들어진다. 쓰레드를 pool에서 관리한다. 그래서 쓰레드 pool이라고 부른다.

자바에는 JNDI ( 자바 네이밍 디렉토리 인터페이스) 라는라이브러리가 있다. 자바의 객체를 이름과 디렉토리의 방법으로 관리한다.
javax.naming 이라는 라이브러리에 있다.

루트 콘텍스트라는 메모리 영역에 들어가야 한다. java:comp/env 가 루트 경로이다. 이 경로 아래에는 여러 경로들이 있다. 아래 폴더에는 jdbc, 쓰레드 등이 있다.jdbc 폴더 아래에 이름을 정할 수 있다. 이 때 jndi라는 라이브러리 사용


데이터베이스의 정보를 가지고 오기 위해 Context이용
try {
Context cxt = new InitialContext(); // 메모리 접근할 수 있는 context 객체 얻어왔다
Context rootContext = (Context )cxt.lookup("java:comp/env");         // cxt에서 루트를 찾는다. (자바의 모든 객체 찾을 수 있기 때문에 형변환)
DataSource dataSource = (DataSource) rootContext.lookup("jdbc/ssafy");
return dataSource.getConnection();

} catch () {
return null;
}

DB와 관련된 정보가 없다. 그럼 아이디.비번은 어디에 있을까
webcontent/meta-inf 의 context.xml에 DB 정보가 있다.
datasource 객체를 pool이라는 공간에 둔다.

connectino을 반납 안하면, 안된다. 반드시 반납해줘야한다.























'JAVA > JSP' 카테고리의 다른 글

JSP  (0) 2022.04.03
Java Servlet  (0) 2022.04.03