머스태치 설정 제거
spring:
mustache:
servlet:
expose-session-attributes: true # Mustache 템플릿에서 세션 속성에 접근할 수 있도록 허용
expose-request-attributes: true # Mustache 템플릿에서 요청 속성에 접근할 수 있도록 허용
머스태치 파일 전체 삭제 하기
UserController
package com.tenco.blog_v3.user;
import com.tenco.blog_v3.common.errors.Exception401;
import com.tenco.blog_v3.common.errors.Exception500;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
@RequiredArgsConstructor
@Slf4j
@Controller
public class UserController {
// DI 처리
private final UserService userService;
private final HttpSession session;
/**
* 사용자 정보 수정
*
* @param reqDTO
* @return 메인 페이지
*/
@PostMapping("/user/update")
public String update(@ModelAttribute(name = "updateDTO") UserDTO.UpdateDTO reqDTO) {
User sessionUser = (User) session.getAttribute("sessionUser");
if (sessionUser == null) {
return "redirect:/login-form";
}
User updatedUser = userService.updateUser(sessionUser.getId(), reqDTO);
// 세션 정보 동기화 처리
session.setAttribute("sessionUser", updatedUser);
return "redirect:/";
}
/**
* 회원 가입 기능 요청
*
* @param reqDto
* @return
*/
@PostMapping("/join")
public String join(@ModelAttribute(name = "joinDTO") UserDTO.JoinDTO reqDto) {
// 유효성 검사 생략 ...
try {
userService.signUp(reqDto);
} catch (DataIntegrityViolationException e) {
throw new Exception500("동일한 유저네임이 존재 합니다.");
}
return "redirect:/login-form";
}
/**
* 자원에 요청은 GET 방식이지만 보안에 이유로 예외 !
* 로그인 처리 메서드
* 요청 주소 POST : http://localhost:8080/login
*
* @param reqDto
* @return
*/
@PostMapping("/login")
public String login(UserDTO.LoginDTO reqDto) {
try {
User sessionUser = userService.signIn(reqDto);
session.setAttribute("sessionUser", sessionUser);
return "redirect:/";
} catch (Exception e) {
throw new Exception401("유저이름 또는 비밀번호가 틀렸습니다.");
}
}
@GetMapping("/logout")
public String logout() {
session.invalidate(); // 세션을 무효화 (로그아웃)
return "redirect:/";
}
}
BoardController
package com.tenco.blog_v3.board;
import com.tenco.blog_v3.user.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.Objects;
@Slf4j
@RequiredArgsConstructor
@Controller
public class BoardController {
private final BoardService boardService; // BoardService 주입
private final HttpSession session;
/**
* 게시글 수정 처리 메서드
* 요청 주소: **POST http://localhost:8080/board/{id}/update**
*
* @param id 수정할 게시글의 ID
* @param updateDTO 수정된 데이터를 담은 DTO
* @return 게시글 상세보기 페이지로 리다이렉트
*/
@PostMapping("/board/{id}/update")
public String update(@PathVariable(name = "id") Integer id, @ModelAttribute(name = "updateDTO") BoardDTO.UpdateDTO updateDTO) {
// 세션에서 로그인한 사용자 정보 가져오기
User sessionUser = (User) session.getAttribute("sessionUser");
if (sessionUser == null) {
return "redirect:/login-form"; // 로그인하지 않은 경우 로그인 페이지로 리다이렉트
}
// 게시글 수정 서비스 호출
boardService.updateBoard(id, sessionUser.getId(), updateDTO);
// 수정 완료 후 게시글 상세보기 페이지로 리다이렉트
return "redirect:/board/" + id;
}
/**
* 게시글 삭제 처리 메서드
* 요청 주소: **POST http://localhost:8080/board/{id}/delete**
*
* @param id 삭제할 게시글의 ID
* @return 메인 페이지로 리다이렉트
*/
@PostMapping("/board/{id}/delete")
public String delete(@PathVariable(name = "id") Integer id) {
// 세션에서 로그인한 사용자 정보 가져오기
User sessionUser = (User) session.getAttribute("sessionUser");
// 세션 유효성 검증
if (sessionUser == null) {
return "redirect:/login-form"; // 로그인 페이지로 리다이렉트
}
// 게시글 삭제 서비스 호출
boardService.deleteBoard(id, sessionUser.getId());
// 메인 페이지로 리다이렉트
return "redirect:/";
}
/**
* 게시글 작성 처리 메서드
* 요청 주소: **POST http://localhost:8080/board/save**
*
* @param dto 게시글 작성 요청 DTO
* @return 메인 페이지로 리다이렉트
*/
@PostMapping("/board/save")
public String save(@ModelAttribute BoardDTO.SaveDTO dto) {
// 세션에서 로그인한 사용자 정보 가져오기
User sessionUser = (User) session.getAttribute("sessionUser");
// 세션 유효성 검증
if (sessionUser == null) {
return "redirect:/login-form"; // 로그인 페이지로 리다이렉트
}
// 게시글 작성 서비스 호출
boardService.createBoard(dto, sessionUser);
// 메인 페이지로 리다이렉트
return "redirect:/";
}
/**
* 게시글 상세보기 처리 메서드
* 요청 주소: **GET http://localhost:8080/board/{id}**
*
* @param id 게시글의 ID
* @param request HTTP 요청 객체
* @return 게시글 상세보기 페이지 뷰
*/
@GetMapping("/board/{id}")
public String detail(@PathVariable Integer id, HttpServletRequest request) {
// 세션에서 로그인한 사용자 정보 가져오기
User sessionUser = (User) session.getAttribute("sessionUser");
Board board = boardService.getBoardDetails(id, sessionUser);
// 현재 사용자가 게시글의 작성자인지 확인하여 isOwner 필드 설정
boolean isOwner = false;
if (sessionUser != null) {
if (Objects.equals(sessionUser.getId(), board.getUser().getId())) {
isOwner = true;
}
}
// 뷰에 데이터 전달
request.setAttribute("isOwner", isOwner);
request.setAttribute("board", board);
return "board/detail";
}
}
'Spring boot > 개념 공부' 카테고리의 다른 글
공통 응답 DTO 및 예외 처리 구조 만들기 (0) | 2024.11.08 |
---|---|
RestAPI 주소 변경 및 인터셉터 수정 (0) | 2024.11.08 |
RestAPI 주소 설계 규칙 (0) | 2024.11.08 |
CORS(Cross-Origin Resource Sharing)이란 뭘까? (1) | 2024.11.08 |
@SessionAttribute 와 HttpSession을 멤버 필드로 주입 받는것의 문제점 (0) | 2024.11.08 |