1-12 Blog(리팩토링)4

Blog(리팩토링)
홍윤's avatar
Aug 26, 2024
1-12 Blog(리팩토링)4

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

Uni