본문 바로가기

JAVA SPRING

MVC

 

MVC : Model-View-Controller(모델-뷰-컨트롤러) : 웹 애플리케이션을 화면 부분, 요청 처리 부분, 로직 처리 부분으로 나누어 개발하는 방법. 

> 기능이 분리되어 있어 개발, 유지보수가 편리하며 재사용성이 높아진다. 또한 디자이너와 개발자의 작업을 분업화해서 쉽게 개발할 수 있다. 

 

Model: 비즈니스 로직을 처리한다. (DAO, VO)

Contoroller: 사용자의 요청 및 흐름 제어를 담당한다. (서블릿)

View: 사용자에게 보여줄 화면을 담당한다. (JSP)

 

 

 

■ 회원 정보 조회 기능 실습 

 

1. SQL DEVELOPER을 실행해놓는다..!! 

 

저번에 실습하며 add한 찰리 데이터가 테이블에 포함되어 있다. 오라클과 이클립스의 연동이 무사히 되고 있다는 뜻.. 

 

프로젝트를 열었더니 다음과 같은 오류가 난다.

The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path.

말 그래도 서블릿 라이브러리의 경로가 잘못되었는지 인식이 되고 있지 않단 뜻이다. 

 

BuildPath에서 tomcat - lib 폴더에 들어있는 서블릿 api .jar을 다시 등록해준다. 

 

 

컨트롤러 역할을 하는 서블릿 MemberController 클래스를 작성한다. 

init()에서 DAO 객체를 초기화하고, listMembers()메서드를 호출해 회원 정보를 배열 리스트로 반환받는다.

이때 request에 조회한 회원 정보를 바인딩하여 ReqeustDispatcher 클래스로 회원 목록창에 포워딩한다. 

 

 

DAO 클래스를 작성한다. lisMembers()호출을 받으면 SQL문을 이용해 회원 정보를 조회하고, 이 결과를 배열 리스트로 저장하여 return해준다. 이때 PrepareStatement 객체를 생성하면서 SQL문을 인자로 전달하고, 조회한 정보는 레코드별로 VO 객체의 속성에 저장해 memberList에 차례대로 VO 객체들을 저장한다. 

 

VO 객체를 만든다. 인자 네 개를 갖는 생성자와 다섯개를 갖는 생성자를 따로 만든다.

 

View를 담당하는 출력창을 만든다. 컨트롤러에서 포워딩 되어 온 정보가 null인지 null이 아닌지를 검사하여 바인딩된 회원 정보를 차례대로 표시한다. 

 

mem.do로 요청한 결과 

 

 

커맨드 패턴 : 브라우저가 URL 패턴을 이용해 컨트롤러에게 수행 작업을 요청하는 방법. getPathInfo()메서드를 이용해 URL 패턴에서 요청명을 받아와 작업을 수행한다. 

 

findMember()에서는 전달되어져 온 id 정보를 이용해 id값을 데이터베이스에서 조회하고, 조회된 정보를 VO객체에 할당하여 return 한다. modMember은 전달된 수정 회원 정보를 update문을 이용해 수정하고 SQL문을 실행하며, delMember은 삭제 쿼리를 실행한다. 

 

 

컨트롤러에서는 회원 수정창을 요청하는 action이 감지되면 회원 정보를 무조건 findMember()메서드를 사용해 조회한 후 수정창으로 포워딩하게 하고, 수정할 경우 수정된 회원 정보를 가져온 후 VO객체에 설정한다. 이때 msg값에 알맞는 메세지를 전달하여 수정 작업 완료 또는 삭제 작업을 수행하였음을 listMembers.jsp가 확인할 수 있도록 한다. 

 

 

ID를 전달해 수정과 삭제를 요청할 수 있도록 각 데이터베이스 표 옆에 수정과 삭제 버튼을 만든다.

 

실제 수정을 실행하는 Modmember의 경우 수정하기 시 컨트롤러에 /member/modMember.do로 요청하도록 하며, 조회한 정보를 텍스트박스에 표시하되 아이디와 가입 일은 바꿀 수 없도록 disabled 속성을 할당한다. 

 

결과 창에서 수정을 누르면 수정창으로 이동하여 수정을 할 수 있게되고, 삭제를 누르면 즉시 해당 db가 삭제된다. 

 

@WebServlet를 잘못,. 설정해서 한참 허우적거렸다... action이 계속 null로 나오던(ㅠㅠ)

두 단계로 요청이 이루어지는 url패턴을 잘 설정하도록 하자.........

위 코드에서 아래부분을 이렇게 수정준다. 

 

정상적으로 수정창 이동이 된다................. 바보!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

 

삭제도 잘 된다. 

 

 

 

 

이제 답변형 게시판을 구현해본다. 부모 글에 대해 답변 글이 계층 구조로 나열되어 표시되게 할 것이다. SQL 디벨로퍼를 이용해 테이블을 생성하고, 테스트 글을 테이블에 추가한다. 

 

 

실제로 개발을 할 때는 Service클래스를 거쳐 DAO 클래스의 기능을 구현하도록 한다. 모델에 BoardService를 추가하여 구현할 것이다. DAO는 DB에 접근하는 기능을 수행하고, Service는 실제 프로그램을 업무에 적용하는 트랜잭션으로 작업을 수행한다. 

 

즉, 세부기능을 수행하는 SQL문을 DAO에서 구현하고, Service 클래스의 단위 기능 메서드에서 DAO에 만들어놓은 SQL문들을 조합하여 단위 기능을 구현할 것이다. 

 

BoardController 클래스를 작성한다. 컨트롤러이므로 브라우저의 요청을 받고, 그 요청을 처리하는 일을 한다. /listArticles.do로 요청하면 화면에 글 목록을 출력하도록 할 것이다. 위와 마찬가지로 getPathInfo()메서드를 이용하여 action값을 가져오고, null이거나 /listArticles.do일 경우 보드 서비스 클래스의 listArticles()메서드를 호출해 전체 글을 조횐다. 그리고 조회한 글을 바인딩하여 사용자가 보게 될 글 목록창으로 포워딩한다. 

 

Service 클래스에서는 DAO 객체를 생성한 후, selectAllArticle()메서드를 호출하여 전체 글을 가져온다.

 

DAO 클래스이다. Service클래스에서 DAO의 selectAllArticles()메서드를 호출하면, 계층형 SQL문을 이용하여 계층형 구조로 전체 글을 조회한 후 반환한다. 

 

이때 level은 숫자형이므로 getInt()로 값을 가져온 뒤, 글의 정보를 VO객체에 설정한다. 

 

VO클래스를 작성한다. 조회한 글을 저장하는 클래스에 깊이를 저장하는 level 속성을 추가하였다. 

 

사용자가 실제로 마주하게 되는 jsp페이지를 작성한다. <forEach> 태그로 articlesList 속성으로 포워딩된 글 목록을 차례로 전달받아 표시한다. 각 글의 level이 1보다 크면 답글이므로 공백을 만들어 답글을 표시하고, 그렇지 않으면 부모글이므로 공백 없이 표시한다. 

 

실행시킨다.

 

 

 

에러가뜬다.

 

 

톰캣이 잘 실행되지 않는 경우는 1. 어노테이션 url 맵핑이 겹치는 경우나, 2. 톰캣 서버에서의 충돌 오류가 있다. 나는 톰캣을 다시 설정해주었으나 고쳐지지 않아서, 프로젝트를 살펴보았더니 아니나다를까 1의 경우라... 겹치는 어노테이션을 주석처리 해주었다.

 

실행!

 

이번엔 DB 조회가 안된다... 

이럴때 또한 두 가지 안에서 해결된다. 1. DB프로그램을 실행하지 않음. 2. DB연결이 제대로 되지 않음.

서버를 재설정하는 과정에서 context.xml에 연결해두었던 데이터소스 코드가 사라져 일어난 문제였다. 

 

 

 

아래 내용을 context.xml 에 삽입하여 오라클과 이클립스를 연동해준다.

 

이젠 정말 성공!! 

 

 

 

이제 게시판 글쓰기를 구현해 볼 차례다. 그 전에 lib 폴더에 필요한 라이브러리들을 복사해 붙여넣고, 만약 파일이 업로드된다면 파일이 저장될 폴더도 만들어둔다.

 

 

컨트롤러를 작성한다. ACTION값에 따라서 브라우저에 표현할 값을 달리 만든다. 

/addArticle.do인 경우는 upload()메서드를 호출해 Map에 글쓰기창에서 전송되어져 온 글 관련 정보를 key/value 쌍으로 저장하고, 파일을 첨부한 경우는 먼저 파일 이름을 맵에 저장한 후, 첨부 파일을 저장소에 업로드한다. 그 뒤 반환한 맵에서 새 글 정보를 가져와 addArticle() 메서드로 새 글 정보를 전달하여 새로운 글을 등록한다.

 

글에 첨부한 이미지 저장 위치를 상수로 선언하여 사용하며, 새 글의 부모 글 번호를 0으로 설정하고(setParentNo(0)), 입력된 정보를 VO객체에 설정한 후 add함수로 전달한다. 

 

DAO를 작성한다. 기본글 중 가장 큰 번호를 조회하여 그 번호에 1을 더한 값을 return(rs.getInt(1) + 1); 하여 새로 작성된 글의 글번호를 지정한다. 

첨부 파일을 업로드할 때 <form> 태그의 enctype 속성을 multipart/form-data로 설정하는 것에 주의해야 한다. 

 

 

 

우리고양이가 전원버튼을 밟아주셔서 난데없이 재시작당한바람에 쓴글이 세번이나 날라갔다... 

수정과 삭제도 만들었는데,.

그래서 다음글은 바로 스프링 프레임워크로 들어간다. 어차피 똑같은거 할거니깐!! 

'JAVA SPRING' 카테고리의 다른 글

스프링-마이바티스 연동, 애너테이션  (0) 2021.08.05
마이바티스 프레임워크 CRUD  (0) 2021.08.05
HTML5 와 제이쿼리  (0) 2021.07.28
JSTL  (0) 2021.07.27
JSP 스크립트, 액션 태그  (0) 2021.07.27