inblog logo
|
Uni

    1-12 Blog(리팩토링)4

    Blog(리팩토링)
    홍윤's avatar
    홍윤
    Aug 26, 2024
    1-12 Blog(리팩토링)4
    Contents
    1. User1.UserController2. Board1.BoardController2. BoardService3.config4.intercepotr

    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

    RSS·Powered by Inblog