1. User
1.UserController
@PostMapping("/login")
public String login(UserRequest.loginDTO loginDTO) {
// User sessionUser = userRepository.findByUsernameAndPassword(loginDTO.getUsername(),loginDTO.getPassword());
User sessionUser = userService.로그인(loginDTO);
session.setAttribute("sessionUser", sessionUser);
return "redirect:/";
}
@GetMapping("/logout")
public String logout() {
session.invalidate(); // 안에 있는 세션 데이터를 다 날린다.
return "redirect:/";
}
- Interceptor를 만들었기 때문에 return 값에 ‘/’만 넣었다.
2. Board
1.BoardController
//url : http://loacahost8080/board/1/update
//body: title = 제목1변경&content=내용1변경
//content-type : x-www-form-urlencoded
@PostMapping("/api/board/{id}/update")
public String update(@PathVariable("id") int id, BoardRequest.UpdateDTO updateDTO) {
User sessionUser = (User) session.getAttribute("sessionUser");
// 인증 체크 필요함
boardService.게시글수정(id, updateDTO, sessionUser);
//만들어놨으면 redirect
return "redirect:/board/" + id;
}
- “/api/”는 API의 경로를 나타내며, {id}는 경로 변수로, 업데이트할 특정 게시판 글의 ID를 의미합니다. 이 ID는 요청 URL에서 동적으로 할당됩니다.
@PostMapping("/api/board/{id}/delete")
public String delete(@PathVariable("id") int id) {
User sessionUser = (User) session.getAttribute("sessionUser");
boardService.게시글삭제(id, sessionUser);
return "redirect:/";
}
- “/api/”는 API의 경로를 나타낸다.
@PostMapping("/api/board/save")
public String save(BoardRequest.SaveDTO saveDTO) { // 스프링 기본전략 = x-www-form-urlencoded 파싱
User sessionUser = (User) session.getAttribute("sessionUser");
// 인증 체크 필요함
boardService.게시글쓰기(saveDTO, sessionUser);
return "redirect:/";
}
- “/api/”는 API의 경로를 나타낸다.
@GetMapping("/api/board/{id}/update-form")
public String updateForm(@PathVariable("id") int id, HttpServletRequest request) {
//부가로직
User sessionUser = (User) session.getAttribute("sessionUser");
//핵심로직
Board board = boardService.게시글수정화면(id, sessionUser);
request.setAttribute("model", board);
return "board/update-form";
}
- “/api/”는 API의 경로를 나타낸다.
2. BoardService
@Transactional
public void 게시글수정(int id, BoardRequest.UpdateDTO updateDTO, User sessionUser) {
//1.게시글 조회(없으면 404)
Board board = boardRepository.findById(id);
//2. 권환체크
if (board.getUser().getId() != sessionUser.getId()) {
throw new Exception403("게시글 수정할 권한이 없습니다.");
}
//3.게시글 수정
board.setTitle(updateDTO.getTitle());
board.setContent(updateDTO.getContent());
} //flush() 자동 호출됨(더티체킹)
// Hibernate:
// update
// board_tb
// set
// content=?,
// created_at=?,
// title=?,
// user_id=?
// where
// id=?
자동으로 데이터베이스에 반영 (더티 체킹)
- 메서드가 끝나면, ‘@Transactional 어노테이션에 의해 트랜잭션이 자동으로 커밋됩니다.
- 이 과정에서 Hibernate는 더티 체킹(Dirty Checking)을 통해, 변경된 객체의 상태를 감지하고, 변경된 부분을 데이터베이스에 반영합니다.
3.config
package shop.mtcoding.blog.core.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import shop.mtcoding.blog.core.interceptor.LoginInterceptor;
//인터셉터
@Configuration // IoC에 저장됨
public class WebConfig implements WebMvcConfigurer {
//모든 곳에서 말고 특정한 곳에서 사용
// /user, /board 할 때만 뜬다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/api/**");
}
}
‘@Configuration’
- 이 어노테이션은 ‘WebConfig’ 클래스를 스프링 IoC 컨테이너에 빈(Bean)으로 등록되도록 한다.
- 이 클래스가 스프링의 설정 클래스로 사용된다는 의미다.
‘WebMvcConfigurer’ 인터페이스 구현
- ‘WebMvcConfigurer’는 스프링 MVC의 설정을 커스텅마이징할 수 있도록 하는 인터페이스입니다.
- 이를 구현함으로써, 여러 메소드를 오버라이드하여 MVC 설정을 조정할 수 있다.
‘
4.intercepotr
Share article