Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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 more
Archives
Today
Total
관리 메뉴

어? 이게 되네

2022.06.24. 금요일 이공계 전문기술 연수사업 (Spring DATA JPA로 조인하기, 카카오맵 api) 본문

TIL

2022.06.24. 금요일 이공계 전문기술 연수사업 (Spring DATA JPA로 조인하기, 카카오맵 api)

토끼귀에진주귀걸이 2022. 6. 24. 17:34

º커넥션 풀

일정한 양의 데이터베이스 풀을 만들어놓고 사용자들에게 요청이 오면 제공하는 것 

ºdao 인터페이스에서 메인 클래스 명시해줄 때 <vo클래스이름,pk자료형> 이렇게 써줘야 함 !

º컨트롤러의 서비스이름과 타임리프 적용할 html이름이 똑같아야함!

 

쿼리스트링과 uri방식의 차이 알고 가기

 

ㄴ타임리프에서 html에서 컨트롤러로 get방식으로 가져오는 법 !

get방식과 post방식 제대로 구분하기

${}과 {}의 차이 : ${}는 표현언어

input 태그에 값을 나타낼 때는 th:value이고 그 외는 th:text

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------- Book,Customer,Orders 조인을 jpa에서 처리하는 법

Book클래스
Orders클래스

ㄴjpa에서 조인할 때는

누가 부모이고 차수 (둘 사이의 관계에 있는 컬럼을 기준으로 1:n 이나 m:n)등등을 vo를 만들 때 알려줘야 함 !

//근데 나는 여기서 insertable이랑 updatable을 true로 줄 때 오류가 나서 false로 했더니 오류가 안났음..

왜 그런지는 모르겠음... 테이블 설정할 때 뭐 다르게 한건가... 그건 또 아닌데

OrdersDAO

ㄴ테이블안에서 따로 쿼리를 만들 때는

dao 에서 @Query어노테이션으로 쿼리를 따로 만들어서 그것을 하나의 메소드로 만듦

오늘날짜로 insert할거면 오늘 날짜로 insert하게 해주는 메소드도 따로 만들어서 적음

여기서 @Modifying, @Transactional이라는 어노테이션은 데이터베이스에 변동이 있는 쿼리의 메소드에다 명시해줘야함!

(예를들면 insert, update, delete등등등)

!주의 사용자 정의 sql을 만들 때에 insert into Orders(대소문자 구분)~~이렇게 명시하여

테이블 이름은 Entity클래스 이름과 일치시켜야 함 !!!!

OrdersSerivce.java

ㄴOrdersService클래스 작성 (다오에서 직접 만든 쿼리들을 메소드에 포함시킴)

 

OrdersController

ㄴOrdersController작성

 

insertOrders.html

주의 여기서 insertOrders.html은 templates 폴더 안에 작성해야함!!!(상태유지하여 고객이랑 책 출력해야하니까)

타임리프 활용했기때문에 xmlns 태그 따로 속성 써주기

templates/listOrders.html

ㄴ마찬가지로 OrdersController에서 GetMapping("/listOrders")로 가는 findAll 메소드 선언 후

listOrders.html파일도 작성 가능

여기서 주의할 점은 custid, bookid는 참조키이기 때문에 그냥 o.bookid 나 o.custid로 하면 오류 남 !!!

 

근데 내가 여기서 보고싶은 것은 고객 번호, 책 번호가 아닌

고객 이름과 책 이름이 보고싶음 !!!!

그것을 하려면 jpa의 조인하여 출력하기를 써야함!

 

그럴 때는 데이터베이스의 뷰 (실제로 존재하는 테이블이 아닌 가상의 논리적 테이블)을 하나 만들어서

그 뷰의 속성은 조인하는 sql을 사용해서 넣고 그 뷰와 매칭되는 vo,dao,service,controller,html파일까지 만들어서

출력하면 됨 !!!!

 

뷰 생성 쿼리

create view view_ListOrders
as
select orderid, name, bookname, orderdate, saleprice, price
from orders o, customer c, book b
where o.custid=c.custid and
b.bookid=o.bookid;

select * from view_ListOrders;

ㄴ뷰 생성 결과

View_ListOrders클래스 (vo)

ㄴ생성한 뷰에 맞는 Entity 클래스 생성 (vo패키지 안에)

View_ListOrdersDAO클래스

ㄴView_ListOrdersDAO 생성

View_ListOrdersService클래스

ㄴView_ListOrdersService생성

OrdersController클래스

ㄴOrdersController에 View_ListOrdersService를 멤버로 추가하여 뷰를 리스트형태로 뿌려주는 컨트롤러 메소드 생성

View_ListOrder.html

ㄴView_ListOrders.html생성

 

근데 난 여기서 orderid는 안 출력하고싶은데?

그러면 pk역할을 하는 속성 두개를 묶어서 jpa한테 알려줘야 함!

여기서는 고객이름과 책이름 두개를 묶어서 하나의 pk처럼 생각하도록 jpa한테 알려줘야함

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

그게 바로 jpa에서 복합 id설정하기(두개 이상의 컬럼으로 주식별자 설정하기)

 

Embeddable클래스 생성=>Entity클래스 생성(vo에다가) 다만 id설정은 @EmbeddedId라고 어노테이션 써줘야함!

=>dao, service, controller=>view 다만 찍을 때는 o.id.name이렇게 명시해줘야함

 

맨 처음에 주문번호가 없는 뷰를 또 하나 생성

OrdersViewId클래스(vo에)

ㄴvo 패키지에 Embedded클래스 생성 => 여기의 멤버 두개가 복합키로서의 pk역할을 한다고 알려주는 클래스임

View_ListOrders2클래스 생성 (vo에)

ㄴvo패키지에 Entity클래스 생성 =>@EmbeddedId라는 어노테이션 꼭 추가

View_ListOrderDAO2클래스 생성

ㄴdao패키지에 View_ListOrderDAO2클래스 생성

주의할 점은 여기서는 더이상 PK자료형이 Integer가 아니라 앞에 vo패키지에서 생성했던

OrdersViewId라는 것임 !!!그래서 자료형을 저렇게 써줘야함 !!

View_ListOrdersService2클래스 생성

ㄴservice패키지에 View_ListOrdersService2클래스 생성

OrdersController에 메소드 추가

ㄴOrdersController에 엔티티의 View_ListOrders2의 목적을 수행하는 메소드를 추가함

listOrders_view2.html

ㄴtemplates에 listOrders_view2.html생성 

단, 여기서 name,bookname 가져올 때 저렇게 써야 함 !!!

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------카카오맵 api

jpajointest의 mapTest05.html참고하기 !! 페이징처리도 되어있음 !!!