아까 작성하였던 contentView.jsp에서 수정하기와 삭제하기를 활성화해보겠다.

 

1. 뷰페이지 경로 설정

 

contentView.jsp를 수정해준다.

수정하기를 클릭하면 submit이 되고 삭제버튼을 누르면, /delete?bNO=1처럼 url이 변경된다.

이를 컨트롤러에서 조정해주면 된다.

또한 글번호는 input hidden으로 해줘서 submit이 되었을 때 글번호를 HttpServletRequest에 잘 저장되도록 한다.

 

contentView.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>글내용 보기</title>
</head>
<body>
		<div align="center">
			<h2>글내용 확인</h2>
			<hr width="500" color="green" />
			<table width="500" cellpadding="0" cellspacing="0" border="1">
			<form action="modify" method="post">
			<!-- 값을 보내기 위해 No.는 히든값으로 숨겨둠 -->
			<input type="hidden" name="bNo" value="${contentView.bNo }" />
		
			<tr>
				<td>번호</td>
				<td>${contentView.bNo}</td>
			</tr>
			<tr>
				<td>조회수</td>
				<td>${contentView.bHit}</td>
			</tr>
						<tr>
				<td>작성자</td>
				<td><input type="text" name="bName" value="${contentView.bName }"></td>
			</tr>
						<tr>
				<td>제목</td>
				<td><input type="text" name="bSubject" value="${contentView.bSubject}"></td>
			</tr>
						<tr>
				<td>내용</td>
				<td><textarea rows = "10" name="bContent">${contentView.bContent}</textarea></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><input type="submit" value="수정하기" />
								&nbsp;&nbsp;&nbsp;<a href="list">목록보기</a>
								&nbsp;&nbsp;&nbsp;<a href="delete?bNo=${contentView.bNo}">삭제</a>
								&nbsp;&nbsp;&nbsp;<a href="#">답변</a>
				</td>
			</tr>
			
			
			</form>
			
			
			</table>
			
			
		</div>
		</body>
</html>

 

2. 컨트롤러 설정

BController.java에 리퀘스트맵핑 modify와 delete를 추가한다.

둘다 리턴은 리다이렉트 list로 해준다.

 

BController.java

@RequestMapping(value="/modify", method=RequestMethod.POST)
	//@RequestMapping("/modify")
	public String modify(HttpServletRequest request, Model model) {
		System.out.println("-----modify() 호출");
		
		model.addAttribute("request", request);//model에 글제목, 글내용 들의 정보 주입
		//System.out.println(request);
		
		cmd = new ModifyCmd();
		cmd.service(model);
		
		return "redirect:list";
	}
	
	
	@RequestMapping("/delete")
	public String delete(HttpServletRequest request, Model model) {
		System.out.println("------delete() 호출------");
		
		model.addAttribute("request", request);//model에 글제목, 글내용 들의 정보 주입
		cmd = new DeleteCmd();
		cmd.service(model);
		
		
		return "redirect:list";
	}

 

3. command 클래스 설정

위 컨트롤러에서 메소드를 정의 해줬으므로 bbsCommand패키지에 ModifyCmd.java와 DeleteCmd.java 두 파일을 생성한다.

자바파일은 앞이 대문자로 시작해주는 것에 주의한다.

 

modify와 delete 모두 비슷하다.

받아온 모델을 맵으로 바꾸고 그맵을 HttpServletRequest로 형변환 한뒤 그 안의 bName, bContent 같은 정보를 꺼내어 String으로 저장해준다.

 

그리고 그 객체들을 파라미터로 하여 bDAO의 메소드를 실행시킨다.

bDAO의 메소드는 Cmd 코드를 작성한 뒤 작성해준다.

 

아래 코드를 복사붙여넣기 하자.

 

ModifyCmd.java

package com.spring.bbsCommand;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.spring.bbsDAO.BDAO;

public class ModifyCmd implements Bcmd {

	@Override
	public void service(Model model) {
		Map<String, Object> map = model.asMap(); //model을 맵형태로 변환
		HttpServletRequest request = (HttpServletRequest) map.get("request");
		//HttpServeltRequest 작동원리
		//사용자가 input에 값을 입력하고 submit을 한다. -> input값의 내용들이 HttpServletRequest에 저장이 된다.
		//서블릿리퀘스트에 저장된 내용을 request.getParameter()와 model.addAttribute()로 view에 뿌려줄 수 있다.
		
		//
		String bNo = request.getParameter("bNo");
		String bName = request.getParameter("bName");
		String bSubject = request.getParameter("bSubject");
		String bContent = request.getParameter("bContent");
		
		BDAO bDAO = new BDAO();
		bDAO.modify(bNo, bName, bSubject, bContent); //위에서 정의한 파라미터를 넣어줌
		
	}
}

 

 

DeleteCmd.java

package com.spring.bbsCommand;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.spring.bbsDAO.BDAO;

public class DeleteCmd implements Bcmd {

	@Override
	public void service(Model model) {
		
		Map<String, Object> map = model.asMap();
		HttpServletRequest request = (HttpServletRequest)map.get("request");
		
		String bNo = request.getParameter("bNo");
		BDAO bDAO = new BDAO();
		bDAO.delete(bNo);
	}
	
}

 

4. DAO 설정

이번 챕터의 하이라이트이다.

 

BDAO에서 쿼리문을 실행시켜주는 메소드를 만든다. 다행히도 이번포스팅에서는 VO 패키지는 건들지 않는다.

DAO 설정 또한 전 챕터처럼 connection과 preparedStatement를 사용한다.

 

매우 많은 오타를 유발하므로 복사 붙여넣기 또는 crtl+T를 활용하는 것을 추천한다.

 

아래 코드를 BDAO.java에 추가한다.

 

//modify 메소드
	public void modify(String bNo, String bName, String bSubject, String bContent) {
		
		//커넥션과 프리페어드스테이트먼트를 초기에 null로 설정
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		
		try {
			connection = dataSource.getConnection();
			System.out.println("커넥션 확보!! -----------");
			
			String sql = "update mvc_bbs set bName=?, bSubject=?, bContent=? where bNo=?";
			preparedStatement = connection.prepareStatement(sql);//프리페어드스테이트먼트에 접속
			
			//물음표가 4개이므로 1에서 4까지 setString 해줌
			preparedStatement.setString(1, bName);
			preparedStatement.setString(2, bSubject);
			preparedStatement.setString(3, bContent);
			preparedStatement.setInt(4, Integer.parseInt(bNo));
			
			int n = preparedStatement.executeUpdate();//추후 사용
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				//자원반납
				if(preparedStatement != null) preparedStatement.close();
				if(connection != null) connection.close();
				
			} catch (Exception e2){
				e2.printStackTrace();
			}
		}
	}//modify()
	
	
	//delete 메소드
	public void delete(String bNo) {
		Connection connection  = null;
		PreparedStatement preparedStatement = null;
		try {
			connection = dataSource.getConnection();
			
			String sql = "delete from mvc_bbs where bNo = ?";
			System.out.println("asdasd");
			preparedStatement = connection.prepareStatement(sql);
			preparedStatement.setInt(1, Integer.parseInt(bNo));
			
			int n = preparedStatement.executeUpdate();//추후 사용
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(preparedStatement != null) preparedStatement.close();
				if(connection != null) connection.close();				
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

 

 

코딩은 이제 끝났다.

내용보기에서 삭제 버튼을 누르면 삭제된 뒤 list페이지로 리다이렉트 된다.

참고 이 delete query문은 현업에선 거의 안쓰이고, 대신에 안보이게 숨긴다. 

 

예를 들어 1번글을 삭제한다고 할 때, delete from mvc_bbs where bNo=1 << 이렇게 쓰지 않고,

use 열 하나를 추가한다.

그리고 update mvc_bbs set use='N' where bNo=1 로 지정하여 리스트에는 use가 N인 행은 보이지 않게 한다.

 

다음으로 수정을 해보자.

아래는 1번 글이다.

 

 

저 내용 부분에 '11111111111111'을 적은 뒤 수정하기 버튼을 누르면 리스트페이지로 나가지고,

다시 들어오면 아래와 같이 수정되어 있는 것을 볼 수 있다.

 

하지만 실제 게시판에는 저런 식으로 수정되는 것이 아니라 처음에는 read만 되게끔했다가 수정버튼을 누르면 수정할 수 있게 바뀐다.

 

그리고 수정 확인을 누르면 반영되면서 다시 read only상태로 바뀐다. 이것은 jquery나 자바스크립트로 textarea 속성을 클릭할 때 바꿔주게 만들면 된다.

 

예를 들어 수정하기를 누르면 readonly="true", 수정이 끝난 뒤 확인버튼을 누르면 readonly="false"가 되는 식으로 하면 된다.

 

 

수정, 삭제까지 한 부분은 아래 파일에 올려 놓았다.

springBBS 수정과 삭제까지.zip
0.07MB

 

 

 

이로써 기본적인 CRUD 기능은 끝났다.

 

다음 챕터에서는 댓글달기 기능을 해본다.

 

 

 

앞서 작성했던 게시판 페이지이다.

 

이번 포스팅에서 구현할 기능은 아래와 같다.

 

1. 글쓰기를 누르면 글쓰기 페이지로 넘어감

2. 글쓰기 페이지에서 제목과 내용 등을 입력하여 submit해주면 db에 입력이 됨

3. 리스트 페이지로 리다이렉트로 되어 업데이트된 페이지를 보여줌

 

1. 글쓰기 JSP파일 만들기

 

list.jsp와 같은 경로에 writeForm.jsp를 만들어 아래와 같이 코딩을 해준다.

 

writeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<div align="center">
	<h2>글쓰기 페이지</h2>
	<hr width="500" />
	<table width="500" cellpadding="0" cellspacing="0" border="1">
		<form:form commandName="_BVO" action="writeOK" method="post">
			<tr>
				<td>작성자</td>
				<td><form:input path="bName" size="20" /></td>
			</tr>
			<tr>
				<td>제목</td>
				<td><form:input path="bSubject" size="50" /></td>
			</tr>
			<tr>
				<td>내용</td>
				<td><form:textarea path="bContent" cols="60" rows="8" /></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><input type="submit" value="등록" /></td>
			</tr>
		</form:form>
	
	</table>
</div>

</body>
</html>

아까는 prefix="c"를 사용하였지만 여기에서는 태그라이브러리 prefix="form"을 사용하였다. 

 

<form:form> 태그안에 commandName은 modelAttribute로 바꾸어 사용해도 된다. 컨트롤러에서 BVO()를 리턴하게끔 모델을 정해주는 역할이다.

 

그리고 action은 어떤 url로 이동할지 정해주고, 이를 컨트롤러에서 받아와서 처리해준다.

method는 post이다.

 

그리고 <form:input>태그안에는 path 구문을 넣어 입력값이 어떤 객체로 들어갈 것인지 정해준다.

 

2. VO 작성

VO는 한번 작성하면 db의 항목이 변동되지 않는 이상 바꾸는 경우는 잘 없다.

아까 변수 선언 구문 아래에 주석 처리 되있었던  public BVO() { }만 주석을 해제해준다.

 

3. Controller 작성

여기서 작성해야 될 것은 2가지 메소드이다.

하나는 글쓰기 작성 jsp파일로 이동시키는 writeForm() 메소드이고, 하나는 글쓰기 form을 submit했을 때 처리되게끔 하는 writeOk()메소드이다.

 

구문에 대한 상세설명은 주석에 적어 놓았다.

 

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.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";
	}
	
	
	@RequestMapping("/writeForm")
	public String writeForm(Model model) {
		System.out.println("----------writeForm() 호출----------");
		
		return "writeForm";
	}
//	
//	//write폼 >>BController >> WriteCmd로 전달
	@RequestMapping("/writeOK")
	public String writeOk(HttpServletRequest request, Model model) {
		//데이터를 컨트롤러로 보냈을때, HttpServletRequest 객체안에 모든 데이터들이 들어가게 된다. 출처: https://hongku.tistory.com/118
		//String id = httpServletRequest.getParameter("id"); <<id를 불러옴
		
		System.out.println("----------writeOk() 호출-------------");
		
		model.addAttribute("request_ctrl", request); //이 request값에 formWrite에서 적었던 내용이 들어있음
		
		//서비스객체 불러옴
		cmd = new WriteCmd();
		cmd.service(model);
		
		return "redirect:list"; //등록한글을 리스트로 보여줌
	}
	
	//commandName="_BVO"와 관계 있음
	@ModelAttribute("_BVO") 
	public BVO formBacking() {
		
		return new BVO(); //BVO 안에 빈메소드로 연결됨
	}
}

 

/writeOK 리퀘스트 매핑에서는 HttpServletRequest라는 객체가 새로 생겼다.

 

그 이유는 /writeOK는 페이지를 보여주는 것이 아닌 form에서 submit된 데이터를 처리하는 용도이기 때문이다.

 

writeForm.jsp에서 submit하면 맨 끝 주소가 /writeForm에서 /writeOk로 주소가 변경되며, 컨트롤러에선 이를 받아온다.

이 때, 데이터들이 HttpServletRequest의 request안에 저장된다.

 

이 저장된 정보들을 꺼내오면 되는 것이다.

 

컨트롤러에서는 modelAttribute까지만 해주고, 데이터 저장 작업은 Service 클래스에서 해준다.

 

4. Service 작성

request에 모델 형태로 저장되었지만 이를 맵형태(키, 밸류)로 저장해준다.

 

위에서 모델을 잡아줄 때 왜 request_ctrl로 명했냐면, 그냥 request라고 할 경우 이것이 어디서 왔는지 헷갈린다.

 

실무에서야 그냥 쓰면 된다지만, 배우는 사람 입장에서는 이것이 어디서 왔는지 명확히 짚고 넘어가는 것이 중요하다.

 

블로그나 책에 req라고 나왔다고 그대로 req라고 쓰고 con이라고 나왔다고 con이라고 쓰는 것이 아니라 이것이 무엇을 의미하고 어느 클래스에서 왔는지, 또 내가 지정한 임의의 이름으로 넣었을 때 실행되는지 실험하면서 진행해가는 것이 실력향상에 도움이 된다.

 

WriteCmd.java

package com.spring.bbsCommand;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.spring.bbsDAO.BDAO;

public class WriteCmd implements Bcmd {

	@Override
	public void service(Model model) {
		
		System.out.println("model: "+model);
		//모델의 정보 model: {_BVO=com.spring.bbsVO.BVO@788ca69c, request_ctrl=org.apache.catalina.connector.RequestFacade@764b47fd}
		//아까 컨트롤러에서 정의해줬던 모델명 request_ctrl를 그대로 가져오는 것을 볼수 있다.
		
		Map<String, Object> map = model.asMap(); //모델객체를 맵으로 받음. 해쉬맵을 사용해도 무방
		//_BVO
		
		HttpServletRequest request = (HttpServletRequest)map.get("request_ctrl");		
		//map에 저장된 request_ctrl의 밸류값을 request에 저장
		//request_ctrl은 컨트롤러에서 모델어트리뷰트 해준 것임
		
		
		String bName = request.getParameter("bName");
		String bSubject = request.getParameter("bSubject");
		String bContent = request.getParameter("bContent");
		
		//db접속
		BDAO dao = new BDAO();
		dao.write(bName, bSubject, bContent);
	}
}

 

request에서 getParameter로 값을 가져와서 원하는 객체에 저장해준다.

 

그 다음 DAO클래스에서 write()메소드를 작성해준다.

 

5. DAO 작성

 

굳이 Controller > Service > DAO 순서대로 작성안하고 취향대로 작성해도 된다.

 

리스트 페이지를 만들 때는 DAO > Service > Controller 순으로 작성했지만 이번에는 반대로 한 이유는 어떤 순서로 보는 것이 이해하기 쉽고 내가 코드를 직접 작성할 때 좀 편할지 간접적으로 체험하라는 뜻도 있다.

 

점진적 구체화라는 용어가 있듯이 대개의 경우에는 VO > Controller > Service > DAO 순서가 편하다.

 

그럼 다시 돌아와서 write()메소드를 작성해본다.

 

윗코드내용은 아까 작성했던 부분이므로 write()메소드 시작부터 보면된다.

 

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() 메소드 종료
	
	
	
	//write() 메소드 시작
	public void write(String bName, String bSubject, String bContent) {
		//글쓴이, 글제목, 글내용을 인자로 써줌.
		
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		
		try {
			connection = dataSource.getConnection();
			System.out.println("---------Connection 확보 -----------");
			
			String sql = "insert into mvc_bbs(bNo, bName, bSubject, bContent, bHit, bGroup, bStep, bIndent) " 
			+ "values(seq_bbs.nextval, ?, ?, ?,0,seq_bbs.currval,0,0)";
			//? 밸류는 사용자가 넣어줘야 될 것임. ?가 아닌 다른것을 쓰면 작동이 안된다. 공란도 안된다.
			
			preparedStatement = connection.prepareStatement(sql);
			
			preparedStatement.setString(1, bName); //첫번째 들어갈값 bName
			preparedStatement.setString(2, bSubject); //두번째 들어갈값 bSubject
			preparedStatement.setString(3, bContent); //세번째 들어갈값 bContent
			
			int n = preparedStatement.executeUpdate(); //select문은 executeQuery(), Update문은 executeUpdate()
			//변수n이 아닌 아무거나 써도 된다.
            
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(preparedStatement != null) {preparedStatement.close();}
				if(connection != null) {connection.close();}
				
			} catch(Exception e2) {
				e2.printStackTrace();
			}	
		}
		
	}//write
	
}

 

그럼 이제 글작성 기능이 끝났다.

 

부가적으로 회원가입기능, 글에 비번넣기 기능도 추가할 수 있지만 우선은 CRUD 기본만 하도록 한다.

 

여기까지 실습한 내용은 첨부파일에 올려놓았다.

CRUD(글작성 까지).zip
0.03MB

아래는 서버폴더의 context.xml과 server.xml파일

서버와 콘텍스트 파일.zip
0.00MB

인터넷을 찾아보면 주먹구구식 "스프링 게시판 만들기" 블로그 및 강의가 많은데, 거의 태그라이브러리라는 라이브러리와 오라클을 사용하고 있다.

하지만 다른 라이브러리를 사용해야 하는 경우도 많고, 여러 라이브러리(프레임워크)를 사용하여 게시판만들기를 반복하다 보면 자바 실력이 매우 늘 것으로 예상한다.

 

따라서 MYSQL, AngularJS 게시판 등 몇가지로 구분하여 포스팅할 것이며,

이번 포스팅에서는 Taglib와 오라클을 사용하여 게시판을 만들 것이다.

 

Taglib는 자바에서 제공하는 프론트쪽 라이브러리이고, 오라클은 데이터베이스 프로그램이다.

 

백엔드 언어는 자바이며, 스프링프레임워크를 사용한다. (모든에듀의 스프링활용 강의를 참조하였다.)

 


오라클 설치

 

SQL Developer 19.1 다운로드

오라클 11g를 설치하기 전에 설치해야 한다.

개인은 무료로 사용할 수 있다.

https://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html

 

Oracle SQL Developer Downloads

 

www.oracle.com

 

Oracle Database 11g R2 다운로드

압축파일 2개를 받아서 같은 폴더 경로에 합친다.

https://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html

 

Oracle Database 11g Release 2 for Microsoft Windows (x64)

Oracle Database 11g Release 2 (11.2.0.1.0) Standard Edition, Standard Edition One, and Enterprise Edition Thank you for accepting the OTN License Agreement; you may now download this software. Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft

www.oracle.com

SQL developer에 들어가서 새로만들기를 눌러 아래와 같이 설정

사용자 이름을 system이라고 둔다.


테이블 생성

오라클을 설치했으면, SQL 디벨로퍼에 들어가서 DB가 저장될 테이블을 생성해야 한다.

아래의 쿼리문을 오라클에 입력/실행 해준다.

create table mvc_bbs(
	bNO number(3) primary key,
	bName varchar2(20),
	bSubject varchar2(80),
	bContent varchar2(300),
	bDate date default sysdate,
	bHit number(3) default 0,
	bGroup number(4),
	bStep number(4),
	bIndent number(4)
);

Table MVC_BBS이(가) 생성되었습니다. 라는 문구가 나오면 성공적으로 테이블이 생성된 것이다.

bStep과 bIndent는 댓글과 관련된 것이다.

 

그리고 오라클은 mysql과 달리 bNO가 1부터 올라가려면 sequence를 생성시켜줘야한다. 아래 쿼리문도 실행시켜준다.

create sequence seq_bbs nocache;

Sequence SEQ_BBS이(가) 생성되었습니다. 라는 문구가 나오면 성공적으로 시퀀스가 생성 된것이다.

 

뒤에 노캐쉬를 왜 붙혀주냐면, 저걸 안붙혀주면 컴퓨터 메모리가 날라가면 디폴트로 시퀀스에 20이 추가된다. 그래서 아래와 같이 이상한 번호들을 보여주는 참사가 일어날 수 있다. nocache붙혀주자.

 

이제 더미 데이터를 넣을 차례, 아래의 쿼리문을 입력/실행 시켜준다.

insert into mvc_bbs (bNo, bName, bSubject, bContent, bHit, bGroup, bStep, bIndent) 
values (seq_bbs.nextval, 'test', 'test입니다.', '안녕하세요.', 0, seq_bbs.currval, 0, 0);

bNO는 1씩 증가해야 하니 시퀀스에 nextval을 넣어준 것이고 그룹은 현재의 시퀀스를 가져와야 하기 때문에 current value 명령어를 넣어주었다.

 

1 행 이(가) 삽입되었습니다. 라는 문구가 나오면 성공적으로 행이 삽입된 것이다.

 

새로고침을 누른 뒤 아래와 같이 보여질 것이다.

 


 

스프링 프레임워크 환경 설정

 

web.xml에 다음과 같이 코드를 붙여넣는다.

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	
	<!-- 필터를 만든다. 한번 작성해논 뒤 다른 프로젝트에서도 복사 붙여넣기 함-->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
	
	</filter>
	
	<!-- 필터매핑 -->
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

 

그 뒤 아래와 같은 경로에 다음과 같은 이름의 5개의 패키지를 만든다.

 

톰캣 서버에서 오라클 세팅

스프링에서 오라클을 불러 올 수 있도록 세팅을 해야한다.

 

서버의 context.xml 파일에서 아래와 같이 입력함.

 

context.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- The contents of this file will be loaded for each web application --><Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
    <!-- 오라클 세팅 -->
    <Resource auth="Container"
    	driverClassName="oracle.jdbc.driver.OracleDriver"
    	maxActive="50"
    	maxWait="1000"
    	name="jdbc/Oracle11g"
    	password="12351235"
    	type="javax.sql.DataSource"
    	url="jdbc:oracle:thin:@localhost:1521:orcl"
    	username="system" />
    
</Context>

 

 

 

 

그 안에 컨트롤러, VO, DAO 등의 설정은 다음 포스팅에서 

 

 

+ Recent posts