본문 바로가기
스프링/mvc패턴

[MVC패턴] MVC패턴, model1/model2의 개념, cookie, 답글 달기

by CodeMango 2023. 2. 10.

MVC 패턴이란?

Model           -  DB(Dao,Dto)                                                                                  back-end

View             -  jsp, html 등 모든 웹                                                                        front-end

Controller     -  java형 클래스   --> 제어, 말그대로 교통정리를 하는 컨트롤러      back-end

 

 

Model1과 Model2

Model.1

*WAS : web application system

모든 client의 응답(response)을 jsp가 담당하는 구조

 

특징

* 빠른시간 안에 구현이 가능하다.

* 코드가 쉽다.

* 중소형 프로젝트에 적합하다.

* 웹 프로그래밍의 규모가 커지면 유지보수가 어렵다. (코드를 다 분석해야되는 경우 발생)

 

 

login 화면 만들기

정석적인 방법으로 화면을 만든다면!

id를 저장하는 용도로 쓸 때는 cookie를 사용하고, 로그인 한 사람의 회원정보 하나를 저장할 때는 session을 사용한다.

 

즉,

cookie    :  id저장, pw저장   /  String으로 저장된다.    / 저장영역은  client에 있다.
session  :  login한 정보       /   Object로 저장된다.      / 저장영역은  server에 있다.

 

 

cookie 플러그인 사용법

 참조 : https://lab.naminsik.com/1864

 

lab.naminsik

lab.naminsik - 개발자 남인식 Lab.

lab.naminsik.com

$.cookie('werty', 'ok', { expires: 7, path: '/', domain: 'werty.co.kr', secure: false });

expires : 만료일을 의미한다. 위 예제로 보면 7일동안 해당 쿠키를 유지한다는 이야기다.

path : 경로설정이다. 이 사이트의 모든 페이지가 해당된다면 / 이렇게 슬러시만 둔다. 그렇지 않고 특정 폴더라면 경로를 넣으면 된다.

domain : 쿠키가 적용될 도메인이다. 기본 설정은 쿠키가 만들어진 도메인이다.

secure : 기본 설정은 false로 되어있다. true/false 로 입력가능하며 true 일 경우 https 프로토콜만 적용된다.

 

 

 

 

 

jspModel1 파일부터 올려야되는데 용량이 너무 큼... 깃허브에 올려서 첨부해보자.


Model.2

 

모델 2는 웹 애플리케이션 개발, 특히 Java 기반 웹 애플리케이션 개발에 사용되는 디자인 패턴입니다.

MVC(Model-View-Controller) 디자인 패턴의 확장으로 애플리케이션을 모델, 뷰 및 컨트롤러의 세 가지 상호 연결된 구성 요소로 분리하는 소프트웨어 아키텍처 패턴입니다.

 

모델 2 패턴에서 컨트롤러는 사용자 요청을 수신하고 요청을 처리한 다음 해당 요청을 적절한 보기로 디스패치합니다. 모델은 애플리케이션의 데이터와 논리를 처리하는 역할을 하고 뷰는 사용자에게 데이터를 표시하는 역할을 합니다.

 

장점

1. 책임을 명확하게 분리하여 애플리케이션을 더 쉽게 유지 관리하고 업데이트할 수 있다는 것입니다. 또한 이 패턴을 사용하면 개별 구성 요소를 개별적으로 테스트하고 전체 애플리케이션을 테스트하기가 더 쉬워집니다.

2. 패턴의 또 다른 이점은 애플리케이션이 모델 데이터를 캐시하고 필요에 따라 재사용할 수 있기 때문에 성능 향상에 도움이 될 수 있다는 것입니다.

3. 웹 애플리케이션 개발에 널리 사용되고 널리 사용되는 패턴이며 확장 가능하고 유지 관리 가능한 애플리케이션을 구축하기 위한 견고한 기반을 제공합니다.

 

요소

MVC 패턴은 애플리케이션의 구조를 세 가지 주요 요소로 나누는 개념입니다.

  1. Model: 데이터와 데이터 처리 로직을 가지고 있습니다.
  2. View: 사용자에게 보여지는 부분입니다.
  3. Controller: 사용자의 입력을 받아 Model을 업데이트하고, View를 갱신하는 역할을 합니다.

 

파일별 역할

클래스

  1. BbsController.java와 MemberController.java:  MVC(Model-View-Controller) 구조의 컨트롤러 클래스입니다. BbsController.java 클래스는 게시판과 관련된 액션, 예를 들어 게시물의 작성, 읽기, 업데이트, 삭제 등을 처리할 것입니다. MemberController 클래스는 사용자 등록, 로그인, 프로필 관리와 관련된 액션을 처리할 것입니다.
  2. BbsDao.java와 MemberDao.java: 데이터 접근 객체(DAO) 클래스입니다. BbsDao.java클래스는 게시판,  MemberDao.java는 회원에 관련된 데이터베이스 작업을 처리할 것입니다.
  3. DbClose.java와 DBConnection.java: 이것들은 데이터베이스 연결을 열고 닫는 기능을 가진 유틸리티 클래스입니다.

페이지 : bbslist.jsp, bbswrite.jsp, index.jsp, login.jsp, message.jsp, regi.jsp: 

  • bbslist.jsp: 게시판 목록을 보여주는 페이지입니다.
  • bbswrite.jsp: 게시판 글을 작성하는 페이지입니다.
  • index.jsp: 웹 애플리케이션의 첫 화면입니다.
  • login.jsp: 로그인을 위한 페이지입니다.
  • message.jsp: 알림 메시지를 보여주는 페이지입니다.
  • regi.jsp: 회원가입을 위한 페이지입니다.

 


코드 분석하기

			MemberDao dao = MemberDao.getInstance();
			
			//addMember의 메서드를 호출하여 MemberDto개체를 인수로 전달
			boolean isS = dao.addMember(new MemberDto(id, pwd, name, email, 0));
  1. MemberDao 객체 초기화: MemberDao 객체인 "dao"를 getInstance 메소드를 호출하여 생성합니다. getInstance 메소드는 싱글턴 패턴 구현입니다. 즉, 프로그램에서 MemberDao 객체가 하나만 존재하며, getInstance를 호출할 때마다 같은 객체를 반환합니다.
  2. 새 회원 추가: dao 객체에서 addMember 메소드를 호출하여 새 MemberDto 객체를 전달합니다. MemberDto 객체는 id, pwd, name, email, 0 인수를 사용하여 생성됩니다.

반환 값: addMember 메소드는 작업의 성공 여부를 나타내는 불리언 값을 반환합니다. 반환 값은 isS 변수에 저장됩니다.


List<BbsDto> list = (List<BbsDto>)request.getAttribute("bbslist");
  1. 이 줄은 "List<BbsDto>" 타입의 변수 "list"를 선언하며, 이는 "BbsDto" 타입의 객체 목록을 의미합니다.
  2. "request.getAttribute("bbslist")" 부분은 "request" 객체에서 "getAttribute()" 메소드를 호출하는 것입니다. "getAttribute()" 메소드는 "request" 객체에 저장된 특정 속성의 값을 검색하는 데 사용됩니다. 메소드에 전달된 인수 "bbslist"는 검색하려는 속성의 이름입니다.
  3. "getAttribute()" 메소드의 반환 값은 "(List<BbsDto>)"로 형 변환됩니다. 이는 타입 변환을 의미하며, 반환된 값이 원래 다른 타입이었던 것이라도 "BbsDto" 객체의 목록으로 해석됩니다. "(List<BbsDto>)" 구문은 형 변환의 타입을 나타내는 데 사용됩니다.
  4. 마지막으로, 형 변환된 값이 "list" 변수에 할당됩니다.

(List<BbsDto>)로 형변환 하는 이유

"List<BbsDto>"와 "<BbsDto>"의 차이는 다음과 같습니다:

"List<BbsDto>"는 "BbsDto" 타입의 객체들의 목록을 의미합니다. 즉, 여러 개의 "BbsDto" 객체를 가진 컬렉션을 나타냅니다.

"<BbsDto>"는 "BbsDto" 타입의 객체 하나를 의미합니다.

그래서, "List<BbsDto>"를 사용하는 것이 맞습니다.

"request.getAttribute()" 메소드는 속성 이름으로 속성을 검색하고, 검색된 속성의 값은 기본적으로 Object 타입으로 반환됩니다. 그래서, "List<BbsDto>" 타입으로 형 변환을 해주어야 합니다. 형 변환을 하지 않으면 에러가 발생할 수 있습니다.


답글 달기

 ref-step-depth (그룹번호-행번호-깊이번호)

답글을 달때마다 step 행번호, depth 깊이번호가 계속 바뀌게 됩니다.

답글 추가

 

새로운 답글을 추가할 때는 해당 그룹에 대한 답글 중에서 가장 마지막 행(step) 번호보다 1 큰 값을 사용하면 됩니다. 또한, 추가되는 답글의 깊이(depth)는 부모 답글의 깊이보다 1 큽니다.

 

댓글을 작성할 때, 기존의 댓글들과 함께 정렬된 순서를 유지하기 위해 그룹 번호(ref), 행 번호(step), 그리고 깊이(depth)를 사용합니다.

 

밀고 넣기 : update 하고 insert 하기

insert :  step +1, Depth +1

새로운 댓글 추가(insert)는 댓글을 새로 작성하는 것을 말합니다. 추가한 댓글은 해당 그룹에 대한 댓글 중에서 가장 마지막 행 번호(step)보다 1 큰 값을 사용하면 됩니다. 그리고 추가되는 댓글의 깊이(depth)는 부모 댓글의 깊이보다 1 큰 값을 사용하면 됩니다.

update : step +1

수정(update)은 추가하는만큼 행이 아래로 밀려나는 것을 말합니다. 해당 댓글이 속한 그룹 번호와 깊이(depth)는 그대로 유지하며, 행 번호(step)만 수정합니다. 따라서 행이 아래로 밀려날 때마다 행번호(step)이 +1씩 늘어납니다.

update bbs
set step=step+1
where ref=(select ref from bbs where seq=?)
	-- seq ?번에 해당되는 ref(그룹번호)와 같을 때 -> ref가 ?번인 그룹 다 나옴
	and step>(select step from bbs where seq=?);
	-- 예시) seq가 6번인 글 중에 step(행번호)이 더 클 때
	-- 여섯번째 두번째 답글(6-4-1)을 선택했다면, 6-5-2, 6-6-2, 6-7-1 나옴
	
	--이것들의 step을 하나씩 늘려줘라 = 아래로 밀어라
	--> 6-6-2, 6-7-2, 6-8-1 이 됨.
	
	
insert into bbs(seq, id, ref, step, depth, title, content, wdate, del, readcount)
values (?, 				-- id ( seq는 자동으로 올라가니까 안 넣어줘도됨)
		(select ref from bbs where seq=?),	-- ref
		(select step from bbs where seq=?) +1 ),	
		(select depth from bbs where seq=?) +1 ),
		?, ?, now(), 0, 0)

 

 


게시판 모양

댓글