관리 메뉴

거니의 velog

231130_SPRING 2 (7-2) 본문

대덕인재개발원_웹기반 애플리케이션

231130_SPRING 2 (7-2)

Unlimited00 2023. 11. 30. 08:36
package kr.or.ddit.controller.tiles;

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

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping
public class TilesSettingController {

	/*
	 * [ 부트스트랩을 이용한 CRUD를 진행해 보자! ]
	 * 
	 * 		1. Tiles란?
	 * 
	 * 			어떤 JSP를 템플릿으로 사용하고 템플릿의 각 영역을 어떤 내용을 채울지에 대한 정보를 설정한다.
	 * 			하나의 화면을 만들다보면 공통적이고 반복적으로 생성해야 하는 header, footer와 같은 영역들이 존재한다.
	 * 			우리는 그러한 공통부분들을 분리하여 반복적으로 컴포넌트들을 사용하는게 아닌 공통적인 부분은 한번만 가져다 쓰고
	 * 			변화하는 부분에 대해서만 동적으로 변환해 페이지를 관리할 수 있어야 할 것이다.
	 * 			이렇게 header/footer/menu 등 공통적인 소스를 분리하여 한 화면에서 동적으로 레이아웃을 한 곳에 배치하여
	 * 			설정하고 관리할 수 있도록 도와주는 페이지 모듈화를 돕는 프레임워크이다.
	 * 
	 * 			- 아래 jsp들을 이용하여 페이지 모듈화 진행
	 * 			template.jsp
	 * 			> header.jsp
	 * 			> content source(jsp)
	 * 			> footer.jsp
	 * 
	 * 			** 그 외에 다양한 영역의 페이지는 구현하고자 하는 시나리오를 바탕으로 페이지가 구성될 때
	 * 				추가적으로 레이아웃 영역을 분리하여 작성하면 된다.
	 * 
	 * 		2. Tiles Layout 구현 설명
	 * 
	 * 			1) Tiles 의존 관계 등록
	 * 
	 * 				- tiles-core
	 * 				- tiles-api
	 * 				- tiles-servlet
	 * 				- tiles-jsp
	 * 
	 * 				** 의존 관계 등록 후 Maven > Update Projects로 프로젝트에 라이브러리 반영
	 * 
	 * 			2) servlet-context.xml 수정
	 * 				- ViewResolver order 순서 변경
	 * 				- tilesViewResolver Bean 등록 진행
	 * 
	 * 			3) tiles 설정 위한 xml 생성
	 * 				- /WEB-INF/spring/tiles-config.xml
	 * 
	 * 			4) tiles-config.xml 에 설정한 layout 설정대로 페이지 생성(jsp 구성)
	 * 
	 * 		3. 공지사항 게시판(부트스트랩 디자인) CRUD 실습
	 * 
	 * 			3-1) 데이터베이스 준비
	 * 
	 * 				notice table, noticefile table 생성
	 * 				notice sequence, noticefile sequence 생성
	 * 
	 * 			3-2) 게시판 작성
	 * 
	 * 				- 게시판 목록 컨트롤러 만들기(crud/notice/NoticeRetrieveController)
	 * 				- 게시판 목록 화면 컨트롤러 메소드 만들기(noticeList:get)
	 * 				- 게시판 목록 화면 만들기(noticeboard/list.jsp)
	 * 				- 여기까지 확인
	 * 
	 * 				- 게시판 목록 화면 서비스 인터페이스 메소드 만들기
	 * 				- 게시판 목록 화면 서비스 클래스 메소드 만들기
	 * 				- 게시판 목록 화면 Mapper 인터페이스 메소드 만들기
	 * 				- 게시판 목록 화면 Mapper xml 쿼리 만들기
	 * 				- 게시판 목록 화면 페이지에서 페이징 적용된 목록 확인
	 * 				- 여기까지 확인
	 * 
	 * 				- 게시판 등록 컨트롤러 만들기 (crud/notice/NoticeInsertController)
	 * 				- 게시판 등록 화면 컨트롤러 메소드 만들기 (noticeInsertForm:get)
	 * 				- 게시판 등록 화면 만들기 (noticeboard/form.jsp)
	 * 				- 게시판 등록 기능 컨트롤러 메소드 만들기 (noticeInsert:post)
	 * 				- 게시판 등록 기능 서비스 인터페이스 메소드 만들기
	 * 				- 게시판 등록 기능 서비스 클래스 메소드 만들기
	 * 				- 게시판 등록 기능 Mapper 인터페이스 메소드 만들기
	 * 				- 게시판 등록 기능 Mapper xml 쿼리 만들기
	 * 				- 여기까지 확인
	 * 
	 * 				- 게시판 상세 화면 컨트롤러 메소드 만들기 (noticeDetail:get)
	 * 				- 게시판 상세 화면 서비스 인터페이스 메소드 만들기
	 * 				- 게시판 상세 화면 서비스 클래스 메소드 만들기
	 * 				- 게시판 상세 화면 Mapper 인터페이스 메소드 만들기
	 * 				- 게시판 상세 화면 Mapper xml 쿼리 만들기
	 * 				- 게시판 상세 화면 만들기 (noticeboard/detail.jsp)
	 * 				- 여기까지 확인
	 * 
	 * 				- 게시판 수정 화면 컨트롤러 메소드 만들기 (noticeUpdateForm:get)
	 * 				- 게시판 수정 화면 만들기 (noticeboard/form.jsp)
	 * 				- 게시판 수정 기능 컨트롤러 메소드 만들기 (noticeUpdate:post)
	 * 				- 게시판 수정 기능 서비스 인터페이스 메소드 만들기
	 * 				- 게시판 수정 기능 서비스 클래스 메소드 만들기
	 * 				- 게시판 수정 기능 Mapper 인터페이스 메소드 만들기
	 * 				- 게시판 수정 기능 Mapper xml 쿼리 만들기
	 * 				- 여기까지 확인
	 * 
	 * 				- 게시판 삭제 기능 컨트롤러 메소드 만들기 (noticeDelete:post)
	 * 				- 게시판 삭제 기능 서비스 인터페이스 메소드 만들기
	 * 				- 게시판 삭제 기능 서비스 클래스 메소드 만들기
	 * 				- 게시판 삭제 기능 Mapper 인터페이스 메소드 만들기
	 * 				- 게시판 삭제 기능 Mapper xml 쿼리 만들기
	 * 				- 여기까지 확인
	 * 
	 * 				- 게시판 검색 기능 컨트롤러 메소드 내 기능 추가 (noticeList:get)
	 * 				- 게시판 검색 기능 Mapper xml 쿼리 수정 (selectNoticeCount, selectNoticeList)
	 * 				- 게시판 검색 화면 추가 (noticeboard/list.jsp)
	 * 				- 여기까지 확인
	 */
	
}

package kr.or.ddit.controller.crud.notice;

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 org.springframework.web.servlet.mvc.support.RedirectAttributes;

import kr.or.ddit.ServiceResult;
import kr.or.ddit.service.INoticeService;
import kr.or.ddit.vo.crud.NoticeVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/notice")
public class NoticeModifyController {

	@Inject
	private INoticeService noticeService;
	
	@RequestMapping(value = "/update.do", method = RequestMethod.GET)
	public String noticeUpdateForm(int boNo, Model model) {
		NoticeVO noticeVO = noticeService.selectNotice(boNo);
		model.addAttribute("notice", noticeVO);
		model.addAttribute("status", "u"); // '수정입니다' flag
		return "notice/form";
	}
	
	@RequestMapping(value = "/update.do", method = RequestMethod.POST)
	public String noticeUpdate(NoticeVO noticeVO, Model model, RedirectAttributes ra) {
		String goPage = "";
		
		ServiceResult result = noticeService.updateNotice(noticeVO);
		if(result.equals(ServiceResult.OK)) { // 수정 성공
			goPage = "redirect:/notice/detail.do?boNo=" + noticeVO.getBoNo();
			ra.addFlashAttribute("message", "게시글 수정이 완료되었습니다!");
		}else { // 수정 실패
			model.addAttribute("notice", noticeVO);
			model.addAttribute("message", "수정에 실패했습니다!");
			model.addAttribute("status", "u");
			goPage = "notice/form";
		}
		
		return goPage;
	}
	
}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.ServiceResult;
import kr.or.ddit.vo.crud.NoticeVO;
import kr.or.ddit.vo.crud.PaginationInfoVO;

public interface INoticeService {

	public int selectNoticeCount(PaginationInfoVO<NoticeVO> pagingVO);
	public List<NoticeVO> selectNoticeList(PaginationInfoVO<NoticeVO> pagingVO);
	public ServiceResult insertNotice(NoticeVO noticeVO);
	public NoticeVO selectNotice(int boNo);
	public ServiceResult updateNotice(NoticeVO noticeVO);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.ServiceResult;
import kr.or.ddit.mapper.INoticeMapper;
import kr.or.ddit.service.INoticeService;
import kr.or.ddit.vo.crud.NoticeVO;
import kr.or.ddit.vo.crud.PaginationInfoVO;

@Service
public class NoticeServiceImpl implements INoticeService {

	@Inject
	private INoticeMapper noticeMapper;
	
	@Override
	public int selectNoticeCount(PaginationInfoVO<NoticeVO> pagingVO) {
		return noticeMapper.selectNoticeCount(pagingVO);
	}

	@Override
	public List<NoticeVO> selectNoticeList(PaginationInfoVO<NoticeVO> pagingVO) {
		return noticeMapper.selectNoticeList(pagingVO);
	}

	@Override
	public ServiceResult insertNotice(NoticeVO noticeVO) {
		ServiceResult result = null;
		
		int status = noticeMapper.insertNotice(noticeVO);
		if(status > 0) {
			result = ServiceResult.OK;
		}else {
			result = ServiceResult.FAILED;
		}
		
		return result;
	}

	@Override
	public NoticeVO selectNotice(int boNo) {
		noticeMapper.incrementHit(boNo); // 게시글 조회수 증가
		return noticeMapper.selectNotice(boNo); // 게시글 번호에 해당하는 게시글 정보 가져오기
	}

	@Override
	public ServiceResult updateNotice(NoticeVO noticeVO) {
		ServiceResult result = null;
		
		int status = noticeMapper.updateNotice(noticeVO);
		if(status > 0) {
			result = ServiceResult.OK;
		}else {
			result = ServiceResult.FAILED;
		}
		
		return result;
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.crud.NoticeVO;
import kr.or.ddit.vo.crud.PaginationInfoVO;

public interface INoticeMapper {

	public int selectNoticeCount(PaginationInfoVO<NoticeVO> pagingVO);
	public List<NoticeVO> selectNoticeList(PaginationInfoVO<NoticeVO> pagingVO);
	public int insertNotice(NoticeVO noticeVO);
	public void incrementHit(int boNo);
	public NoticeVO selectNotice(int boNo);
	public int updateNotice(NoticeVO noticeVO);

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.INoticeMapper">
	
	<select id="selectNoticeCount" parameterType="pagingVO" resultType="int">
		select count(bo_no) from notice
	</select>
	
	<select id="selectNoticeList" parameterType="pagingVO" resultType="noticeVO">
		select
			b.*
		from (
			select
				a.*, row_number() over (order by a.bo_no desc) rnum
			from (
				select 
					bo_no, bo_title, bo_content, bo_writer, bo_date, bo_hit 
				from notice 
				where 1=1 
				order by bo_no desc
			) a
		) b
		<![CDATA[
			where b.rnum >= #{startRow} and b.rnum <= #{endRow}
		]]>
	</select>
	
	<insert id="insertNotice" parameterType="noticeVO" useGeneratedKeys="true">
		<selectKey keyProperty="boNo" resultType="int" order="BEFORE">
			select seq_notice.nextval from dual
		</selectKey>
		insert into notice (
			bo_no, bo_title, bo_content, bo_writer, bo_date
		) values (
			#{boNo}, #{boTitle}, #{boContent}, #{boWriter}, sysdate
		)
	</insert>
	
	<update id="incrementHit" parameterType="int">
		update notice 
		set 
			bo_hit = bo_hit + 1 
		where bo_no = #{boNo}
	</update>
	
	<select id="selectNotice" parameterType="int" resultType="noticeVO">
		select 
			bo_no, bo_title, bo_content, bo_writer, bo_date, bo_hit 
		from notice 
		where bo_no = #{boNo}
	</select>
	
	<update id="updateNotice" parameterType="noticeVO">
		update notice 
		set 
			bo_title = #{boTitle},
			bo_content = #{boContent} 
		where bo_no = #{boNo}
	</update>
	
</mapper>


package kr.or.ddit.controller.crud.notice;

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 org.springframework.web.servlet.mvc.support.RedirectAttributes;

import kr.or.ddit.ServiceResult;
import kr.or.ddit.service.INoticeService;
import kr.or.ddit.vo.crud.NoticeVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/notice")
public class NoticeModifyController {

	@Inject
	private INoticeService noticeService;
	
	@RequestMapping(value = "/update.do", method = RequestMethod.GET)
	public String noticeUpdateForm(int boNo, Model model) {
		NoticeVO noticeVO = noticeService.selectNotice(boNo);
		model.addAttribute("notice", noticeVO);
		model.addAttribute("status", "u"); // '수정입니다' flag
		return "notice/form";
	}
	
	@RequestMapping(value = "/update.do", method = RequestMethod.POST)
	public String noticeUpdate(NoticeVO noticeVO, Model model, RedirectAttributes ra) {
		String goPage = "";
		
		ServiceResult result = noticeService.updateNotice(noticeVO);
		if(result.equals(ServiceResult.OK)) { // 수정 성공
			goPage = "redirect:/notice/detail.do?boNo=" + noticeVO.getBoNo();
			ra.addFlashAttribute("message", "게시글 수정이 완료되었습니다!");
		}else { // 수정 실패
			model.addAttribute("notice", noticeVO);
			model.addAttribute("message", "수정에 실패했습니다!");
			model.addAttribute("status", "u");
			goPage = "notice/form";
		}
		
		return goPage;
	}
	
	@RequestMapping(value = "/delete.do", method = RequestMethod.POST)
	public String noticeDelete(int boNo, Model model, RedirectAttributes ra) {
		String goPage = "";
		
		ServiceResult result = noticeService.deleteNotice(boNo);
		if(result.equals(ServiceResult.OK)) { // 삭제 성공
			goPage = "redirect:/notice/list.do";
			ra.addFlashAttribute("message", "게시글 삭제가 완료되었습니다!");
		}else { // 삭제 실패
			goPage = "redirect:/notice/detail.do?boNo=" + boNo;
			ra.addFlashAttribute("message", "게시글 삭제에 실패했습니다!");
		}
		
		return goPage;
	}
	
}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.ServiceResult;
import kr.or.ddit.vo.crud.NoticeVO;
import kr.or.ddit.vo.crud.PaginationInfoVO;

public interface INoticeService {

	public int selectNoticeCount(PaginationInfoVO<NoticeVO> pagingVO);
	public List<NoticeVO> selectNoticeList(PaginationInfoVO<NoticeVO> pagingVO);
	public ServiceResult insertNotice(NoticeVO noticeVO);
	public NoticeVO selectNotice(int boNo);
	public ServiceResult updateNotice(NoticeVO noticeVO);
	public ServiceResult deleteNotice(int boNo);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.ServiceResult;
import kr.or.ddit.mapper.INoticeMapper;
import kr.or.ddit.service.INoticeService;
import kr.or.ddit.vo.crud.NoticeVO;
import kr.or.ddit.vo.crud.PaginationInfoVO;

@Service
public class NoticeServiceImpl implements INoticeService {

	@Inject
	private INoticeMapper noticeMapper;
	
	@Override
	public int selectNoticeCount(PaginationInfoVO<NoticeVO> pagingVO) {
		return noticeMapper.selectNoticeCount(pagingVO);
	}

	@Override
	public List<NoticeVO> selectNoticeList(PaginationInfoVO<NoticeVO> pagingVO) {
		return noticeMapper.selectNoticeList(pagingVO);
	}

	@Override
	public ServiceResult insertNotice(NoticeVO noticeVO) {
		ServiceResult result = null;
		
		int status = noticeMapper.insertNotice(noticeVO);
		if(status > 0) {
			result = ServiceResult.OK;
		}else {
			result = ServiceResult.FAILED;
		}
		
		return result;
	}

	@Override
	public NoticeVO selectNotice(int boNo) {
		noticeMapper.incrementHit(boNo); // 게시글 조회수 증가
		return noticeMapper.selectNotice(boNo); // 게시글 번호에 해당하는 게시글 정보 가져오기
	}

	@Override
	public ServiceResult updateNotice(NoticeVO noticeVO) {
		ServiceResult result = null;
		
		int status = noticeMapper.updateNotice(noticeVO);
		if(status > 0) {
			result = ServiceResult.OK;
		}else {
			result = ServiceResult.FAILED;
		}
		
		return result;
	}

	@Override
	public ServiceResult deleteNotice(int boNo) {
		ServiceResult result = null;
		
		int status = noticeMapper.deleteNotice(boNo);
		if(status > 0) {
			result = ServiceResult.OK;
		}else {
			result = ServiceResult.FAILED;
		}
		
		return result;
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.crud.NoticeVO;
import kr.or.ddit.vo.crud.PaginationInfoVO;

public interface INoticeMapper {

	public int selectNoticeCount(PaginationInfoVO<NoticeVO> pagingVO);
	public List<NoticeVO> selectNoticeList(PaginationInfoVO<NoticeVO> pagingVO);
	public int insertNotice(NoticeVO noticeVO);
	public void incrementHit(int boNo);
	public NoticeVO selectNotice(int boNo);
	public int updateNotice(NoticeVO noticeVO);
	public int deleteNotice(int boNo);

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.INoticeMapper">
	
	<select id="selectNoticeCount" parameterType="pagingVO" resultType="int">
		select count(bo_no) from notice
	</select>
	
	<select id="selectNoticeList" parameterType="pagingVO" resultType="noticeVO">
		select
			b.*
		from (
			select
				a.*, row_number() over (order by a.bo_no desc) rnum
			from (
				select 
					bo_no, bo_title, bo_content, bo_writer, bo_date, bo_hit 
				from notice 
				where 1=1 
				order by bo_no desc
			) a
		) b
		<![CDATA[
			where b.rnum >= #{startRow} and b.rnum <= #{endRow}
		]]>
	</select>
	
	<insert id="insertNotice" parameterType="noticeVO" useGeneratedKeys="true">
		<selectKey keyProperty="boNo" resultType="int" order="BEFORE">
			select seq_notice.nextval from dual
		</selectKey>
		insert into notice (
			bo_no, bo_title, bo_content, bo_writer, bo_date
		) values (
			#{boNo}, #{boTitle}, #{boContent}, #{boWriter}, sysdate
		)
	</insert>
	
	<update id="incrementHit" parameterType="int">
		update notice 
		set 
			bo_hit = bo_hit + 1 
		where bo_no = #{boNo}
	</update>
	
	<select id="selectNotice" parameterType="int" resultType="noticeVO">
		select 
			bo_no, bo_title, bo_content, bo_writer, bo_date, bo_hit 
		from notice 
		where bo_no = #{boNo}
	</select>
	
	<update id="updateNotice" parameterType="noticeVO">
		update notice 
		set 
			bo_title = #{boTitle},
			bo_content = #{boContent} 
		where bo_no = #{boNo}
	</update>
	
	<delete id="deleteNotice" parameterType="int">
		delete from notice 
		where bo_no = #{boNo}
	</delete>
	
</mapper>


[list.jsp]

<form class="input-group input-group-sm" method="post" style="width: 440px;" id="searchForm" name="searchForm">
    <input type="hidden" name="page" id="page" />
    <select class="form-control" name="searchType">
        <option value="title" <c:if test="${searchType eq 'title' }">selected</c:if>>제목</option>
        <option value="writer" <c:if test="${searchType eq 'writer' }">selected</c:if>>작성자</option>
    </select> 
    <input type="text" name="searchWord" value="${searchWord }" class="form-control float-right" placeholder="Search">
    <div class="input-group-append">
        <button type="submit" class="btn btn-default">
            <i class="fas fa-search"></i>검색
        </button>
    </div>
</form>
package kr.or.ddit.controller.crud.notice;

import java.util.List;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;
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 org.springframework.web.bind.annotation.RequestParam;

import kr.or.ddit.service.INoticeService;
import kr.or.ddit.vo.crud.NoticeVO;
import kr.or.ddit.vo.crud.PaginationInfoVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/notice")
public class NoticeRetrieveController {

	@Inject
	private INoticeService noticeService;
	
	@RequestMapping(value = "/list.do")
	public String noticeList(
			@RequestParam(name = "page", required = false, defaultValue = "1") int currentPage,
			@RequestParam(required = false, defaultValue = "title") String searchType,
			@RequestParam(required = false) String searchWord,
			Model model
			) {
		PaginationInfoVO<NoticeVO> pagingVO = new PaginationInfoVO<NoticeVO>();
		
		// 검색 기능 추가
		// 검색을 했을 때의 조건은 키워드(searchWord)가 넘어왔을 때 정확하게 검색을 진행한 거니까
		// 이 때, 검색을 진행하기 위한 타입과 키워드를 PaginationInfoVO에 셋팅하고 목록을 조회하기 위한 조건으로
		// 쿼리를 조회할 수 있도록 보내준다.
		if(StringUtils.isNotBlank(searchWord)) {
			pagingVO.setSearchType(searchType);
			pagingVO.setSearchWord(searchWord);
			model.addAttribute("searchType", searchType);
			model.addAttribute("searchWord", searchWord);
		}
		
		// 현재 페이지 전달 후, start/endRow와 start/endPage 설정
		pagingVO.setCurrentPage(currentPage);
		
		int totalRecord = noticeService.selectNoticeCount(pagingVO); // 총 게시글 수 가져오기
		pagingVO.setTotalRecord(totalRecord);
		List<NoticeVO> dataList = noticeService.selectNoticeList(pagingVO);
		pagingVO.setDataList(dataList);
		
		model.addAttribute("pagingVO", pagingVO);
		
		return "notice/list";
	}
	
	@RequestMapping(value = "/detail.do", method = RequestMethod.GET)
	public String noticeDetail(int boNo, Model model) {
		NoticeVO noticeVO = noticeService.selectNotice(boNo);
		model.addAttribute("notice", noticeVO);
		return "notice/detail";
	}
	
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.INoticeMapper">
	
	<sql id="noticeSearch">
		<if test="searchType != null and searchType == 'title'">
			and (bo_title like '%' || #{searchWord} || '%')
		</if>
		<if test="searchType != null and searchType == 'writer'">
			and (bo_writer like '%' || #{searchWord} || '%')
		</if>
	</sql>
	
	<select id="selectNoticeCount" parameterType="pagingVO" resultType="int">
		select count(bo_no) from notice
		where 1=1 
		<include refid="noticeSearch" />
	</select>
	
	<select id="selectNoticeList" parameterType="pagingVO" resultType="noticeVO">
		select
			b.*
		from (
			select
				a.*, row_number() over (order by a.bo_no desc) rnum
			from (
				select 
					bo_no, bo_title, bo_content, bo_writer, bo_date, bo_hit 
				from notice 
				where 1=1 
				<include refid="noticeSearch" />
				order by bo_no desc
			) a
		) b
		<![CDATA[
			where b.rnum >= #{startRow} and b.rnum <= #{endRow}
		]]>
	</select>


* form.jsp

<script>
	$(function(){
		CKEDITOR.replace("boContent", {
			filebrowserUploadUrl: '/imageUpload.do'
		});
	});
</script>


이미지 경로 복사
경로 넣고 실행


 

'대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글

231201_SPRING 2 (8-1)  (0) 2023.12.01
231130_SPRING 2 (7-3)  (0) 2023.11.30
231130_SPRING 2 (7-1)  (1) 2023.11.30
231129_SPRING 2 (6-3)  (0) 2023.11.29
231129_SPRING 2 (6-2)  (0) 2023.11.29