Spring

Spring / (게시판 작성) 게시물 목록

mommos 2022. 4. 25. 23:29

먼저 테스트할 내용들을 DB에 추가해준다 

이렇게 테이블 안에 잘 추가 되었는지 확인한다

 

insert into tbl_board(title, content, writer)
  values('제목입니다1', '내용입니다1', '작성자1');

insert into tbl_board(title, content, writer)
  values('제목입니다2', '내용입니다2', '작성자2');

insert into tbl_board(title, content, writer)
  values('제목입니다3','내용입니다3', '작성자3');

insert into tbl_board(title, content, writer)
  values('제목입니다4', '내용입니다4', '작성자4');

insert into tbl_board(title, content, writer)
  values('제목입니다5', '내용입니다5', '작성자5');

commit;

select * from tbl_board;

 

그 뒤에 view 폴더에 board 라는 폴더를 추가해준다 

 

만든 board 폴더 우클릭 > New > Other... > jsp File > 이름은 list.jsp > Next  

 

html 5 인지 확인 후 Finish 를 눌러서 생성해준다 

 

만든 list.jsp 파일 맨 위에 위 코드를 추가해준다 이 코드는 JSTL을 사용하기위해 추가한다

JSTL 이란 기존에 사용하던 스클립틀릿보다 가독성이 좋고 이해하기 쉬워 사용한다

 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

list.jsp 파일의 태그 내부에 위 코드를 추가해준다 

<table>
 <thead>
  <tr>
   <th>번호</th>
   <th>제목</th>
   <th>작성일</th>
   <th>작성자</th>
   <th>조회수</th>
  </tr>
 </thead>
 
 <tbody>
 </tbody>

</table>

그 다음 home.jsp로 넘어와 게시물 목록 페이지로 이동하는 링크를 추가한다

 

 

 

board 폴더 내부의 list 파일로 간다는 내용이다 

<p><a href="/board/list">게시물 목록</a></p>

/board/list 에 해당되는 컨트롤러를 추가해주기 위해 src/main/java > com.board.controller 내부에 클래스를 추가해준다

이름은 BoardController 

컨트롤러를 추가해주지 않고 게시물 목록 버튼을 누르면 404 에러가 뜬다

 

 

만들어진 파일에 코드를 집어넣는다

 

컨트롤러에 필요한것들을 import 해준다 

BoardController는 " /board/* " 로 시작하는 path에 반응하는데

 

1. 사용자가 게시물 목록 버튼을 누른다 

2. http//localhost:8080/board/* 가 요청된다

3. 그럼 그 안의 코드가 실행이되는데 

4. @RequestMapping(value = "/list" , method = RequestMethod.GET)

   value 는 요청받을 url 설정 method 는 어떤 요청으로 받을지 정의한다 (GET, POST, DELETE, PUT 등등)

package com.board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/board/*")
public class BoardController {

 @RequestMapping(value = "/list", method = RequestMethod.GET)
 public void getList() throws Exception {
  
   
 }
}

톰캣 서버 더블클릭 > Modules 탭 선택 > 프로젝트 선택 > Edit... 

path > / 로 변경 > OK

 

프로젝트를 실행해서 연결이 잘 되었는지 확인한다

 

 

아직 데이터베이스에서 데이터를 가져오지않아서 내용은 출력이 안된다

 

먼저 데이터베이스에서 쿼리를 작성에 필요한 데이터를 출력해본다

이때 모두를 선택하는 문자 * 를 사용하지않고 필요한 컬럼을 직접 입력한다

데이터를 출력해본 쿼리를 사용해서 매퍼에 코드를 추가해준다 

 

id 는 매퍼 내에서 쿼리를 구분짓는 고유한 이름

resultType 는 쿼리의 결과의 형태이다 

	<!-- 게시물 목록 -->
	<select id="list" resultType="com.board.domain.BoardVO">
		 select
		  bno, title, content, writer, regDate, viewCnt
		 from tbl_board
	</select>

src/main/java > New > Package > com.board.dao

src/main/java > New > Package > com.board.service 

 

src/main/java 내에 두개의 패키지를 추가해준다

 

src/main/java > com.board.dao > New > Interface 생성

 

Interface 이름은 BoardDAO 로 해준다

 

만든 인터페이스 내에 코드를 추가해준다

 

package com.board.dao;

import java.util.List;

import com.board.domain.BoardVO;

public interface BoardDAO {
 
 public List list() throws Exception; 

}

src/main/java > com.board.dao > New > class > BoardDAOImpl

 

Add 버튼을 눌러 아까 생성한 BoardDAO 인터페이스를 생성해주고 BoardDAOImpl 라는 이름을 가진 클래스를 생성해준다 

 

BoardDAO 를 상속받는 BoardDAOImpl 이 생성된다

 

 

 

생성된 BoardDAOImpl 안에 코드를 추가해준다

게시물 즉, tbl_board 1행의 데이터의 형태는 BoardVO에 있는 변수들과 같다 게시물 목록은 tbl_board 가 1행 이상 존재하는것이므로 BoardVO 를 리스트 형태로 만들면 게시물 목록을 받아올수 있다

 

package com.board.dao;

import java.util.List;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.board.domain.BoardVO;

@Repository
public class BoardDAOImpl implements BoardDAO {

 @Inject
 private SqlSession sql;
 
 private static String namespace = "com.board.mappers.board";

 // 게시물 목록
 @Override
 public List list() throws Exception { 
  
  return sql.selectList(namespace + ".list");
 }

}

이때 BoardDAOImpl에 있는 namespace는 매퍼의 namespace와 일치해야한다

 

위의 BoardDAO, BoardDAOImpl 을 생성한방법과같이

BoardService 인터페이스를 상속받는 클래스인 BoardServiceImpl 를 생성해준다 

 

BoardService 에 코드를 추가해준다

package com.board.service;

import java.util.List;

import com.board.domain.BoardVO;

public interface BoardService {

	List list() throws Exception;

}

BoardServiceImpl 에도 코드를 추가해준다

코드는 BoardDAOImpl과 크게 다르지 않지만 BoardDAOImpl 과 다른역할을 맡고있다

package com.board.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;

@Service
public class BoardServiceImpl implements BoardService {

 @Inject
 private BoardDAO dao;
 
 @Override
 public List list() throws Exception {

  return dao.list();
 }

}

BoardController 에 코드를 추가해준다

 

바뀌는것 

 

package com.board.controller;

import java.util.List;

import javax.inject.Inject;

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

import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;
import com.board.service.BoardService;

@Controller
@RequestMapping("/board/*")
public class BoardController {

 @Inject
 private BoardService service;

 @RequestMapping(value = "/list", method = RequestMethod.GET)
 public void getList(Model model) throws Exception {
  
  List list = null;
  list = service.list();
  model.addAttribute("list", list);
 }
}

위의것들이 추가된다

Model 은 Controller 와 View 를 연결해주는 역할을 한다

list.jps 의 <tbody>안쪽에 코드를 추가해준다

 

<c:forEach items="${list}" var="list">
 <tr>
  <td>${list.bno}</td>
  <td>${list.title}</td>
  <td>${list.regDate}</td>
  <td>${list.writer}</td>
  <td>${list.viewCnt}</td>
 </tr>
</c:forEach>

이제 프로젝트를 실행 해보면 500 에러가 뜨는데

스프링이 BoardDAO와 BoardService를 찾을수 없기때문

 

 

root-context.xml 으로 가서 안쪽에 코드를 추가한다

 

 

<context:component-scan base-package="com.board.domain" />
<context:component-scan base-package="com.board.dao" />
<context:component-scan base-package="com.board.service" />

 

 

 

이제 프로젝트를 실행해보면 연결이 완료되었다

 

만약 500 에러가 또 뜬다면 root-context.xml 에서 데이터베이스 bean부분 데이터베이스명을 잘 입력해주었는지 확인해본다