상세 컨텐츠

본문 제목

77일 - update 할 때의 <set>, 래퍼클래스로의 변환, 파일만 주는 테이블에 id 주기 intro

수업 일지/Spring

by NayC 2021. 6. 9. 12:30

본문

728x90

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줄 정도 써야했었지....

 

1. 이런 방법이 있었다. (jdbc 시절.. 풋풋) 

설명

134.

title, writerId, content, hit, files, pub...  이런게 '다 채워져있는게 한 줄 있다고 하자. 그걸 getId() 해가지고 지금 id에 맞는거 한 개를 가지고 온 것 (그리고 그걸 origin이라고 해보자)

135-136.

그리고 origin에 우리가 post하는 title, content을 '오버라이드' 해서 138. update하는 것 

 

 

2. myBatis에는 null이면 빼주는 기능이 있다 ♡

<set>

- update에서만 사용함

저기 빨간 부분 ','가 끝에 남는데..?라고 걱정할 수도 있지만 <set>이 바보가 아니닷

근데 에러남

- redirect 다음에 ?id.. 하고 주소를 줘야함

136번째줄에 edit으로 가는게 아니라 detail?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) 래퍼클래스

출처 : https://coding-factory.tistory.com/547

파일은 추가적으로 담아주기 (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 하드 코딩 중...

 

-> 올바른 방법은 내일 알아보도록 하자. 

 

 

 

 

 

 

 

 

728x90
반응형

관련글 더보기