update할 때 굉장히 중요한 도구!
<set>을 알아보자. 정말 고마운 녀석!
update 하는데 만약에! hit값만 전달된다면? 나머지는 다 null이 올 것
update하면 hit만 업데이트 되고 나머지는 null이라니...
-> 3번 게시물 업데이트 하고 싶어? 그럼 3번 '가지고와' + 'hit 업데이트'
- 기존값 채워지고, update 해주는 <set>!
먼저, '테스트'를 해보자.
ex) NoticeDao가 잘 나오는지 테스트하고 싶으면?
테스트 하려면 ui가 있어야 하는데 ... 도와주는 macro 함수가 있음.
edit 에 대해서
- get, post
지금 테스트 목적으로 그냥 NoticeController에 NoticeDao 연결해서 만들어줌
edit.jsp도 <main>만 넣은 상태로 준비
실습
edit 페이지에서 '저장' 누르면?
post가 된다는건 jsp에서 name="title", name="content"가 올 것
cf) 사용자가 '작성자' 같은건 수정하지 않도록 해야해서 hidden으로 담아야 함 (만약 내가 서버 쪽에 전달하고 싶다면~)
-> 반드시 전달해야 할 게 하나 있음.
'게시글에 대한 id' (그래서 이걸 hidden으로 해준거)
//
3개를 주는데 이게 문자가 됨
살펴보자
Q. 왜 이런 에러가 날까?
edit로 전달되는건 3개 (id, title, content)
-> notice (브라운색)에 담겨질텐데
나머지는 null이 담겨질 것
-> 이 상태에서 update 해달라고 하는거니까
그래서 저기가 null 된다고 지금 오류가 난 것
-> 예전에는 다~~ <if>절로 쿼리식을 다 해줬었음
cf) jdbc 시절에는 더 심각. update 하나 가지고 한 30줄 정도 써야했었지....
설명
134.
title, writerId, content, hit, files, pub... 이런게 '다 채워져있는게 한 줄 있다고 하자. 그걸 getId() 해가지고 지금 id에 맞는거 한 개를 가지고 온 것 (그리고 그걸 origin이라고 해보자)
135-136.
그리고 origin에 우리가 post하는 title, content을 '오버라이드' 해서 138. update하는 것
<set>
- update에서만 사용함
근데 에러남
- redirect 다음에 ?id.. 하고 주소를 줘야함
Q. 값이 전달 안되었는데 왜 남아있을까. 우리가 원하는건 아예 쿼리식이 사라지는건데...!
이 식 보려면 어디로?
-> edit 페이지에서 실제로 수정해주고, 그 다음에 콘솔보면 됨
비교문의 문제.
ex) hit는 null이 될 수 없는데, 비교문은 hit !=null 이렇게 적었음
hit의 자료형은 int인데 int가 null일 수는 없는 것
cf)
f3번 누르면 : 코드가 있는 곳으로 감
코드 열고 싶지 않으면 f4 -> 타입 정보 볼 수 있음
참조형만 null이 되는 것
조건에 안맞으니까 hit 같은게 출력되는 것임
// okay. hit는 그렇다 치고...
pub? (공개/비공개)는 -> update하려면 true일 경우에만 저 문장이 들어가도록. !=false
true면 빠지도록.
다시 비공개하려면 false 값.
-> pub가 false가 될 수 없게 되버림
저 문장이 빠져버려서 false가 될 수 없는 것!
entity를 차라리 null 이 될 수 있도록 자료형을 바꾸는 형식으로!
래퍼클래스?형으로 만들어주면 기본값이 null이 된다.
// 요즘은 이게 대세!
저거 출력 결과 보기
-> 나는 Notice.java에서 boolean으로 적어줘서 pub이 계속 나왔었음. Boolean으로! (이게 null가질 수 있는 래퍼클래스형)
cf) 래퍼클래스
파일은 추가적으로 담아주기 (multiparts 파일)
등록할 때
Notice가 먼저 생성되어야
Notice의 id를 참고해서 NoticeFile을 만들 수 있다는 것
id를 넣지 않고 insert(notice) 해버리면 저절로 id가 생김 ex) 5번
- 저 5번을 알아내기 위해
notieDao.가장 최근거 getLast(id); -> 방금 들어간 녀석을 얻어옴
그리고 아래 NoticeFile 할 때 사용하는 것
찜찜
내가 넣는 찰라에! 다른 사람이 등록하면?
내가 5번 게시글 등록하려는데 가지고 온 게 6번이 될 수도....
내가 넣을 때까지 아무도 넣지마! 라는 isolation(고립도) 옵션을 넣어야!
insert 하지도 마! 이러면서 테이블을 잠가버리는 방법
// 근데 이러면 참 불편...
그래서 notice를 자동증가하게 하지 말고 id 생성해서 notice에 직접 박아놓고, NoticeFile에도 이거 쓰라고 해주는게 낫는 방법일수도
요지는 시퀀스 편하나... 불편하면 -> 우리가 직접 해줄 수도 있다는 것
cf) 오라클을 잠시 띄웠다.
insert 할 때 id가 필요한 경우
- '그' id에 파일 올리는거라 id가 새롭게 필요하지 않지 않나??
-> 아래서 맥락 설명
이렇게 직접 내가 지정해줄 수도 있다는 것.
- notice 넣을 때만 '같이' 파일 등록한다고 하면 이 방법 괜찮음 (근데 id 하드 코딩 중...)
근데 notice와는 상관없이 등록하면 바람직하지 X
* 위에 파일들 나온 맥락 *
Notice 테이블이 있다고 생각을 해보자.
column으로 files도 있는데, 내가 '파일'을 올리지 않으면 files column이 null이 되잖아?
-> 그래서 NoticeFile이라는 테이블을 따로 떼어놓아 보자는 맥락
NoticeFile 테이블 있지 이제?
그래서 여기 files에 파일을 올린다고 해보자.
먼저, Notice의 경우 id(식별자. primary key)를 우리가 CURVAR해서 알아내려고 하지 않는 이상 알 수 있는 방법이 없음. 근데 우리의 지금 상황은 NoticeFile에 저 id를 알아서! file을 올리려는 상황인 것.
1)
notieDao.가장 최근거 getLast(id); -> 방금 들어간 녀석을 얻어옴
그리고 아래 NoticeFile 할 때 사용하는 것
-> 그런데 다른 사람이 찰라에! 넣을 수도 있어서 문제....
2) CURRVAR 해서 넣어줄 때마다 내가 직접 지정
- '같이' 파일 등록한다고 하면 이 방법 괜찮음
-> 근데 id 하드 코딩 중...
-> 올바른 방법은 내일 알아보도록 하자.
78일 - 단위 테스트 (0) | 2021.06.10 |
---|---|
78일 - 다수의 db 가져오기 <foreach> (0) | 2021.06.10 |
77일 - 테이블명을 맞춰주는 <resultMap>, 페이징(Limit * Offset *), 동적 쿼리, <where> (0) | 2021.06.09 |
76일 - MyBatis를 활용한 DB 연결(2), Dao 구현하기 실습 (0) | 2021.06.08 |
76일 - MyBatis를 활용한 DB 연결(1) (0) | 2021.06.08 |