본문 바로가기
Java Web Programming/4. JSP

[JSP] Cookie 쿠키 & Session 세션 + Model 2 Architecture (MVC Pattern) 설계방식을 다시 한 번 정리하고 가자!

by 파프리카_ 2020. 9. 4.
728x90
반응형

[ Cookie 쿠키  & Session 세션 ]

 

HTTPStateless한 특징을 가지고 있어, 상태정보를 유지하지 않는 특성을 가지고 있다.

그 이유는 서버가 불필요하게 무거워지는 것을 방지하기 위함이다. 

하지만, 사용자 입장에서는 상태 정보가 유지가 되어야 편한 경우가 있다. 예를 들어 로그인 상태를 유지하고 메일을 확인하거나, 검색을 하는 경우 등의 경우이다.

그래서 상태 정보를 유지하기 위한 방법으로 두 가지가 이용된다. 첫 번째는 쿠키이고, 두 번째는 세션이다.

쿠키는 클라이언트 측에 사용자 상태 정보를 저장하고, 세션은 서버 측에 사용자 상태 정보를 저장한다.

또한 쿠키는 저장 용량이 4KB로 제한이 되며, 데이터 타입은 문자열로만 저장 가능하다는 특성이 있으나,

세션은 저장 용량과 데이터 타입의 제한이 없다.

( * 자세한 개념 설명 → https://creamilk88.tistory.com/101?category=872953 )

 

[JSP/세션관리] Cookie 쿠키 & Session 세션 이란 무엇인가? (개념, 용도)

[ 세션 관리 ] HTTP의 특성 ⇒ Stateless (상태 정보를 유지하지 않는다) : 클라이언트와 서버가 서로 통신할 때, request ↔ response가 한 번 이루어지면, 클라이언트에 대한 정보를 유지하지 않는다. (한

creamilk88.tistory.com

 

세션은 내부적으로 쿠키를 사용한다.

즉, HttpSession에서 내부적으로 Cookie를 사용한다는 것이다.

예를 들어 앞선 포스팅에서 구현했던 로그인 서비스에서, LoginController를 구성하여 이용하였다.

( 참고 : https://creamilk88.tistory.com/103)


LoginController를 자세히 살펴보면 다음과 같다.

public class LoginController implements Controller {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		//반환할 url 주소
		String url = null;
		
		//JSP에서 입력값 받아오기
		String id = request.getParameter("id");
		String password = request.getParameter("password");
		
		//Model과 연동
		//vo : 입력받은 값으로 만든 MemebrVO 객체
		MemberVO vo = new MemberVO(id, password);
		//mvo : model과 연동하여 vo를 넣어 결과값으로 받은 MemberVO 객체
		MemberVO mvo = MemberDAO.getInstance().login(vo);
				
		//View로 이동 : redirect방식으로 
		if (mvo == null) { //로그인 실패
			url = "redirect:login-fail.jsp";
		} else { //로그인 성공
			url = "redirect:login-ok.jsp";
			//세션 생성
			HttpSession session = request.getSession();
			//세션에 정보(mvo) 할당 - View에 정보 공유
			session.setAttribute("mvo", mvo);
		}
		
		return url;	
	}

}

 

위와 같은 코드를 짜기 위해서는 다음과 같은 순서를 거친다.

 

  1. Model(DAO의 login() 메서드)와 연동하여 결과 값을 반환받는다.
    MemberVO vo = new MemberVO(id, password);
    MemberVO mvo = MemberDAO.getInstance().login(vo);

  2. if 조건문을 이용하여 1번과정을 통해 반환받는 결과값이 null인지 아닌지 확인한다.

  3. 2번에서 true인 경우(반환받는 결과값이 있는 경우)

  4. → session을 생성한다. (있으면 기존 세션 사용, 없으면 세션 새로 생성)
    HttpSession session = request.getSession();
    - 이 과정에서 만들어주는 session은 client 당, 하나의 session을 만들어 주는 것이다.
    - session 하나 당, 유일한 primary key를 부여한다.  (여러 개의 세션이 있기 때문에, 식별값이 필요하다)
    이 코드에서는 그것이 id가 된다. 이는 곧 session id로 불리기도 한다.
    - 각자 클라이언트가 session object(객체)가 client에 저장된다. ⇒ cookie !! 
  5. → redirect 방식으로 view에 session 정보를 공유하여, 전달한다.
    url = "redirect:login-ok.jsp";
    session.setAttribute("mvo", mvo);
    - 이 과정에서 session이 jsp(view)에 전송되며, 이 때 response 하기 위한 과정을 거치는데 
    이 안에서 각각의 session은 곧 cookie로써 전달되며, 또한 이 cookie는 식별 가능한 각각의 session id를 가진다.

    ** jsp는 서버 쪽에서 동작이 되는 것이다 !! 
    - jsp에서는 request.getSession()으로 쿠키 정보를 가져온다.
    - login-ok.jsp가 동작하기 위해서는 java 프로그램에 올라가 complie된 후 java로서 동작한다. 
    ( C:\kosta203\WAS\web-tomcat\work\Catalina\localhost\webstudy22-member\org\apache\jsp\login-ok_jsp.java 와 같이 login-ok.jsp가 직접 동작하는 것이 아니라, 기재해 놓은 path 과정을 거쳐 java로서 동작이 된다.)

 


[ Model 1, 2 Architecture 설계방식 ]

 

MVC 로 역할을 나누어서 진행하는 이유?

programming의 궁극적 목표를 달성하기 위해서 !

① 응집도 ↑ ② 결합도 ↓

 

[ Model ]

→ java beans, java component라고 불리기도 한다.

 하는 일은 비즈니스 로직, 즉 데이터 엑세스 로직을 맡는다.

 VO, DTO (데이터 Object) / DAO (데이터에 접근하여 기능을 구현) / Service (DAO의 역할을 분담)

 

[ View ]

 응답화면 or 데이터를 제공해준다.

 

[ Controller ]

 제어 로직의 역할을 한다. (Model과 View를 제어한다)

 ① 클라이언트의 요청을 분석하고, ② 모델과 연동하고,  ③ view를 선택하여 응답해준다.

③단계에서 응답 방식이 2가지로 나뉜다. 

- foward 방식 : 서버상 이동 (request, response 유지 O)

- redirect 방식 : 클라이언트에게 응답 시, 이동을 명령 (request, response 유지 X)

 

FrontController pattern 방식을 적용하여 사용하는 경우가 많다.

프론트컨트롤러 패턴에 대한 자세한 개념 정리 → https://creamilk88.tistory.com/98

프론트 컨트롤러 패턴에 대한 그림 설명 → https://creamilk88.tistory.com/99

* FrontController pattern 이란 ? 
: 모든 클라이언트의 다양한 요청을 하나의 진입점으로 집중시켜, 일괄적으로 처리하기 위한 디자인 패턴

 - DispatcherServlet (/front) : 공통정책을 통일하기 위해서

 -  HandlerMapping (Factory) :  응집도를 높이고, 결합도를 낮추기 휘해서

 - <<interface>> Controller  : 계층구조 형성을 통한, 다형성 적용을 위해서 ( "one interface, multiple implements " )

 - Controller interface에는 execute 메서드가 있고, 다른 개별적 역할을 하는 각각의 controller에 execute 메서드를 overriding하여 상속받도록 구현을 강제시키는 역할을 한다. 이로써 DispatcherServlet에서 개별의 controller를 호출하여, 각각의 controller를 같은 방식 ( execute() ) 로 실행할 수 있다. 또한 execute 메서드는 String 타입의 url을 반환하는데, 이는 1) 어느 View(JSP)로 이동을 할 것인지 View 이동 대상을 지정해주며, 2) 어떤 방식으로 View에 이동할 것인지(forward인지, redirect인지) 지정해준다.


오늘은 MVC 중 MODEL에 집중해서 공부해보자!

 

DAO class ← Singleton pattern을 적용 !

public class SingletonDAO {

	// instance 변수에서 생성
	private static SingletonDAO instance = new SingletonDAO();

	// 생성자에 private 주기
	private SingletonDAO() {
	}

	// 생성자를 생성할 method를 static에 적재
	public static SingletonDAO getInstance() {
		return instance;
	}

}

* 싱글톤 패턴에 대한 자세한 개념 정리 링크 ( → https://creamilk88.tistory.com/96 )


이어지는 다음 포스팅에서는 Model2 설계방식 (MVC Pattern) 에서

Model에 집중한 ( DB와 Model과의 SQL을 통한 연동 ) 내용이 포스팅 될 예정이다.

728x90
반응형