상세 컨텐츠

본문 제목

77일 - 테이블명을 맞춰주는 <resultMap>, 페이징(Limit * Offset *), 동적 쿼리, <where>

수업 일지/Spring

by NayC 2021. 6. 9. 09:35

본문

728x90

언더라인을 이용해서 구분... 하면 매핑된 정보가 안들어갈 수 있다? 

 

지금 mySql에서 wirtierId -> witer_Id 로, regdate ->reg_date로 바꿔봤다. 

그럼 전에 잘 되던게 안 됨

매핑이 안 됨. 

- 테이블은 reg_date, writer_Id

  Notice에 적은건 regdate, writedId라서

 

-> MyBatis가 대안을 제공함

 

<resultMap> 컬럼을 맞춰주는 역할

 

이거 결과봐야함

-> 선생님이 테이블명 바꿔서 확인 못하겠는데ㅜ noticeDao <init> 이라고 에러 한 줄이 있었음

-> 매핑 안해주니 바로 결과 실행됨... 

 

근데 select - resultyType에만 가능

 

Q. parameterType은 어떻게 할까

 

// 

 

웹페이지에서 '글쓰기' 누르기 -> 에러

예견된 에러

writer_id가 존재하지 않으니

 

애는 굳이 안맞춰줘도 된다. 

-> 넣어줄 컬럼명은 바꾸는게 맞음. 

    우리가 사용하는 변수명들은 #{writedId}는 내 마음대로인거지 :)

 

//

 

MySql 명명 규칙 

- 테이블명은 소문자

- 컬럼명은 처음을 대문자로 시작

 

(선생님은 이 규칙 싫어하셔서 그냥 자바처럼 이름 쓰시는거라고 함)

 

-> 그래서 지금 테이블명을 


동적쿼리

 

사용자가 전달하지 않았으면 빼고 싶은 거

예를 들어

기본값을 넣고 싶을 때라거나

뭐는 넣었으면 좋겠다 / 뭐는 뺐으면 좋겠다.

만약 사용자가 "" 아무것도 검색을 안할 때 -> where절을 빼는게 좋나? 그냥 안빼는게 좋나? 

-> 레코드를 훓으면 실행 속도에 영향을 미치니 굳이 껴놓지 않아도 된다. 

1) 전달된게 없으면 빼보려고 한다. 

 

2) page가 전달 될 수도, 안 될수도

 

cf) jpa vs myBatis

-> jpa는 한 단계 더 나아간 프레임워크 / 쿼리까지도 내가 작성할 필요 없게 만든 프레임워크

hybernate?가 1등인데 설정이 복잡해서 jpa(설정 간단하게 해줌)를 '같이' 쓰는 현황

-> 규모가 큰 곳에서는... 쿼리가 복잡해지면 '내가 원하는대로' 안만들어질 수 있어서 다시 돌아오는게 myBatis

 

// '페이저'를 구현해보자

 

구글링 : mysql pageing query

 

https://sang12.co.kr/36/MYSQL-LIMIT%EB%A5%BC%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%8E%98%EC%9D%B4%EC%A7%95%28PAGING%29-%EC%BF%BC%EB%A6%AC-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-Mybatis

 

mySql에서 쿼리문을 먼저 실행해보자

- Notice에서 10개를 가지고오는

이건 2페이지의 10개

1페이지는 -> LIMIT 10 OFFSET 0; (건너띄지 않고 10)

3페이지는 -> LIMIT 10 OFFSET 20; (20개 건너띄고 10개니까 3페이지가 되는것)

근데 xml에서 계산 불가능

 

활용하는 서비스쪽!에서 책임을 지는게 맞다. 

- 화면에서 1,2,3... 페이지를 해결하는 아이.

- 그리고 그 페이지를 가지고 '다오야 이 페이지 줘'라고 하는건 폭력적

  몇 페이지부터 몇 페이지까지라고 요청해야

-

서비스는 이렇게 offset, size를 주도록!!! 

 

그동안 다 page로 만들어서 이렇게 오류날 것

 

-> 그간 page로 했던거 다 고쳐주기.

 

// xml은 이제 해보자 (지금은 하드코딩으로 limit 10 offset 0으로 해줬음)

//

 

'작성일' 정렬을 할 수 있도록 하는 서비스 하나를 넣어보자.

 

오버로드에서는 dao 하나만! 

- 뭔가 큰 형이 가장 많은 부담을 지니는 느낌적인 느낌...? 

 

// 

 

mybatis '동적쿼리' 

 

field가 있을 때만! 저 쿼리가 실행되도록 해주었다. (이런 것이 바로 동적쿼리~~)

 

// 그런데 myBatis가 일하는 모습(?)을 보기 위해 (myBatis가 어떤 쿼리들을 실행했는지 확인하자는 것)

log를 남겨보자.

지금 왼쪽 맨 위에 NoticeController에서 (1, title, "") 이라고 디폴트값을 줬잖아? 

-> 확인해보자! 

 

(1) xml에서 Mybatis가 field가 있군~! 이라면서 21번째줄을 실행하는지

(2) 그리고 NoticeController에서 디폴트 값으로 준 거 지운 다음에는, Mybatis가 field가 없군~! 이라면서 21번째 줄을 실행하지 않는지! 이렇게 똑똑하게 일처리를 잘~ 하고 있는지를 알아보자.

이 노란색 한 줄만 적어주면 됨! 

 

error -> 에러 발생한 부분이 출력이 될 것

info -> info 여기에 해당되는게 출력되는 것

.

.

trace -> 실행되는 과정에 있는 로그를 출력

콘솔창

쿼리문. 인자 ? ? 

10, 0 받아서

아래 10개의 반환값이 이렇다~ 

 

// 자 이제 연습해보자! 

//

 

xml 파일 가지고 이야기하는 것

 

근데 쿼리가 복잡해지면 <if>로 해결이 안 됨

 

예시

ex) and해서 다른 컬럼하고 비교한다고 해보자. 

-> 앞에가 조건처리 되서 빠지면, where 없이 and가 갑자기 와버리는 상황이 발생할 수도 있는것 

    이런건 쿼리식에서 없는거지... 문제다~ 

 

-> MyBatis는 다 대안이 있지 :)

조건 중 한 개만 참일 경우

-> <where>가 저절로 where 없는 곳에는 where 넣어주고, 뒤에 and 지어주고 역할을 해줌! 

 

cf) 다른 방법

where 1=1 .. 꼼수인데 이건 캡쳐 안함. 독! (선생님도 비추하심)

 

쨘. <where>의 위엄!

//

 

<where>가 가끔 안되는 경우가 있다.. 고 문서로 써져있다고 한다.

그래서 <trim>을 배워보자.

 

<where>와 정말 똑같음.

그래서 <trim>을 굳이 할 필요는 없다고 그냥 적어만 두라고 하심 ㅎㅎ

 

cf) 저기 빨간색 포인트 -> / 아니라 | 임!!!  (or 연산자)


 

 


cf) 3년차 이후부터는 '업무'가 주가 되기 때문에 그 업무를 다뤄본 사람인게 중요함.

3년차까지는 기술이 중요해서 여기저기 옮겨다니며 배워보다고 해도 3년 뒤부터는 '업무'. 어디를 이직하고 싶을 때는 그 때는 그 업무를 배워본 상황이어야. 그래서 업무를 선택할 3년 뒤 시점이 중요하다. 3년차까지는 어느 업무든 기술을 익숙하게 하는게 중요.

 

728x90
반응형

관련글 더보기