앞서 만들었던 게시판 리스트이다. (현재는 글쓰기 안됨)

 

백단의 DAO, VO, Service, Controller와 프론트단의 list.jsp가 어떻게 유기적으로 소통하는지 살펴본다.

"<-----화살표로 끊어지는 로직을 설명해놓았다.

 

여기 코딩 들은 단순 설명용 코딩이니 복붙해서 실행해도 안먹는다.

 

 

1-1. Controller // 리퀘스트 맵핑

주소창에 localhost:8080/list라고 입력하면 디스패처가 컨트롤러로 전달해준다.

Bcontroller에서 일련의 과정을 처리한다.

 

Bcontroller.java

@RequestMapping("/list")

public String list(Model model) {

cmd = new ListCmd(); <-------여기서 Service 클래스를 참조한다.

/*
cmd.service(model); 

return "list";



}
*/

 

2-1. Service //  DAO 참조

ListCmd는 Bcmd 인터페이스를 참조하지만 Bcmd 없이 ListCmd로 만들어줘도 된다. 

 

ListCmd.java

public class ListCmd implements Bcmd {

	@Override
	public void service(Model model) {
		
		BDAO dao =new BDAO(); <------------여기서 DAO클래스를 참조한다.
      	
        
/*        
        
        ArrayList<BVO> bVOs = dao.list(); 

		model.addAttribute("list", bVOs);
	}

}
*/

 

3-1. DAO // JNDI 네이밍을 이용하여 오라클 Lookup

실재로 SQL문을 데이터베이스에서 실행시키게끔 하는 클래스이다. 객체는 VO에서 참조한다.

 

BDAO.java

public class BDAO {
	DataSource dataSource; //데이타소스를 가져오는 구문
	
	//생성자
	public BDAO() {
		//JNDI 를 사용한다. JNDI란 자바에서 객체를 네이밍 서비스에 등록, 삭제, 검색을 할 수 있는 방법
		
		try{
			
			Context ctx = new InitialContext(); //JNDI 네이밍 서비스 컴파일해줌
			dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/Oracle11g");
			//lookup으로 데이타소스의 객체를 얻어온다. java:comp/env/는 기본이며 그뒤의 이름은 톰캣서버 context.xml의 name을 참조한다.
			
	} catch(NamingException e) {
		e.printStackTrace();
	}
		
}

	public ArrayList<BVO> list() {
		//DB에 있는 글목록들을 가져오는 역할 형식은 ArrayList이고 BVO타입. 칼럼정보가 BVO에 있다.
		
		ArrayList<BVO> bVOs = new ArrayList<BVO>(); <-------여기서 VO를 참조하여 ArrayList 객체를 만든다.
		
/*        
		//////연결을 위한 3구문/////
		Connection connection = null; //커넥션 javax
		PreparedStatement preparedStatement = null; //프리패어드 스테이트먼트 javax		
		ResultSet resultSet = null;  //데이터를 가져오는 기능의 리절트셋 javax
		//////////////
		
		
		try {
		connection = dataSource.getConnection();
		
		//쿼리문을 만들어줌
		String sql = "select bNo, bName, bSubject, bContent, bDate, bHit, bGroup, bStep, bIndent from mvc_bbs"
					+ " order by bGroup desc, bStep asc";
		
		preparedStatement = connection.prepareStatement(sql); //preparedStatement에 전송
		
		resultSet = preparedStatement.executeQuery(); //result값 데이터를 가져오는 것
		
		while(resultSet.next()) {
			//Resultset 다음행에 데이터가 있으면 while 문으로 반복 작업을 함		
			
			//vo의 9인자를 참조해서 작성
			int bNo = resultSet.getInt("bNo");
			String bName = resultSet.getString("bName");
			String bSubject = resultSet.getString("bSubject");
			String bContent = resultSet.getString("bContent");
			Timestamp bDate = resultSet.getTimestamp("bDate");
			
			int bHit = resultSet.getInt("bHit");
			int bGroup = resultSet.getInt("bgroup");
			int bStep = resultSet.getInt("bStep");
			int bIndent = resultSet.getInt("bIndent");
			///////
			
			//인자생성자
			BVO bVO = new BVO(bNo, bName, bSubject, bContent, bDate, bHit, bGroup, bStep, bIndent); <--여기서도 VO 참조
			
			bVOs.add(bVO); //bVOs라는 어레이에 bVO 추가함
		}
				
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			
			//finally 안에 있는 구문
			try {
				//null이면 구문들을 다 안쓰는 것
				if(resultSet !=null) resultSet.close();
				if(preparedStatement != null) preparedStatement.close();
				if(connection != null) connection.close();
				
			} catch (Exception e2) {	
				e2.printStackTrace();
			}
	
		}
		
		return bVOs;	
	}
	
}
*/

 

4-1. VO // 변수 선언

DAO에서 최초로 VO를 불러내었다. VO에서는 따로 참조하는 클래스가 없다.

VO에서는 순수하게 변수선언, 인자생성, setter/getter만 만들어준다.

따라서 코딩할때 가장 먼저 작성되어야할 클래스이기도 하다.

 

BVO.java

public class BVO {
	
	//db에서의 인덱스를 변수로 지정해준다. 각자의 형식에 맞춰서 형식을 지정해준다.
	//VO클래스는 변수선언, 인자생성자, setter getter 이렇게 3개로 나뉜다.
	
	//1.변수 선언
	int bNo;
	String bName;
	String bSubject;
	String bContent;
	Timestamp bDate;  //timestamp는 sql에서 불러오면됨
	int bHit;
	int bGroup;
	int bStep;
	int bIndent;
	
//	public BVO() {
//		
//	}
	
	
	//2.인자생성자
	public BVO(int bNo, String bName, String bSubject, String bContent, Timestamp bDate, int bHit, int bGroup, int bStep, int bIndent) {
		this.bNo = bNo;
		this.bName = bName;
		this.bSubject = bSubject;
		this.bContent = bContent;
		this.bDate = bDate;
		this.bHit = bHit;
		this.bGroup = bGroup;
		this.bStep = bStep;
		this.bIndent = bIndent;
	}
	
	
	//3.setter getter
	public int getbNo() {
		return bNo;
	}

	public void setbNo(int bNo) {
		this.bNo = bNo;
	}

	public String getbName() {
		return bName;
	}

	public void setbName(String bName) {
		this.bName = bName;
	}

	public String getbSubject() {
		return bSubject;
	}

	public void setbSubject(String bSubject) {
		this.bSubject = bSubject;
	}

	public String getbContent() {
		return bContent;
	}

	public void setbContent(String bContent) {
		this.bContent = bContent;
	}

	public Timestamp getbDate() {
		return bDate;
	}

	public void setbDate(Timestamp bDate) {
		this.bDate = bDate;
	}

	public int getbHit() {
		return bHit;
	}

	public void setbHit(int bHit) {
		this.bHit = bHit;
	}

	public int getbGroup() {
		return bGroup;
	}

	public void setbGroup(int bGroup) {
		this.bGroup = bGroup;
	}

	public int getbStep() {
		return bStep;
	}

	public void setbStep(int bStep) {
		this.bStep = bStep;
	}

	public int getbIndent() {
		return bIndent;
	}

	public void setbIndent(int bIndent) {
		this.bIndent = bIndent;
	}
	
}

 

간단히 "VO > DAO > Service > 컨트롤러"  이 순서대로 불러와진다고 보면된다.

다시 3. DAO로 거슬러 돌아간다.

 

 

3-2. DAO // 남은 부분처리

 

남은 부분을 처리 해주고 끝부분에서는 bVOs ArrayList를 리턴해준다.

 

BDAO.java

public class BDAO {
	/*DataSource dataSource; //데이타소스를 가져오는 구문
	
	//생성자
	public BDAO() {
		//JNDI 를 사용한다. JNDI란 자바에서 객체를 네이밍 서비스에 등록, 삭제, 검색을 할 수 있는 방법
		
		try{
			
			Context ctx = new InitialContext(); //JNDI 네이밍 서비스 컴파일해줌
			dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/Oracle11g");
			//lookup으로 데이타소스의 객체를 얻어온다. java:comp/env/는 기본이며 그뒤의 이름은 톰캣서버 context.xml의 name을 참조한다.
			
	} catch(NamingException e) {
		e.printStackTrace();
	}
		
}

	public ArrayList<BVO> list() {
		//DB에 있는 글목록들을 가져오는 역할 형식은 ArrayList이고 BVO타입. 칼럼정보가 BVO에 있다.
		
		ArrayList<BVO> bVOs = new ArrayList<BVO>(); <-------여기서 VO를 참조하여 ArrayList 객체를 만든다.
		*/
        
		//////연결을 위한 3구문/////
		Connection connection = null; //커넥션 javax
		PreparedStatement preparedStatement = null; //프리패어드 스테이트먼트 javax		
		ResultSet resultSet = null;  //데이터를 가져오는 기능의 리절트셋 javax
		//////////////
		
		
		try {
		connection = dataSource.getConnection();
		
		//쿼리문을 만들어줌
		String sql = "select bNo, bName, bSubject, bContent, bDate, bHit, bGroup, bStep, bIndent from mvc_bbs"
					+ " order by bGroup desc, bStep asc";
		
		preparedStatement = connection.prepareStatement(sql); //preparedStatement에 전송
		
		resultSet = preparedStatement.executeQuery(); //result값 데이터를 가져오는 것
		
		while(resultSet.next()) {
			//Resultset 다음행에 데이터가 있으면 while 문으로 반복 작업을 함		
			
			//vo의 9인자를 참조해서 작성
			int bNo = resultSet.getInt("bNo");
			String bName = resultSet.getString("bName");
			String bSubject = resultSet.getString("bSubject");
			String bContent = resultSet.getString("bContent");
			Timestamp bDate = resultSet.getTimestamp("bDate");
			
			int bHit = resultSet.getInt("bHit");
			int bGroup = resultSet.getInt("bgroup");
			int bStep = resultSet.getInt("bStep");
			int bIndent = resultSet.getInt("bIndent");
			///////
			
			//인자생성자
			BVO bVO = new BVO(bNo, bName, bSubject, bContent, bDate, bHit, bGroup, bStep, bIndent); <--여기서도 VO 참조
			
			bVOs.add(bVO); //bVOs라는 어레이에 bVO 추가함
		}
				
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			
			//finally 안에 있는 구문
			try {
				//null이면 구문들을 다 안쓰는 것
				if(resultSet !=null) resultSet.close();
				if(preparedStatement != null) preparedStatement.close();
				if(connection != null) connection.close();
				
			} catch (Exception e2) {	
				e2.printStackTrace();
			}
	
		}
		
		return bVOs; <----list()메소드 끝부분에서는 bVOs ArrayList를 리턴해준다.
	}
	
}

 

다시 2. Service로 거슬러 올아간다.

 

2-2. Service //

dao.list()에서 Return시킨 bVOs를 cmd의 bVOS에도 저장 시킨다.

그리고 이 bVOS를 "list"란 이름의 모델명에 적용시킨다.

 

ListCmd.java

public class ListCmd implements Bcmd {
/*
	@Override
	public void service(Model model) {
		
		BDAO dao =new BDAO(); <------------여기서 DAO클래스를 참조한다.
 */     	
       
        
        ArrayList<BVO> bVOs = dao.list(); <---list()에서 리턴된 bVOs를 bVOs에 저장

		model.addAttribute("list", bVOs);
	}

}

 

적용시킨 모델명 "list"는 컨트롤러를 통해서 list.jsp로 값을 보내주게된다. (또는 불러오게)

 

그리고 public void service(Model model)에서 model이 아닌 이름을 내가 아무렇게나 지정해도 된다.

한국의 주입식 교육의 폐해 중 하나가 이건 vo로 써야하고, 이건 model로 써야하고 이건 dao로 써야 하는 것으로 알고 가르치는 것이다.

 

편의상 그렇게 쓰는 것이지 소문자로 시작하는 것은 내가 정한 변수이므로 아무렇게나 지정해줘도 된다.

이른바 아래처럼

 

 ListCmd.java

public class ListCmd implements Bcmd {

	@Override
	public void service(Model abcdefg) {
		
		BDAO dddddddd=new BDAO(); <------------여기서 DAO클래스를 참조한다.
    	
       
        
        ArrayList<BVO> qwerqwer = dddddddd.list(); <---list()에서 리턴된 bVOs를 bVOs에 저장

		abcdefg.addAttribute("list", qwerqwer);
	}

}

 

극단적인 예로 이렇게 한것이다. 복사 붙혀넣기만 하지말고 이렇게 변수를 이거저거 바꾸어 적용해보고 하면 온전히 나의 것으로 만들 수 있다.

 

 

ListCmd 클래스에서는 이렇게 모델을 지정해주는 것으로 끝났고, 이제 Back단 중 마지막으로  1. Controller로 올라가보자.

 

1-2. Controller // 뷰페이지로 이동

cmd= new ListCmd()로 서비스를 가져와서 cmd에 저장해주었다.

 

하지만 거기서 끝이 아니라 cmd안의 service()메소드를 실행시켜줘야 작동한다.

service(model)의 model은 물론 변수이기 때문에 아무렇게나 지정해줘도 된다.

 

@RequestMapping("/list")
public String list(Model model) {
/*
cmd = new ListCmd(); <-------여기서 Service 클래스를 참조한다.
*/

cmd.service(model); <-------ListCmd의 service()메소드를 실행시킨다.

return "list"; <-------list.jsp를 사용자에게 보여준다.



}

list로 리턴하였으므로 list.jsp로 넘어간다.

 

5. 뷰페이지 // list.jsp

여기서는 다른 내용은 볼것없고 <Table>태그 안의 내용만 보면 된다.

태그라이브러리를 이용할 것이므로 맨 윗부분에 <%@ taglib prefix = "c" uri="http://java.sun.com/jsp/jstl/core" %>를 붙여주었다.

 

<c:forEach items="${list}" var="vo">

</c:forEach>

구문을 통하여 아까 모델로 지정해주었던 "list"를 불러온다.

 

이 list라는 모델에는 bNo, bSubject 등의 행들이 리스트형태로 저장되어 있다.

forEach라는 이름에 걸맞게 태그안에서 각각의 행들을 모두 불러와준다.

 

그리고 ${vo.bNO} 등을 통하여 그 모델값을 불러올 수 있다.

 

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <% request.setCharacterEncoding("utf-8"); %>
<%@ taglib prefix = "c" uri="http://java.sun.com/jsp/jstl/core" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" http-equiv="Content-Type" content="text/html;">
<title>게시판 리스트</title>
</head>
<body>

<div align="center">
	<h2>게시판 글목록</h2>
	<hr width="400" color="red" />
	
	<table border="1" cellpadding="0" cellspacing="0" width="500">
		<tr>
			<td>번호</td>
			<td>제목</td>
			<td>작성자</td>
			<td>날짜</td>
			<td>조회수</td>
		</tr>
 
				<!-- 게시글 목록 가져오기 -->
		<c:forEach items="${list}" var="vo">	
		<!-- ListCmd에서 만들었던 모델 list를 컨트롤러를 통해 받아온다.-->
		<tr>
			<td>${vo.bNo}</td>
			<td>${vo.bSubject}</td>
			<td>${vo.bName}</td>
			<td>${vo.bDate}</td>
			<td>${vo.bHit}</td>
		</tr>
		</c:forEach>
		<tr>
			<td colspan="5" align="center"><a href="writeForm">글쓰기</a></td>
		</tr>
		
	</table>
    
   
</div>
<div>
</div>

</body>
</html>

 

다음 포스팅에선 글쓰기 기능을 추가해본다.

 

 

+ Recent posts