일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 페이지분석
- 자바 오류
- 데이터베이스
- 크롤링
- 자바
- DoitSQL
- 자바 예외
- 예외
- Doit입문SQL
- 웹 브라우저 전쟁
- HTML역사
- 함수
- R1C3
- 숫자 형식
- 예제
- 함수 선언
- DoIt
- 우아한테크
- 생성자
- html
- 숫자형식오류
- 키-값 데이터베이스
- 배열 3요소
- SQL입문
- 웹브라우저 수용도
- DoitSQL입문
- dbms
- 배열 예제
- 크롤링 오류
- SQL
Archives
- Today
- Total
프로그래밍
[Spring] day70 : NULL update 이슈 본문
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 : 테스트계정 / 검색 예제
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
반응형
'자바 > Spring' 카테고리의 다른 글
[Spring] day74 : 다국어처리 (2) | 2023.08.24 |
---|---|
[Spring] day72 : 스프링 레거시 프로젝트에서 별도의 라이브러리 없이 진행할 수 있는 비동기처리 (2) | 2023.08.22 |
[Spring] day70 : 예외 발생 처리 페이지 (0) | 2023.08.18 |
[Spring] day69 : 파일 업로드 예제 (2) | 2023.08.17 |
[Spring] day68 : JDBC Template (0) | 2023.08.17 |
Comments