본문 바로가기
수업자료

세션으로부터 로그인한 사용자 정보를 가져와서 활용

by ^..^v 2023. 1. 13.
728x90
반응형

board_세션정보활용.zip
1.11MB

 

게시판 글 저장, 수정, 삭제 시 로그인한 사용자의 아이디를 가져와서 글쓴이 아이디와 글수정 아이디로 설정합니다. 

 

BoardController

글 쓰기 페이지 요청, 글 저장 요청, 글 수정 요청, 글 삭제 요청을 처리하는 컨트롤러 메서드에 로그인한 사용자 정보를 세션에서 가져와서 사용자 ID를 추출해서 글쓴이 ID 또는 글수정 ID로 설정합니다. 

package board.controller;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
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.servlet.ModelAndView;

import board.dto.BoardDto;
import board.dto.UserDto;
import board.service.BoardService;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class BoardController {
	
	// private Logger log = LoggerFactory.getLogger(this.getClass());

	@Autowired
	private BoardService boardService;
	
	
	// (로그인 기능 구현 전) 테스트를 위해 사용자 정보를 세션에 저장
	private void makeSessionForTest(HttpSession session) {
		UserDto userDto = new UserDto();
		userDto.setUserId("tester");
		userDto.setUserName("테스터");
		userDto.setUserEmail("tester@test.com");
		
		session.setAttribute("user", userDto);
	}
	
	
	@GetMapping("/board/openBoardList.do")
	public ModelAndView openBoardList() throws Exception {
		ModelAndView mv = new ModelAndView("/board/boardList");
		
		List<BoardDto> list = boardService.selectBoardList();
		mv.addObject("list", list);
		
		return mv;
	}
	
	@GetMapping("/board/openBoardWrite.do")
	public String openBoardWrite(HttpSession session) throws Exception {
		// 테스트를 위한 것으로 사용자 정보를 세션에 저장 
		// 로그인 기능이 구현되면 추가할 필요가 없음 
		makeSessionForTest(session);
        
		return "/board/boardWrite";
	}
	
	@PostMapping("/board/insertBoard.do")
	public String insertBoard(BoardDto boardDto, HttpSession session) throws Exception {
		// 글쓴이 아이디를 세션에서 가져와서 저장
		UserDto userDto = (UserDto)session.getAttribute("user");
		boardDto.setCreatedId(userDto.getUserId());
		
		boardService.insertBoard(boardDto);
		return "redirect:/board/openBoardList.do";
	}
	
	@GetMapping("/board/openBoardDetail.do")
	public ModelAndView openBoardDetail(@RequestParam int boardIdx) throws Exception {
		ModelAndView mv = new ModelAndView("/board/boardDetail");
		
		BoardDto boardDto = boardService.selectBoardDetail(boardIdx);
		mv.addObject("board", boardDto);
		
		return mv;
	}
	
	@PostMapping("/board/updateBoard.do")
	public String updateBoard(BoardDto boardDto, HttpSession session) throws Exception {
		// 글쓴이 아이디를 세션에서 가져와서 저장
		UserDto userDto = (UserDto)session.getAttribute("user");
		boardDto.setUpdatedId(userDto.getUserId());
		
		boardService.updateBoard(boardDto);
		return "redirect:/board/openBoardList.do";
	}
	
	@PostMapping("/board/deleteBoard.do")
	public String deleteBoard(BoardDto boardDto, HttpSession session) throws Exception {
		// 글삭제 아이디를 세션에서 가져와서 저장
		UserDto userDto = (UserDto)session.getAttribute("user");
		boardDto.setUpdatedId(userDto.getUserId());
		
		boardService.deleteBoard(boardDto.getBoardIdx());
		return "redirect:/board/openBoardList.do";
	}
}

 

 

boardWrite.html

세션에 저장된 사용자 정보(이름과 아이디)를 [[${session.세션객체이름.필드이름}]] 형식으로 화면에 출력합니다. 

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>게시판</title>
	<link rel="stylesheet" th:href="@{/css/style.css}" />
</head>
<body>
	<div class="container">
		<h2>게시판 등록</h2>
		<form action="/board/insertBoard.do" method="POST" id="frm" name="frm">
			<table class="board_detail">
				<tr>
					<td>글쓴이</td>
					<!-- 로그인한 사용자 이름과 아이디를 세션에서 가져와 출력 -->                    
					<td>[[${session.user.userName}]] ([[${session.user.userId}]])</td>
				</tr>
				<tr>
					<td>제목</td>
					<td><input type="text" id="title" name="title" /></td>
				</tr>
				<tr>
					<td colspan="2"><textarea id="contents" name="contents"></textarea></td>
				</tr>
			</table>
			<input type="submit" id="submit" value="저장" class="btn" />
		</form>		
	</div>
</body>
</html>

 

 

sql-board.xml

글쓴이ID와 글수정ID를 BoardDto 객체의 createdId 필드와 updatedId 필드의 값을 사용하도록 쿼리를 수정합니다.

<?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="board.mapper.BoardMapper">
	<select id="selectBoardListForSample" resultType="board.dto.BoardDto">
		select board_idx, title, hit_cnt, 
		       date_format(created_dt, '%Y-%m-%d %H:%i:%s') as created_dt
		  from t_board
		 where deleted_yn = 'N'
	  order by board_idx desc
	     limit 4;
	</select> 
	
	<select id="selectBoardList" resultType="board.dto.BoardDto">
		select board_idx, title, hit_cnt, 
		       date_format(created_dt, '%Y-%m-%d %H:%i:%s') as created_dt
		  from t_board
		 where deleted_yn = 'N'
	  order by board_idx desc
	</select> 
	
	<insert id="insertBoard" parameterType="board.dto.BoardDto">
		insert into t_board (title, contents, created_dt, created_id)
		values ( #{title}, #{contents}, now(), #{createdId} )
	</insert>
	
	<update id="updateHitCount" parameterType="int">
		update t_board 
		   set hit_cnt = hit_cnt + 1
		 where board_idx = #{boardIdx}
	</update>
	
	<select id="selectBoardDetail" parameterType="int" resultType="board.dto.BoardDto">
		select board_idx, title, contents, hit_cnt,
		       date_format(created_dt, '%Y-%m-%d %H:%i:%s') as created_dt,
		       created_id
		  from t_board
		 where deleted_yn = 'N' and board_idx = #{boardIdx}		       
	</select>
	
	<update id="updateBoard" parameterType="board.dto.BoardDto">
		update t_board
		   set title = #{title}, 
		       contents = #{contents}, 
		       updated_dt = now(), 
		       updated_id = #{updatedId}
		 where board_idx = #{boardIdx} 		 
	</update>
	
	<delete id="deleteBoard" parameterType="int">
		update t_board
		   set deleted_yn = 'Y', 
		       updated_dt = now(), 
		       updated_id = #{updatedId}
		 where board_idx = #{boardIdx} 		 
	</delete>
</mapper>

 

 

테스트

글쓰기 페이지에 로그인한 사용자의 이름과 아이디가 출력되는 것을 확인합니다. 

 

상세 페이지에 작성자 항목이 정상적으로 출력되는 것을 확인합니다.

728x90
반응형

'수업자료' 카테고리의 다른 글

20230126 실습내용  (0) 2023.01.26
페이징 기능 추가  (0) 2023.01.17
로그인, 로그아웃 기능 추가  (0) 2023.01.11
20230110 실습내용  (0) 2023.01.10
20230106 실습내용  (0) 2023.01.06

댓글