프로그래밍

[Spring] day70 : NULL update 이슈 본문

자바/Spring

[Spring] day70 : NULL update 이슈

시케 2023. 8. 20. 21:33
728x90
반응형

2023.08.18.금

NULL update 이슈

정보를 업데이트할때 UPDATE 쿼리에 있는 모든 인자값을 변경하는게 아니라면

일부의 정보만 선택하여 변경하게 된다

이때 변경하지 않으려던 정보의 인자값에 NULL이 업데이트 되는 문제를 말한다

 

ex)
글 정보
글 제목, 글 내용, 사진이 있을 경우
내용만 변경시 별도의 이미지를 추가하지 않으면 해당 파라미터 값이 NULL로 변경
Controller -> Service -> DAO -> DB까지 전달

사용자가 주의해서 항상 사진을 추가하게 할 수도 있지만

이는 부당하다

다른 방식으로 NULL update 이슈를 해결해보자

 

@SessionAttributes

해당 어노테이션은 세션 단위로 객체를 저장할 수 있다

Controller 단위로 사용하며

만약 NULL이면 VIEW에서 가지고 있던 그 정보로 set 해준다

이때 VIEW에 줬던 정보로도 알려줘야 하기 때문에

@ModelAttribute 또한 함께 사용해야 한다

 

해당 어노테이션은 이전에도 다루었었다

2023.08.13 - [Spring] - [Spring] day63 : 테스트계정 / 검색 예제

 

[Spring] day63 : 테스트계정 / 검색 예제

2023.08.07.월 테스트계정 / 검색 예제 현재까지 학습한 내용인 Spring MVC 방식으로 테스트계정과 검색 예제를 구현해보자 [@ModelAttribute("이름")] VIEW에서 사용할 데이터를 세팅하려는 목적으로 활용하

dev-9rm.tistory.com

 

BoardController.java

package com.spring.view.controller;

@Controller
@SessionAttributes("data")
public class BoardController {
	
	@Autowired
	private BoardService boardService;

	@ModelAttribute("searchMap")
	public Map<String,String> searchMap(){
		Map<String,String> map=new HashMap<String,String>();
		map.put("제목", "TITLE");
		map.put("작성자", "WRITER");
		return map;
	}
	
	@RequestMapping(value="/main.do")
	public String main(@ModelAttribute("mem")MemberVO mVO, BoardVO bVO, Model model) {
		System.out.println("searchCondition: "+bVO.getSearchCondition());
		System.out.println("searchContent: "+bVO.getSearchContent());
		if(bVO.getSearchCondition() == null) {
			bVO.setSearchCondition("TITLE");
			bVO.setSearchContent("");
		} // 검색 로직에서 종종 활용되는 기법
		
		mVO.setMid("test");
		mVO.setMpw("1234");
		
		// model.addAttribute("mem", mVO);
		model.addAttribute("datas", boardService.selectAll(bVO));
		return "main.jsp";
	}
	
	@RequestMapping(value="/board.do")
	public String selectBoard(BoardVO bVO, Model model) {
		model.addAttribute("data", boardService.selectOne(bVO));
		bVO.setSearchCondition("CNT");
		boardService.update(bVO);
		return "board.jsp";
	}
	
	@RequestMapping(value="/updateBoard.do")
	public String updateBoard(@ModelAttribute("data")BoardVO bVO) throws IllegalStateException, IOException {
		MultipartFile fileUpload=bVO.getFileUpload();
		if(!fileUpload.isEmpty()){
			String fileName=fileUpload.getOriginalFilename();
			System.out.println("파일명: "+fileName);
			
			bVO.setFileName(fileName);
			
			fileUpload.transferTo(new File("D:\\KIM\\ws\\day60\\src\\main\\webapp\\images\\"+fileName));
		}
		
		boardService.update(bVO);
		return "board.do";
	}
	
	@RequestMapping(value="/deleteBoard.do")
	public String deleteBoard(BoardVO bVO) {
		if(boardService.delete(bVO)){
			return "redirect:main.do";
		}
		else{
			return "board.do";
		}
	}
	
	@RequestMapping(value="/insertBoard.do", method=RequestMethod.GET)
	public String insertBoardPage() {
		return "redirect:insertBoard.jsp";
	}
	
	@RequestMapping(value="/insertBoard.do", method=RequestMethod.POST)
	public String insertBoard(BoardVO bVO) throws IllegalStateException, IOException {
		MultipartFile fileUpload=bVO.getFileUpload();
		if(!fileUpload.isEmpty()){
			String fileName=fileUpload.getOriginalFilename();
			System.out.println("파일명: "+fileName);
			
			bVO.setFileName(fileName);
			
			fileUpload.transferTo(new File("D:\\KIM\\ws\\day60\\src\\main\\webapp\\images\\"+fileName));
		}
		
		if(boardService.insert(bVO)){
			return "redirect:main.do";
		}
		else{
			return "redirect:insertBoard.jsp";
		}
	}
	
}

 

매우 편리한 어노테이션이지만

등록한 데이터가 많아질수록 요청이 무거워진다

∴ 해당 어노테이션을 사용하는 Controller만 분리하여 사용

 

또한 검색어와 같이 NULL 자체를 필요로 하는 경우에는 불리할 수 있다

※ 검색어가 NULL인 경우에는 이전 검색 정보를  보고 싶은 것이 아닌 전체 결과를 보고 싶은것

 

https://github.com/jihyean/Spring/tree/main/day70

 

728x90
반응형
Comments