[스프링 부트] 게시판 만들기 프로젝트 - 8. Service, Controller

2023. 4. 19. 23:08스프링부트 프로젝트

1. Service

비즈니스 로직을 구현하는 데 사용되는 구성 요소

일반적으로 데이터베이스나 외부 시스템과 상호 작용하여 데이터를 처리하고, 결과를 반환하는 역할

MVC 패턴에서 Model의 역할을 수행하며, 일반적으로 비즈니스 로직을 처리하고, 데이터를 가공하는 역할

 

△ com.jeong.board.service

 

package com.jeong.board.service;

import java.util.List;

import com.jeong.board.domain.BoardDto;

public interface BoardService {

	// 게시물 등록
	public int addBoard(BoardDto bDto);
	// 게시물 조회 
	public BoardDto getBoardDetail(Long post_no);
	// 게시물 수정 
	public int modifyBoard(BoardDto bdto);
	// 게시물 삭제 
	public int deleteBoard(BoardDto bdto);
	// 게시물 목록 조회 
	public List<BoardDto> getBoardList(BoardDto bdto);
	// 게시물 개수
	public int selectBoardTotalCount(BoardDto bdto);
	// 댓글 리스트 
	public List<BoardDto> getCommentList(BoardDto bdto);
	// 내가 쓴 글 조회 
	public List<BoardDto> getMypost(BoardDto bdto);
	// 내가 쓴 글의 개수를 조회 
	public int selectMyPostTotalCount(BoardDto bdto);
	// 댓글 수 조회 
	public int commentCnt(Long postno);
}

△ BoardService.java

 

package com.jeong.board.service;

import com.jeong.board.domain.MemberDto;

public interface MemberService {
	// 회원가입
	public int addMember(MemberDto mDto);
	// 아이디 중복확인
	public int getId(MemberDto mDto);
	// 로그인
	public MemberDto getSelectOne(String id);
}

△ MemberService.java

 

2. ServiceImpl

Service 인터페이스에서 정의한 메소드를 구현하고 비즈니스 로직을 수행

ServiceImpl 클래스는 Service 인터페이스를 구현하므로, 인터페이스에 정의된 메소드를 모두 구현해야 함

package com.jeong.board.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jeong.board.domain.BoardDto;
import com.jeong.board.mapper.BoardMapper;

@Service
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardMapper boardMapper;

	// 게시물 & 댓글 작성
	@Override
	public int addBoard(BoardDto bDto) {
 
		if (bDto.getDepth() == null || bDto.getDepth() == 0) {		// 본문 작성 
			// 게시글 작성 
			bDto.setDepth((long)1);
			bDto.setStep((long)0);
			Long max = (boardMapper.selectBoardMax());
			long pgroup = max != null ? max + 1 : 1;
			bDto.setPgroup(pgroup);

			return boardMapper.insertBoard(bDto);
			
		} else {	// 대댓글 작성 
			if (bDto.getDepth() == 3) {
				bDto.setTitle("reComment");

				return boardMapper.insertBoard(bDto);
				
			} else {	// 댓글 작성 
				Long maxC = boardMapper.selectCommentMax(bDto);
				long step = maxC != 0 ? maxC + 1 : 1;
				bDto.setStep(step);
				bDto.setTitle("comment");

				return boardMapper.insertBoard(bDto);
			}
		}
	}

	// 게시물 한개 조회
	@Override
	public BoardDto getBoardDetail(Long postno) {
		return boardMapper.selectBoardDetail(postno);
	}

	// 게시물 삭제
	@Override
	public int deleteBoard(BoardDto bdto) {
		return boardMapper.deleteBoard(bdto);
	}

	// 게시물 목록 조회
	@Override
	public List<BoardDto> getBoardList(BoardDto bdto) {
		return boardMapper.selectBoardList(bdto);
	}

	// 게시글의 개수를 조회
	@Override
	public int selectBoardTotalCount(BoardDto bdto) {
		return boardMapper.selectBoardTotalCount(bdto);
	}

	// 댓글 리스트
	@Override
	public List<BoardDto> getCommentList(BoardDto bdto) {
		return boardMapper.selectCommentList(bdto);
	}

	// 게시물 수정
	@Override
	public int modifyBoard(BoardDto bDto) {
		return boardMapper.updateBoard(bDto);
	}

	@Override
	public List<BoardDto> getMypost(BoardDto bdto) {
		return boardMapper.selectMypost(bdto);
	}

	@Override
	public int selectMyPostTotalCount(BoardDto bdto) {
		return boardMapper.selectMyPostTotalCount(bdto);
	}

	@Override
	public int commentCnt(Long postno) {
		return boardMapper.commentCnt(postno);
	}
}

△ BoardServiceImpl.java

 

package com.jeong.board.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jeong.board.domain.MemberDto;
import com.jeong.board.mapper.MemberMapper;

@Service
public class MemberServiceImpl implements MemberService {
	
	@Autowired
	private MemberMapper memberMapper;
	
	@Override
	public int addMember(MemberDto mDto) {
		return memberMapper.addMember(mDto);
	}

	@Override
	public int getId(MemberDto mDto) {
        return memberMapper.getId(mDto);
	}

	@Override
	public MemberDto getSelectOne(String id) {
		return memberMapper.getSelectOne( id);
	}

}

△ MemberServiceImpl.java

 

3. Controller

클라이언트의 요청을 받아서, 해당 요청에 대한 비즈니스 로직을 호출하고, 결과를 반환

HTTP 요청에 대한 처리를 담당하며, 요청을 받아들이고, 요청에 따라 적절한 Service를 호출하여 데이터를 처리

Model을 통해 뷰(View)에 데이터를 전달

 

△ com.jeong.board.controller

 

package com.jeong.board.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jeong.board.domain.BoardDto;
import com.jeong.board.service.BoardService;
import com.jeong.board.service.PageResolver;

@Controller
public class BoardController {

	@Autowired
	private BoardService boardService;

	// home 게시판 리스트 화면
	@GetMapping("/board/home.do")
	public String home(@RequestParam(value = "loginId", required = false) String loginid,
			@RequestParam(value = "pageNum", defaultValue = "1") String pageNum, Model model, HttpSession session,
			BoardDto bDto, String option, String keyword) {
		String loginId = (String) session.getAttribute("loginId");

//		long postno = bDto.getPgroup();
//		int commentCnt = boardService.commentCnt(postno);

		// 검색조건
		if (keyword != null) {
			bDto.setOption(option);
			bDto.setKeyword(keyword);
		}
		// 페이지네이션
		int pageSize = 5; // 페이지 당 게시글 갯수
		int page = 1;
		try {
			if (pageNum != null && !pageNum.equals("")) {
				page = Integer.parseInt(pageNum);
			}
		} catch (NumberFormatException e) {
			e.printStackTrace();
		}
		// 리스트 총 갯수
		int total = boardService.selectBoardTotalCount(bDto);
		// 첫 글 번호
		int beginPage = (page - 1) * pageSize + 1;
		// 마지막 글 번호
		int endPage = beginPage + pageSize - 1;

//		// System.out.println("total=" + total);
//		// System.out.println("beginPage=" + beginPage);
//		// System.out.println("endPage=" + endPage);
//		// System.out.println("page=" + page);
//		// System.out.println("pageNum=" + pageNum);
//		// System.out.println("=================================");

		bDto.setBeginPage(beginPage);
		bDto.setEndPage(endPage);

		List<BoardDto> boardList = boardService.getBoardList(bDto);
		PageResolver pr = new PageResolver(page, pageSize, total);

		model.addAttribute("boardList", boardList);
		model.addAttribute("pr", pr);
		model.addAttribute("loginId", loginId);
		model.addAttribute("option", option);

		return "board/home";
	}

	// 게시물 작성 화면
	@GetMapping("/board/write.do")
	public String openBoardWrite(HttpSession session, Model model, BoardDto bDto) {
		String loginId = (String) session.getAttribute("loginId");
		// System.out.println(loginId);
		model.addAttribute("loginId", loginId);

		return "board/write";
	}

	// 게시물 작성
	@PostMapping("/board/addBoard.do")
	public String addBoard(HttpSession session, BoardDto bDto, Model model) {
		String loginId = (String) session.getAttribute("loginId");
		bDto.setId(loginId);

		int write = 0;
		write = boardService.addBoard(bDto);
		// System.out.println("본문 작성 컨트롤러 = " + bDto);
		model.addAttribute("write", write);

		return "redirect:/board/view.do?postno=" + bDto.getPgroup();
	}

	// 게시물 삭제
	@GetMapping("/board/delete.do")
	public String deletePost(@RequestParam(value = "postno", required = false) Long postno, HttpSession session,
			BoardDto bdto, Model model) {
		String id = (String) session.getAttribute("loginId");
		int delete = 0;
		bdto.setId(id);
		bdto.setPostno(postno);
		// System.out.println("postno =" + postno + ", id =" + id);
		boardService.deleteBoard(bdto);
		model.addAttribute("delete", delete);
		model.addAttribute("loginId", id);
		return "redirect:/board/home.do";
	}

	// 게시물 수정 화면
	@GetMapping("/board/modify.do")
	public String modifyBoard(@RequestParam(value = "postno", required = false) Long postno, HttpSession session,
			Model model, BoardDto bDto) {
		String loginId = (String) session.getAttribute("loginId");
		bDto = boardService.getBoardDetail(postno);
		model.addAttribute("loginId", loginId);
		model.addAttribute("bDto", bDto);
		// System.out.println("bDto" + bDto);

		return "board/modify";
	}

	// 게시물 수정
	@PostMapping("/board/update.do")
	public String updateBoard(@RequestParam(value = "postno", required = false) Long postno, HttpSession session,
			Model model, BoardDto bDto) {
		String id = (String) session.getAttribute("loginId");
		System.out.println();

		int modify = 0;
		bDto.setId(id);
		bDto.setPostno(postno);
		modify = boardService.modifyBoard(bDto);
		model.addAttribute("modify", modify);

		return "redirect:/board/view.do?postno=" + bDto.getPostno();
	}

	// 자세히 보기
	@GetMapping("/board/view.do")
	public String openBoardDetail(@RequestParam(value = "postno", required = false) Long postno, HttpSession session,
			Model model, BoardDto bDto) {
		String loginId = (String) session.getAttribute("loginId");

		bDto = boardService.getBoardDetail(postno);
		int commentCnt = boardService.commentCnt(postno);

		Document doc = Jsoup.parse(bDto.getContent());
		bDto.setDoc(doc);
		List<BoardDto> commentList = boardService.getCommentList(bDto);

		model.addAttribute("bDto", bDto);
		model.addAttribute("commentList", commentList);
		model.addAttribute("loginId", loginId);
		model.addAttribute("commentCnt", commentCnt);

		return "board/view";
	}

	@GetMapping("/board/mypost.do")
	public String myhome(@RequestParam(value = "loginId", required = false) String loginid, Model model,
			HttpSession session, BoardDto bDto, String pageNum, String option, String keyword) {
		String id = (String) session.getAttribute("loginId");
		bDto.setId(id);

		// 검색조건
		if (keyword != null) {
			bDto.setOption(option);
			bDto.setKeyword(keyword);
		}
		// 페이지네이션
		int pageSize = 5; // 페이지 당 게시글 갯수
		int page = 1;
		try {
			if (pageNum != null && !pageNum.equals("")) {
				page = Integer.parseInt(pageNum);
			}
		} catch (NumberFormatException e) {
			e.printStackTrace();
		}
		// 리스트 총 갯수
		int total = boardService.selectMyPostTotalCount(bDto);
		// 첫 글 번호
		int beginPage = (page - 1) * pageSize + 1;
		// 마지막 글 번호
		int endPage = beginPage + pageSize - 1;

		bDto.setBeginPage(beginPage);
		bDto.setEndPage(endPage);

		List<BoardDto> boardList = boardService.getMypost(bDto);
		PageResolver pr = new PageResolver(page, pageSize, total);

		model.addAttribute("boardList", boardList);
		model.addAttribute("pr", pr);
		model.addAttribute("loginId", id);
		model.addAttribute("option", option);

		// System.out.println(model);

		return "board/mypost";
	}

	// 자세히 보기
	@GetMapping("/board/ajaxTest.do")
	public String openBoardDetail2(@RequestParam(value = "postno", required = false) Long postno, HttpSession session,
			Model model, BoardDto bDto) {
		String loginId = (String) session.getAttribute("loginId");
		bDto = boardService.getBoardDetail(postno);
		Document doc = Jsoup.parse(bDto.getContent());
		bDto.setDoc(doc);

		model.addAttribute("bDto", bDto);
		model.addAttribute("loginId", loginId);

		return "board/ajaxTest";
	}

	// 로그인 체크
	@GetMapping("/board/loginCheck.do")
	@ResponseBody
	public Map<String, Object> loginId(HttpSession session) {
		Map<String, Object> result = new HashMap<>();
		String loginId = (String) session.getAttribute("loginId");
		result.put("loginId", loginId);
		return result;
	}

	// ajax 댓글 & 대댓글 작성
	@PostMapping("/board/addC.do")
	public String ajaxInsertComment(HttpSession session, BoardDto bDto, Model model) {
		String loginId = (String) session.getAttribute("loginId");
		bDto.setId(loginId);

		int cWrite = 0;
		cWrite = boardService.addBoard(bDto);
		model.addAttribute("cWrite", cWrite);
		// System.out.println("댓글 작성 컨트롤러 = " + bDto);

		return "board/ajaxTest :: #commentList";
	}

	// ajax 댓글 조회
	@GetMapping("/board/commentList.do")
	@ResponseBody
	public List<BoardDto> commentList(@RequestParam(value = "postno", required = false) Long postno, BoardDto bDto) {

		bDto.setPostno(postno);
		List<BoardDto> commentList = boardService.getCommentList(bDto);

		return commentList;
	}

	// ajax 댓글 수 조회
	@GetMapping("/board/commentCnt.do")
	@ResponseBody
	public int commentCnt(@RequestParam(value = "postno", required = false) Long postno, BoardDto bDto) {

		bDto.setPostno(postno);
		int commentCnt = boardService.commentCnt(postno);

		return commentCnt;
	}

	// 댓글 삭제
	@PostMapping("/board/ajaxdelete.do")
	public String ajaxDelete(@RequestParam(value = "postno", required = false) Long postno, HttpSession session,
			BoardDto bdto, Model model) {
		String id = (String) session.getAttribute("loginId");
		int delete = 0;
		bdto.setId(id);
		bdto.setPostno(postno);

		boardService.deleteBoard(bdto);
		model.addAttribute("delete", delete);
		model.addAttribute("loginId", id);

		return "board/ajaxTest :: #commentList";
	}

	// 댓글 수정
	@PostMapping("/board/ajaxupdate.do")
	public String updateComment(@RequestParam(value = "postno", required = false) Long postno, HttpSession session,
			Model model, BoardDto bDto) {
		String id = (String) session.getAttribute("loginId");
		int modify = 0;
		bDto.setId(id);
		bDto.setPostno(postno);
		System.out.println(postno);

		modify = boardService.modifyBoard(bDto);
		model.addAttribute("modify", modify);

		return "board/ajaxTest :: #commentList";

	}
}

△ BoardController.java

 

package com.jeong.board.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jeong.board.domain.MemberDto;
import com.jeong.board.service.MemberService;

@Controller
public class MemberController {
	public final Logger logger = LoggerFactory.getLogger(MemberController.class);

	@Autowired
	private MemberService memberservice;

	// 회원가입 화면
	@GetMapping("/board/register.do")
	public String register() {

		return "board/register";
	}

	// 회원가입
	@PostMapping("/board/addMember.do")
	public String addMember(MemberDto mDto, Model model) {
		// id중복체크
		String msg = "";
		if (getId(mDto) > 0) {
			msg = "중복된 아이디입니다.";
			model.addAttribute("msg", msg);
			return "/board/register";
		}
		int login = 0;
		login = memberservice.addMember(mDto);
		model.addAttribute("login", login);

		return "redirect:/board/login.do";
	}

	// id중복체크
	public int getId(MemberDto mDto) {
		return memberservice.getId(mDto);
	}

	// 로그인 화면
	@GetMapping("/board/login.do")
	public String login(@RequestParam(value="loginId", required=false) String loginid,MemberDto mDto, HttpSession session, Model model) {
		String loginId = (String)session.getAttribute("loginId");
		// System.out.println("login화면 로그인한 아이디: " + loginId);

		return "board/login";
	}

	// 로그인
	@PostMapping("/board/run.do")
	public String loginform(MemberDto mDto, HttpSession session, Model model) {
		String msg = "";
		MemberDto idDto = memberservice.getSelectOne(mDto.getId());

		if (idDto == null || idDto.equals(null)) {
			msg = "존재하지 않는 아이디입니다.";
			model.addAttribute("msg", msg);
			return "board/login";
		} else if (mDto.getPw().equals(idDto.getPw()) || (mDto.getPw() == idDto.getPw())) {
			session.setAttribute("loginId", mDto.getId());
			int login = 0;
			model.addAttribute("loginId",  mDto.getId());
			model.addAttribute("login",  login);
			System.out.println(mDto.getId());
			return "board/run";
		} else {
			msg = "비밀번호 오류입니다.";
			model.addAttribute("msg", msg);
			return "board/login";
		}
	}

	// 로그아웃
	@GetMapping("/board/logout.do")
	public String logout(@RequestParam(value = "loginId", required = false) String loginid, HttpSession session, Model model) {
		String loginId = (String) session.getAttribute("loginId");
		// System.out.println("로그아웃하는 아이디: " + loginId);
		session.invalidate();
		int logout = 0;
		model.addAttribute("logout", logout);

		return "board/run";
	}
}

△ MemberController.java