Spring

[Spring] @SessionAttribute / null 업데이트 방지 / 세션에 저장해서 사용하기

bkuk 2023. 3. 6. 23:24

@SessionAttribute는 수정 작업을 처리할 때, 유용하게 사용할 수 있는 어노테이션이다.

예를들어, 상세 화면에서 게시글을 수정한다고 가정해보자.

 

사용자가 수정한 제목과 내용 정보 등을 가지고 "/update"와 같은 요청을 한다. 이때 사용자가 입력한 정보 외에 작성자 정보는 전달되지 않는다. 즉, Command 객체인 BoardTO에 writer 정보가 저장되지 않는다.

개발자에 따라 다르겠지만, 만약 작성자 컬럼까지 수정되도록 돼있다면 작성자(writer) 파라미터 정보가 전달되지 않으므로 null로 수정될 것이다.

update board set title = ?, writer = ?, content = ? where seq = ?

 

이런 문제를 해결하기 위해서 사용된다.

@Controller
@SessionAttributes("board")
public class BoardController {
	
    @RequestMapping("/update")
    public String updateBoard(@ModelAttribute("board") BoardTO to, BoardDAO boardDAO)
    	boardDAO.updateBoard(to)
        return "getBoardList.do";
}

 

위와 같이 사용하려면 설정을 해야한다.

우선, getBoard() 메서드는사용자가 수정하기 전에 상세화면을 요청하면 getBoard() 메서드는 검색 결과인 BoardTO 객체를 board라는 이름으로 Model에 저장한다.

 

그렇다면, 이때 BoardController 클래스에 선언된 @SessionAttributes("board") 설정이 매우 중요하다.

아래와 같이 설정하면 된다.

@Controller
@SessionAttributes("board")
public class BoardController {
	@RequestMapping("/getBoard")
    public String getBoard(BoardTO to, BoardDAO boardDAO, Model model) {
    	model.addAttribute( "board", boardDAO.getBoard(to));
        return "getBoard.jsp";
    }
}

 

getBoard() 메서드가 실행되면 Model에 board라는 이름으로  BoardTO 객체가 생성되고, 세션에도 board라는 이름으로 BoardTO 객체가 저장된다.

 

BoardController의 updateBoard() 메서드가 호출될 때, 스프링 컨테이너는 우선 @ModelAttritube("board") 설정을 해석하여 세션에 board라는 이름으로 저장된 데이터가 있는지 확인한다. 있다면 세션에서 꺼내어 to 변수에 할당한다.