관리 메뉴

거니의 velog

(20) 토요일 수업 4 본문

대덕인재개발원_final project

(20) 토요일 수업 4

Unlimited00 2024. 1. 13. 11:11

https://wrtn.ai/?utm_source=google.adwords&utm_medium=cpc&utm_campaign=google_searchad_brand&utm_content=adset_keyword_exact&utm_term=%EB%A4%BC%ED%8A%BC&ad_group=adset_keyword_exact&ad_creative=%EB%A4%BC%ED%8A%BC&gad_source=1&gclid=CjwKCAiAkp6tBhB5EiwANTCx1IX_uVQRqb9HrbNZQiIJ5Z6AnIp-lIFbt9xSYL4kb5wJepQBADWfHBoCWEIQAvD_BwE

 

wrtn

모두를 위한 AI 포털 뤼튼. AI 채팅부터 이미지 생성, 나만의 AI 제작까지, 언제 어디서나 생성형 AI와 함께하세요.

wrtn.ai


https://becomefullstackdev.tistory.com/117

 

2021.10.22 수업일지(Spring Framework, Web Socket)

웹 소켓(Web Socket) 웹 소켓은 웹서버와 웹브라우저가 지속적으로 연결된 TCP 라인을 통해 실시간으로 데이터를 주고받을 수 있도록 하는 HTML의 새로운 사양이다. 따라서 Web Socket을 이용하면 양방

becomefullstackdev.tistory.com


[mybatis sql 문 타일링 방법]

<?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="commonMapper">

	<sql id="pagingHeader">
		select
			b.*
			, count(1) over() as total_cnt
		from (
			select
				a.*, row_number() over (order by a.bo_no desc) rnum
			from (
	</sql>
	
	<sql id="pagingFooter">
			) a
		) b
		<![CDATA[
			where b.rnum >= #{startRow} and b.rnum <= #{endRow}
		]]>
	</sql>

</mapper>

<select id="selectNoticeList" parameterType="pagingVO" resultType="noticeVO">
	
    <include refid="commonMapper.pagingHeader" />

        select 
            bo_no, bo_title, bo_content, bo_writer, bo_date, bo_hit, bo_impor
        from notice 
        where 1=1 

        <!-- <include refid="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>
        <if test="searchType != null and searchType == 'both'">
            and (bo_title like '%' || #{searchWord} || '%')
            and (bo_writer like '%' || #{searchWord} || '%')
        </if>

    <include refid="commonMapper.pagingFooter" />

</select>

1. 컨트롤러 (안내데스크)
	- 자료수집 : (파라미터, Session, Application)
    - 자료검증
    - 업무처리 (파라미터 구성 -> Service 호출)
    	. CUD 작업 2개 이상 존재 지양 -> why? 트랜잭션 단위가 달라지므로 앞에서 성공한 서비스는 DB에 들어감.
        . 즉, 트랜잭션 단위를 고려하라는 말
        . 같은 트랜잭션
        	-> 반드시 서비스를 1개로 호출 필요 -> 커넥션 단위가 1개이며 주소도 1개여야 함
        . 다른 트랜잭션
            try {
            	서비스호출1
            }catch(Exception e) {
            }
            try {
            	서비스호출1
            }catch(Exception e) {
            }
    - 자료반환 (view 페이지, data)

// 공지사항 리스트 출력
@CrossOrigin(origins = "http://localhost")
@RequestMapping(value = "/list.do", method = RequestMethod.GET)
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
        ) {

    /** 자료 수집 및 정의 */
    Map<String,Object> param = new HashMap<>();
    param.put("currentPage", currentPage);
    param.put("searchType", searchType);
    param.put("searchWord", searchWord);

    /** 서비스 호출 */
    // 공지사항 게시판 리스트 가져오기
    noticeService.noticeList(param);

    /** 반환 자료 */
    PaginationInfoVO<NoticeVO> pagingVO = (PaginationInfoVO<NoticeVO>) param.get("pagingVO");
    List<NoticeVO> importantNoticeList = (List<NoticeVO>) param.get("importantNoticeList");
    List<NoticeVO> fileExistNoticeList = (List<NoticeVO>) param.get("fileExistNoticeList");

    /** 자료 검증 */ 
    log.info("pagingVO : " + pagingVO.toString());
    log.info("importantNoticeList : " + importantNoticeList.toString());
    log.info("importantNoticeList : " + importantNoticeList.toString());
    log.info("fileExistNoticeList : " + fileExistNoticeList.toString());

    /** 자료 반환 */ 
    model.addAttribute("searchType", searchType);
    model.addAttribute("searchWord", searchWord);
    model.addAttribute("pagingVO", pagingVO);
    model.addAttribute("importantNoticeList", importantNoticeList);
    model.addAttribute("fileExistNoticeList", fileExistNoticeList);

    return "board/noticeBoardList";

}
@Override
public void noticeList(Map<String, Object> param) {

    /** 파라미터 조회 */
    int currentPage = (int) param.get("currentPage");
    String searchType = (String) param.get("searchType");
    String searchWord = (String) param.get("searchWord");

    /** 파라미터 정의 */
    PaginationInfoVO<NoticeVO> pagingVO = new PaginationInfoVO<NoticeVO>();
    List<NoticeVO> importantNoticeList = new ArrayList<NoticeVO>();
    List<NoticeVO> fileExistNoticeList = new ArrayList<NoticeVO>();

    /** 메인로직 처리 */
    // 검색 기능
    if(StringUtils.isNotBlank(searchWord)) {
        pagingVO.setSearchType(searchType);
        pagingVO.setSearchWord(searchWord);
    }
    pagingVO.setCurrentPage(currentPage);

    // 총 게시글 수 가져오기
    int totalRecord = noticeMapper.selectNoticeCount(pagingVO);
    pagingVO.setTotalRecord(totalRecord);

    // 총 게시글을 리스트로 받아오기
    List<NoticeVO> dataList = noticeMapper.selectNoticeList(pagingVO);
    pagingVO.setDataList(dataList);

    // 중요공지 리스트 가져오기
    importantNoticeList = noticeMapper.importantNoticeList();

    // 파일이 들어있는 게시글 리스트 가져오기
    fileExistNoticeList = noticeMapper.fileExistNoticeList();

    /** 반환자료 저장 */
    param.put("pagingVO", pagingVO);
    param.put("importantNoticeList", importantNoticeList);
    param.put("fileExistNoticeList", fileExistNoticeList);

}

// 플래너 공개/비공개 처리 메서드
@PostMapping("/chgStatusPlan.do")
public String chgStatusPlan(
        PlanerVO planerVO,
        Model model,
        RedirectAttributes ra
        ) {
    /** 자료 수집 및 정의 */
    Map<String, Object> param = new HashMap<String, Object>();
    param.put("memId", planerVO.getMemId());
    param.put("plNo", planerVO.getPlNo());
    param.put("plPrivate", planerVO.getPlPrivate());

    /** 서비스 호출 */
    myTripService.chgStatusPlan(param);

    /** 반환 자료 */
    ServiceResult result = (ServiceResult) param.get("result");
    String message = (String) param.get("message");
    String goPage = (String) param.get("goPage");

    /** 자료 검증 */
    log.info("result : " + result);
    log.info("message : " + message);
    log.info("goPage : " + goPage);

    if(result.equals(ServiceResult.OK)) { // 업데이트 성공
        ra.addFlashAttribute("message", message);
    }else { // 업데이트 실패
        model.addAttribute("message", message);
    }

    /** 자료 반환 */
    return goPage;
}
@Override
public void chgStatusPlan(Map<String, Object> param) {
    /** 파라미터 조회 */
    String memId = (String) param.get("memId");
    int plNo = (int) param.get("plNo");
    String plPrivate = (String) param.get("plPrivate");

    /** 파라미터 정의 */
    PlanerVO planerVO = new PlanerVO();
    int status = 0;
    ServiceResult result = null;
    String message = "";
    String goPage = "";

    /** 메인로직 처리 */
    // 해당 플래너를 공개/비공개 처리 하기
    planerVO.setMemId(memId);
    planerVO.setPlNo(plNo);

    if(plPrivate.equals("Y")) { // 비공개 처리
        planerVO.setPlPrivate("N");
    }else if(plPrivate.equals("N")) { // 공개 처리
        planerVO.setPlPrivate("Y");
    }

    status = myTripMapper.chgStatusPlan(planerVO);

    if(status > 0) { // 업데이트 성공
        result = ServiceResult.OK;
        if(plPrivate.equals("Y")) { // 비공개 처리
            message = "해당 플래너를 비공개 처리하였습니다.";
        }else if(plPrivate.equals("N")) { // 공개 처리
            message = "해당 플래너를 공개 처리하였습니다.";
        }
        goPage = "redirect:/partner/mygroup.do";
    }else { // 업데이트 실패
        result = ServiceResult.FAILED;
        message = "해당 플래너를 갱신하는데 실패했습니다.";
        goPage = "partner/mygroup";
    }

    /** 반환자료 저장 */
    param.put("result", result);
    param.put("message", message);
    param.put("goPage", goPage);
}

 

'대덕인재개발원_final project' 카테고리의 다른 글

(22) 토요일 수업 5  (0) 2024.02.03
(21) 웹 소켓 세팅  (1) 2024.02.01
(19) 보강 12  (0) 2024.01.08
(18) 토요일 수업 3  (0) 2024.01.08
(17) Tomcat Servers 설정  (1) 2024.01.05