본문 바로가기
개발/교육

(JPA) 59일차

by kakk789 2022. 6. 24.

JPA 관계 맵핑

@OneToMany (1:N)
@ManyToOne (N:1)

OneToMany 

@OneToMany(mappedBy="book", fetch=FetchType.eager)
private List<Orders> orders;

-> book 테이블 입장에서 book 테이블과 orders 테이블은 1:N 관계라는 의미

ManyToOne

@JoinColumn(name = "조인 할 컬럼", insertable =true ,updatable = true)
private Book book;

-> Orders 입장에서 orders 테이블과 와 book 테이블은 은 N:1 관계라는 의미

 

 JPA 사용자 정의 sql 

  • @Query 어노테이션을 이용하여 정의
  • 테이블 명은 Entity 클래스 이름과 일치시켜야함
  • 주의할 점은 테이블 명으로 Entity가 될 클래스 명을 그대로 써줘야함
    예를들어) OrderVO라는 이름을 같은 클래스를 Entity로 만들 때 OrderVO를 그대로 사용
     (select * from OrderVO

select 문

@Query("쿼리문")
public 타입 '쿼리문을 실행 할 함수명()';
	@Query("select nvl(max(orderid),0) +1 from Orders")
	public int getNextNo();

insert, delete, update 문

@Modifying
@Query("쿼리문")
@Transactional
public "타입" "쿼리문을 실행 할 함수명"(@param("파라미터") "타입" "파라미터명");
public interface OrdersDAO extends JpaRepository<OrdersVO, Integer>{

	@Query(value="select nvl(max(orderid),0) +1 from OrdersVO")
	public int getNextNo();
	
	@Modifying
	@Query (value="insert into orders "
			+ "o(o.orderid, o.custid, o.bookid, o.saleprice, o.orderdate) "
			+ "values(:#{#o.orderid},:#{#o.customer.custid}"
			+ ",:#{#o.book.bookid},:#{#o.saleprice},sysdate)"
			, nativeQuery = true)
	@Transactional
	public void insert(@Param("o") OrdersVO o);
	
}

:#{#order.customer.custid}

  • customer 테이블에 있는 custid라는 속성명을 가져와서 order의 custid의 값으로 사용하는 의미 (조인, join)

(JPA) 복합 키 설정하기

  • @Embeddable 어노테이션이 붙어있는 클래스를 생성하고 해당 클래스 안에 복합키 속성들을 넣어주면 됨
  • 해당 클래스는 Seriallize를 구현 해야함
@EmbeddedId
public class 키ID가 될 이름 implements Serializable {
            private 복합키클래스 속성명1;
            private 복합키클래스 속성명2;            
}

선언

@Embeddable
public class 키ID가 될 이름 implements Serializable {
	
	@Column(name="name")
	private String 키1;
	
	@Column(name="bookname")
	private String 키2;
}

VO

	@EmbeddedId
	private OdersViewId id;

카카오 디벨로퍼 (지도 API 이용해보기)

1. 카카오 디벨로퍼 홈페이지로 가서 개발자 등록

https://developers.kakao.com/

2. 애플리케이션 추가하기

3. 키 값 반환 됨

4. 플랫폼 설정 (Web)

5. 카카오맵 API 사용

https://apis.map.kakao.com/

더보기

카카오 맵 연동 JavaScript 

  • 페이징 처리 완료
  • 해당 테이블 tr클릭 시 Marker 생성
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	span{
		display: inline-block;
		margin: 5px;
		cursor: pointer;
	}
</style>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=키값"></script>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
	/*야영(캠핑)장명: "오션파크"
	소재지도로명주소: "충청남도 태안군 남면 몽산포길 161"
	위도: "36.6744920527"
	경도: "126.2808663915"*/

$(function(){
	
	mapContainer = document.getElementById('map'); // 지도를 표시할 div 
	mapOption = { 
        center: new kakao.maps.LatLng(33.450701, 126.570667), // 지도의 중심좌표
        level: 3 // 지도의 확대 레벨
	};
	map = new kakao.maps.Map(mapContainer, mapOption); // 지도를 생성합니다	
	
	
	var arr;
	
	var totalRecords=1;		//전체레코드 수
	var totalPage=1;		//전체페이지 수	
	var pageSize=10;		//한화면에 보여줄 레코드 수 
	var pageGroup = 10;		//한화면에 보여줄 페이지 수
	
	
	$.ajax({
		url:"전국야영(캠핑)장표준데이터.json",
		success:function(data){
			arr = data['records'];	
			console.log("전체데이터수:"+arr.length)
			totalRecords = arr.length;
			totalPage =  Math.ceil( totalRecords/pageSize );			
			printPage(1);
			printPageNumber(1);
		}
	});	
	
	
	function printPage(pageNUM){
		$("#list").empty();
		
		var start = (pageNUM-1)*pageSize + 1;
		var end = start + pageSize -1;
		
		for(var i=start;i<=end;i++){
			var row = arr[i];
			var tr = $("<tr></tr>");
			$(tr).addClass("item");
			$(tr).attr("lat",row['위도']);
			$(tr).attr("lng",row['경도']);
			$(tr).append( $("<td></td>").html(  row['야영(캠핑)장명'] ) );
			$(tr).append( $("<td></td>").html(  row['소재지도로명주소'] ) );
			$(tr).append( $("<td></td>").html(  row['위도'] ) );
			$(tr).append( $("<td></td>").html(  row['경도'] ) );
			$("#list").append(tr);
		}
	}//end pringPage
	
	
	//한화면에 10개의 페이지번호를 출력하고 싶어요
	//만약에 현재페이지가 1,2,3,4,5,6,7,8,9,10,  ==> 시작페이지는 1, 마지막페이지는 10
	//~~~~           11,12,13,14,15,16,17,18,19,20  ==> 시작페이지는 11 마지막페이지는 20
	
	function printPageNumber(pageNUM){
		$("#pageing").empty();
		
		var startPage = Math.floor((pageNUM-1)/pageGroup) * pageGroup  + 1 ; 	
		var endPage = startPage + pageGroup - 1;
		
		if(endPage > totalPage){
			endPage = totalPage;
		}
		
		if(startPage > 1){
			var span = $("<span></span>").html("[이전]");
			$(span).attr("page",startPage - 1);
			$("#pageing").append(span);
		}
		
		for(i = startPage; i<=endPage ; i++){
			var span = $("<span></span>").html(i);
			$(span).attr("page",i);
			$("#pageing").append(span);					
		}
		
		if(endPage < totalPage){
			var span = $("<span></span>").html("[다음]");
			$(span).attr("page",endPage+1);
			$("#pageing").append(span);
		}
	}
	
	$(document).on("click", "span", function(){
		var page = $(this).attr("page");
		printPage(page);
		printPageNumber(page);
	});
	
	$(document).on("click",".item", function(){
		var lat = Number( $(this).attr("lat"));
		var lng = Number( $(this).attr("lng"));
		
		newLatLng = new kakao.maps.LatLng(lat, lng);
		map.panTo(newLatLng);
		
		// 마커를 생성합니다
		var marker = new kakao.maps.Marker({
		    position: newLatLng
		});

		// 마커가 지도 위에 표시되도록 설정합니다
		marker.setMap(map);
		
		
	});
})


</script>
</head>
<body>
	<div id="pageing"></div>
	<table border="1" width="80%">
		<thead>
			<tr>
				<th>캠핑장명</th>
				<th>주소</th>				
				<th>위도</th>				
				<th>경도</th>				
			</tr>
		</thead>
		<tbody id="list">		
		</tbody>
	</table>
	<hr>
	<div id="map" style="width:100%;height:350px;"></div>
</body>
</html>

Connection Pool

  • 미리 일정한 양의 데이터베이스 커넥션을 만들어 놓고 사용자에게 Connection을 해주는 것
  • JPA 에서 디펜던시 설정 시 HikariCP 의 역할임

JPA에서 .html 파일 만들 때 주의사항

  • 상태유지 후 HTML로 보내야하면 templates에 html만들 것
  • 상태유지 같은거 필요없이 HTML을 바로 간다면 static에 만들 것

팁(tip)

  • 리턴문에 redirect:/ 구문 사용 가능
반응형

'개발 > 교육' 카테고리의 다른 글

(Thymeleaf/JPA) 58일차  (0) 2022.06.23
(Spring) 57일차  (0) 2022.06.22
(Spring) 41일차  (0) 2022.05.27
(JSP)36일차  (0) 2022.05.20
(JSP)35일차  (0) 2022.05.19

댓글