티스토리 뷰
[게시판_목록]
1. DB 생성
'firstspring' database 를 생성한 뒤, 테이블과 column과 그에 대한 주석을 생성한다.
create database firstspring;
CREATE TABLE TB_BOARD
(
IDX int auto_increment PRIMARY KEY,
PARENT_IDX int,
TITLE VARCHAR(100) NOT NULL,
CONTENTS VARCHAR(4000) NOT NULL,
HIT_CNT int NOT NULL,
DEL_GB VARCHAR(1) DEFAULT 'N' NOT NULL,
CREA_DTM DATE NOT NULL,
CREA_ID VARCHAR(30) NOT NULL
);
ALTER TABLE TB_BOARD COMMENT = '게시판';
ALTER TABLE TB_BOARD CHANGE idx idx int auto_increment PRIMARY KEY COMMENT '인덱스';
ALTER TABLE TB_BOARD CHANGE PARENT_IDX PARENT_IDX int COMMENT '부모글 인덱스';
ALTER TABLE TB_BOARD CHANGE TITLE TITLE varchar(100) COMMENT '제목';
ALTER TABLE TB_BOARD CHANGE CONTENTS CONTENTS varchar(4000) COMMENT '내용';
ALTER TABLE TB_BOARD CHANGE HIT_CNT HIT_CNT int null COMMENT '조회수';
ALTER TABLE TB_BOARD CHANGE DEL_GB DEL_GB varchar(1) DEFAULT 'N' NOT NULL COMMENT '삭제구분';
ALTER TABLE TB_BOARD CHANGE CREA_DTM CREA_DTM DATE NOT NULL COMMENT '생성일자';
ALTER TABLE TB_BOARD CHANGE CREA_ID CREA_ID VARCHAR(30) NOT NULL COMMENT '생성자 ID';-> parent_idx : 추후 계층형 게시판으로 변형할 때 사용할 컬럼을 미리 만든것
del_db : 글을 삭제할 경우 실제로 delete 쿼리를 이용해서 삭제하는것이 아니라 삭제 구분값만 바꾸려고 한다.
2. 데이터 조회
비지니스로직과 DB와의 연동 시작
src/main/java 밑에 fist.sample 패키지 밑에 service와 dao 패키지를 생성한다.
service 패키지에는 Service 인터페이스와 그 인터페이스를 구현한 ServiceImpl 클래스가 위치할 것. ServiceImple 클래스는 각 요청에 필요한 비지니스 로직의 수행을 담당 할 것
dao 패키지는 DAO 클래스가 위치할 것이며 이 클래스를 통해 DB에 접근하는 역할을 수행한다.
src/main/resources 밑의 mapper 폴더 안에 sample 폴더 생성
이 폴더에는 게시판에 관련된 쿼리가 담긴 xml 파일이 위치하게 될 것
기능 구현은
Controller > Service > ServiceImpl > DAO > SQL(XML) > JSP 순서로 할 것
1) Controller 구현
package first.sample.controller;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class SampleController {
Logger log = Logger.getLogger(this.getClass());
@Resource(name="sampleService")
private SampleService sampleService;
@RequestMapping(value="/sample/openSampleBoardList.do")
public ModelAndView openSampleBoardList(Map<String,Object> commandMap) throws Exception{
ModelAndView mv = new ModelAndView("/sample/boardList");
List<Map<String,Object>> list = sampleService.selectBoardList(commandMap);
mv.addObject("list", list);
return mv;
}
}-> 처음엔 에러가 난다. 지금은 SampleService 인터페이스가 없으니까!
-> Controller는 웹 클라이언트에서 들어온 요청을 해당 비지니스 로직에서 호출하고, 수행 결과와 함께 응답해주는 Dispatcher 역할을 한다. 클래스 선언부에 @Controller라고 어노테이션을 이용해서 Controller 객체임을 선언해준다.
-> Service 영역의 접근을 위해서 SampleService 객체를 선언함
-> @RequestMapping : 요청 URL
우리가 해당 요청 URL 주소를 호출하게 되면 이 주소는 @RequestMapping 과 매핑되어 해당 메소드를 실행한다.
ModelAndView 객체는 화면에 보여줄 jsp 파일을 의미한다.
-> List 변수는 게시판 목록을 보여주기 위해서 목록 저장을 위해 선언했다. List의 형식은 Map<String, Object> 인데, 하나의 게시글 목록에도 여러가지 정보가 존재하기 때문이다. 글번호, 글제목, 작성일 등의 정보를 Map에 저장하려는 것.
-> Controller는 단순히 어떤 주소와 화면을 연결하고 비지니스 로직을 호출하는 역할을 한다. 비지니스 로직은 실제로 Service에 작성한다. 그래서 sampleService.selectBoardList(commandMap)을 함으로써 게시글을 조회하는 역할을 수행한다.
-> mv.addObject("list", list)는 서비스 로직의 결과를 ModelAndView 객체에 담아서 클라이언트이자 jsp에서 결과를 사용할 수 있도록 한다. "list"는 key이고 list는 value이다.
2) Service 구현
Service 영역은 Service 인터페이스와 이 인터페이스를 실제로 구현한 ServiceImpl 클래스로 구성되어 있다. 이는 Spring의 IoC/DI(Inversion of Control/Dependency Injection) 기능을 이용해서 Bean 관리 기능을 사용하기 위함이다.
first.sample.service 패키지에 SampleService 인터페이스와 SampleServiceImpl 클래스를 생성한다.
SampleService 인터페이스는 비지니스 로직의 수행을 위한 메소드를 정의한다. SampleServiceImpl 클래스는 Service 인터페이스를 통해 정의된 메소드를 실제로 구현하는 클래스이다. @Service 어노테이션을 통해서 Service 객체임을 선언하고 이 객체 이름을 정의했다.
다시 SampleController 클래스를 가보면 SampleService를 import 할 수 있고 @Resource 어노테이션을 통해서 필요한 빈을 수동으로 등록 할 수 있다. 수동으로 등록한 빈의 이름이 sampleService이고 이 빈의 이름이 SampleServiceImpl 클래스의 @Service("sampleService") 의 이름임을 알 수 있다.
이런 뒤, SampleService에 selectBoardList 메소드를 정의한다. 정의할 때 변수 이름을 수정한다.
List<Map<String, Object>> selectBoardList(Map<String, Object> map) throws Exception;
그 다음, SampleServiceImpl 클래스에서 selectBoardList 메소드를 구현한다.
package first.sample.service;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
@Service("sampleService")
public class SampleServiceImpl implements SampleService
{
Logger log = Logger.getLogger(this.getClass());
@Resource(name="sampleDAO")
private SampleDAO sampleDAO;
@Override
public List<Map<String, Object>> selectBoardList(Map<String, Object> map) throws Exception {
return sampleDAO.selectBoardList(map);
}
}
-> selectBoardList 메소드의 반환값으로 sampleDAO 클래스의 selectBoardList 메소드를 호출한 결과값을 반환한다.
3) DAO 구현
first.sample.dao 패키지에 SampleDAO 클래스를 생성
@Repository 어노테이션을 통해 이 클래스가 DAO임을 선언하고 이름을 정의한다.
SampleServiceImpl 클래스에서 @Resource로 sampleDAO 빈을 수동으로 등록하였고 거기에 사용된 빈이 방금 작성한 DAO 클래스이다.
그리고 상속한 AbstractDAO 클래스는 전에 MyBatis 설정을 위해 만든 클래스이다.
package first.sample.dao;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import first.common.dao.AbstractDAO;
@Repository("sampleDAO")
public class SampleDAO extends AbstractDAO
{
@SuppressWarnings("unchecked")
public List<Map<String, Object>> selectBoardList(Map<String, Object> map) {
return (List<Map<String, Object>>)selectList("sample.selectBoardList", map);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample">
<select id="selectBoardList" parameterType="hashmap" resultType="hashmap">
<![CDATA[
SELECT
IDX,
TITLE,
HIT_CNT,
CREA_DTM
FROM
TB_BOARD
WHERE
DEL_GB = 'N'
ORDER BY IDX DESC
]]>
</select>
</mapper>-> select 태그문을 이용해서 이 쿼리가 select 문이라는 것을 명시했다.
id = "selectBoardList" 부분은 이 쿼리의 id를 정의하고
parameterType = "hashmap" 부분은 이 쿼리가 실행될 때 필요한 변수는 HashMap 형태라는 것을 의미한다.
resultType = "hashmap" 부분은 이 쿼리 의 결과값은 HashMap에 담겨서 반환된다는 것을 의미한다.
원래는 사용할 클래스의 이름을 java.util.HashMap 처럼 정확히 패키지까지 명시해야하지만, MyBatis에서 사람들이 많이 사용하는 변수형은 hashmap과 같이 간단히 사용할 수 있도록 지원해준다!
지금 여기서는 모든 결과값을 Map을 사용해서 전달하고 전달받지만, DTO를 사용하기도 한다. DTO는 Data Transfer Object의 약자로, TO, VO 등의 이름으로도 사용된다.
5) jsp 구현
src/main/webapp/WEB-INF/jsp/first/sample 폴더 밑에 boadList.jsp 파일을 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>first</title>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
</head>
<body>
<h2>게시판 목록</h2>
<table style="border:1px solid #ccc">
<colgroup>
<col width="10%"/>
<col width="*"/>
<col width="15%"/>
<col width="20%"/>
</colgroup>
<thead>
<tr>
<th scope="col">글번호</th>
<th scope="col">제목</th>
<th scope="col">조회수</th>
<th scope="col">작성일</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${fn:length(list) > 0}">
<c:forEach items="${list }" var="row">
<tr>
<td>${row.IDX }</td>
<td>${row.TITLE }</td>
<td>${row.HIT_CNT }</td>
<td>${row.CREA_DTM }</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="4">조회된 결과가 없습니다.</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</body>
</html>-> jstl 문법
-> 전체 조회 결과가 있으면 보여주고, 없으면 조회된 결과가 없다는 메시지를 보여주는 화면이다.
-> <c:forEach items = "${list}" var = "row">
Controller에서 db에서 조회된 결과 list를 mv.addObject를 이용해서 "list"라는 이름으로 mv 값에 저장했었다. 여기에서의 list는 이때 저장한 list를 의미한다.
그리고 list를 List<Map<String, Object>> 형식으로 선언했었고 db에서 조회된 결과를 받았다. 이 list에서 하나의 데이터 쌍을 가져오면 Map<String, Object> 형식의 하나 줄이 나오게 되고 그 데이터는 row라는 이름의 변수에 저장이 된다. 그 후 row 변수에서 원하는 데이터(idx, title, hit_cnt, crea_dtm)를 뽑아서 사용하면 된다.
3. 테스트
처음 실행했을 때는 "조회된 결과가 없습니다."로 나온다.
일단 DB에 임시 데이터를 넣고 다시 조회해보면 값이 제대로 나옴을 확인 할 수 있다.
INSERT INTO TB_BOARD
(
IDX,
TITLE,
CONTENTS,
HIT_CNT,
DEL_GB,
CREA_DTM,
CREA_ID
)
VALUES
(
1,
'제목',
'내용',
0,
'N',
sysdate(),
'Admin'
);'Framework > Spring' 카테고리의 다른 글
| Spring Framework(8) (0) | 2017.03.27 |
|---|---|
| Spring Framework(7) (0) | 2017.03.04 |
| Spring Framework(5) (0) | 2017.02.05 |
| Spring Framework(4) (0) | 2017.02.05 |
| Spring Framework(3) (0) | 2017.02.05 |
- Total
- Today
- Yesterday
- 1157
- 알고리즘
- Java
- 이진 탐색
- 조합 알고리즘
- parametric search
- 2048 game
- 1085
- 위상정렬
- 10809
- 1037
- 자료구조
- 단어 공부
- 째로탈출2
- 12100
- acmicpc
- 약수
- lottie
- 7569
- 이진 검색
- spring
- acmpicpc
- BOJ
- ACM Craft
- mybatis
- 알파벳 찾기
- 파라메트릭
- 7576
- 13460
- combination
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |