이번에는 db를 불러와서 리스트로 보여주기 위해 필요한 과정이다.

아래와 같은 파일들을 만들어 주어야한다. (WriteCmd.java 제외)

 

1. VO 클래스 만들기

Value Object로 가장 기초가 되는 객체들을 정의 해놓는 클래스이다.

SQL문에서 지정해놓았던 것들과 이름을 같게 해준다.

 

BVO.java

package com.spring.bbsVO;

import java.sql.Timestamp;

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;
	}
	
}

 

2. DAO 클래스 만들기

DAO는 Database access object의 약자로 말그대로 SQL에 접근시켜주는 역할을 맡는다.

쿼리문도 여기다 작성한다.

 

많은 방법이 있지만 JNDI 네이밍 서비스를 활용하여 오라클을 LOOKUP해주는 것으로 시작한다.

 

BDAO.java

package com.spring.bbsDAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;

//import javax.activation.DataSource; 액티베이션 아님
import javax.naming.Context; //JNDI
import javax.naming.InitialContext; //JNDI
import javax.naming.NamingException; //JNDI
import javax.sql.DataSource;

import com.spring.bbsVO.BVO;

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();
	}
		
}
	//리스트 보여주기 위한 메소드 list()
	public ArrayList<BVO> list() {
		//DB에 있는 글목록들을 가져오는 역할 형식은 ArrayList이고 BVO타입. 칼럼정보가 BVO에 있다.
		
		ArrayList<BVO> bVOs = new ArrayList<BVO>(); //ArrayList형태의 bVOs 객체 생성
		
		//////연결을 위한 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);
			
			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() 메소드 중료
}

 

3. service 클래스 만들기

여기서는 cmd라고 한다. 인터페이스 형태로 만들어져 컨트롤러에서 service 클래스를 호출하게 된다.

(클라이언트 > 디스패처 > 컨트롤러 > service 클래스 순으로 요청이 된다.)

 

우선 com.spring.bbsCommand 패키지 안에 Bcmd라는 인터페이스를 만든다.

 

Bcmd.java  (인터페이스 형식)

package com.spring.bbsCommand;

import org.springframework.ui.Model;

//데이터를 가져오는 역할
public interface Bcmd {
	void service(Model model);
	//파라미터를 생성하는 방법 또는 리턴타입을 생성하는 경우가 있음
}

 

 

컨트롤러에서 Model을 불러옴. 위에 것은 인터페이스이기에 Overriding 해줘야함.

 

모델을 불러오는 방법에는 두가지가 있다.

1. 파라미터 이용

2. 리턴타입 이용

위는 파라미터 형태로 불러왔다.

 

그리고 실제로 db를 받아서 저장하는 ListCmd.java를 com.spring.bbsCommand 패키지 안에 만든다.

 

ListCmd.java

package com.spring.bbsCommand;

import java.util.ArrayList;

import org.springframework.ui.Model;

import com.spring.bbsDAO.BDAO;
import com.spring.bbsVO.BVO;

//이 객체의 목적: 데이터베이스를 받아 모델로 만들어줌

public class ListCmd implements Bcmd {
	//Bcmd 인터페이스를 가져와서 오버라이드함.
	//이 객체를 만들고 컨트롤러에서 활용하면 됨
	

	@Override
	public void service(Model model) {
		
		BDAO dao =new BDAO(); //BDAO.class를 불러온 dao 변수 생성
		
		ArrayList<BVO> bVOs = dao.list();  //dao의 list를 bVOs에 저장함
		
		//model.addAttribute("test01", "컨트롤러에서 받아오는지 테스트하는 용도");
		
		model.addAttribute("list", bVOs); //list 변수에 bvos 추가, 이 "list"는 return 값을 할 수 있음
		//JSP에서 ${list}를 입력하면 bVOs를 가져옴. 컨트롤러에 cmd.service(model)이  이 모델을 가져오기 때문

	}

}

 

 

4. Controller 만들기

 

컨트롤러는 페이지 매핑을 주로 담당한다. 

아래와 같이 Bcontroller.java를 생성한다.

 

주저리 주저리 말안하고 자세한 것은 아래 코드 주석으로 설명한다.

 

Bcontroller.java

package com.spring.bbsController;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.spring.bbsCommand.Bcmd;
import com.spring.bbsCommand.ListCmd;
//import com.spring.bbsCommand.WriteCmd;
import com.spring.bbsVO.BVO;

@Controller
public class BController {
	Bcmd cmd = null; //Bcmd 인터페이스를 불러와서 cmd에 저장해준다.

	
	@RequestMapping("/list")
	public String list(Model model) {
		//String으로 list 메소드를 생성했으니 리턴값도 String이다. RequestMapping의 아래는 대부분 String메소드이다.
		//파라미터형태로 모델 생성
		//모델의 역할은 뷰에게 데이터를 전달하기 위한 객체
		//여기서는 모델활용안하고 Bcmd.class에서 모델을 활용함.
		
		System.out.println("------------------list() 호출-------------");//에러날때를 대비해서 써줌
		//Model은 뷰에 데이터를 전달하기 위한 방법
		cmd = new ListCmd(); 	//Bcmd 인터페이스를 가져온 녀석에다 ListCmd()를 넣어줌
		//위에서 Bcmd cmd = null;을 안해주고 곧바로 이것을 해줘도 되지만 의존성을 낮추기 위해서 이렇게 해줌
		
		cmd.service(model);	//모델을 인자로 넘겨줌. 서비스를 시행
		
		return "list";
	}
}

 

5. view 페이지 만들기

앞 컨트롤러에서 list로 리턴을 해주었으니 파일명을 list.jsp를 만들어 준다.

viewResolver 설정을 확장자가 저절로 생기게끔 했기 때문에 "list"만 적어주면된다.

 

프론트로 보여주는 것은 태그라이브러리를 사용한다.

 

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>

 

 

실행 결과

톰캣을 가동한 뒤 localhost:8080/list를 들어가보면 아래와 같이 뜸을 확인할 수 있다.

값은 미리 sql문을 통해서 넣은 것이다.

 

localhost:8080/list

노캐쉬 설정을 안하면 컴퓨터를 껐다 킬때마다 시쿼스가 20씩 증가해서 번호가 이상해지는데 그것을 방지하기 위해 아까 시퀀스를 만들때 nocache 구문을 넣어준 것이다.

 

"ALTER SEQUENCE seq_bbs nocache"로도 캐쉬미사용 설정을 할 수 있다.

 

아직 글쓰기 부분은 코딩하지 않았으니 글쓰기를 누르면 실행안되는 것이 맞다.

 

글쓰기 기능 작성으로 넘어가기전에 다음 포스팅에서는 어떻게 해서 리스트를 보여주는지 절차를 한번 짚고 넘어가도록한다.

 

저게 단순해서 몇번 반복하면 알아 들을것 같지만 세세하게 복기를 안하면 알기 힘들다.

+ Recent posts