1. DB JOIN개념
원래는 파일시스템을 썼었다.
근로학생이라면? 학교의 학생이면서 직원이다.
파일시스템에서는 직원관리, 학생 관리 프로그램 2개가 있다.
직원관리 프로그램에서 주소가 부산 수영구로
학생관리 프로그램에서 주소가 부산 수영구로
이 학생이 서울로 이사가면? 직원관리 프로그램에서만 주소를 바꿨다면? 두 프로그램에서의 데이터가 일치되지 않음
=>이걸 데이터베이스에 공유해서 놔두면!! 데이터를 공유해서 사용하니까, 동기화 안되는 걱정을 할 필요가 없다!
**데이터의 일관성이 없다? => 무결성이 깨짐!
데이터베이스는 데이터의 일관성이 있다.
데이터베이스의 목적은??? 공유!!
동기화=> 데이터가 일치됨(데이터베이스) vs 자바 프로그램에서 동기화란? 일의 순서가 있다.
자바 프로그램에서 동기화란? 일의 순서가 있다
=> 라면 끓이고 삼겹살 구워!라는 프로그램 라면 끓이고 삼겹살 굽는 순서로 하는 과정? 동기적 프로그램
지금 내가 하고 있는 프로그램은??? 동기적 프로그램이다!! 동기적프로그램은 오래 걸린다.
쓰레드 활용하면? 비동기적 프로그램 만들수 있다.
비동기 프로그램은?? 프로그램 짜는게 어렵다.
안드로이드에서 데이터 요청 IO를 한다면? 데이터를 받고 동시에 스레드로 그림을 그려나간다.
*자바프로그램 관점에서는??
자료형 하나로 표현 안되는건 오브젝트로!!! 이를 데이터베이스에서 테이블로 표현!!!!
예를들어, 컴퓨터!! 가격,만들어진 연도, 성능 등등..
또는 3관에 있는 3열 3번째 의자!! 의자를 표현하는 속성은? 0관, 0열, 0번째
그러나, 남/여 는 자료형 하나로 표현가능
데이터베이스 테이블이 연관관계를 맺으면? relation database = RDDS
테이블 만들때! 하나의 자료형으로 표현 못하면? 테이블로 생성!
테이블을 만들었는데, 데이터가 중복된다면?? 테이블을 쪼갠다!!!!!!!!!!!!!
신세계 백화점 영화관은? 오브젝트로! 주소는? 사장님은? 등등 표현해야하니까
1관 은??? 오브젝트로! 몇층인지? 1관안에 의자는 몇개인지?? 등등 표현해야하니까
파란색은? 키워드
처음에 쿼리실행될 때, from부터 실행! 하드디스크의 user테이블을 메모리로 퍼올린다
그리고나서 WHERE부터? 컬럼부터? => WHERE부터 먼저 실행된다. WHERE로 행을 줄이고 컬럼(*) 선택
이렇게 적으면? 좋은 쿼리가 아니다.
이렇게하면 비효율적이다.
3번 처럼해도,, 결국 db에 가서 2번 퍼올리는건 마찬가지이다.!
3번 서브쿼리(select안에 select가 있다) 장점은?? 동적이다!!!
SELECT * FROM post WHERE user_id = (SELECT id FROM user WHERE username='cos');
cos 이 부분만 바꿔주면 되니까!!
이걸 한번에 퍼올리는 방법을? 'JOIN'이라고 한다.
쪼개져있는 2개 이상의 테이블을 하나의 테이블로 붙여서 확인!
아래 조인을 Equal join, Inner join, join 이라 한다.
u.id뒤에 별칭 user_id라고 붙인다!!
왼쪽 user테이블을 driving 테이블
오른쪽 post테이블을 driven 테이블
LEFT OUTER JOIN =>왼쪽 user테이블 다 보고싶을 때!!!!
오른쪽 테이블인 user테이블을 다 보여줘라!!
위 JOIN 결과를 담을수 있는 오브젝트가 필요함.
value object 즉, VO (내부에서 사용할때)
이 데이터를 다른 사람에게 전달한다면? VO로 안하고,,, DTO라고 한다. data transfer object
2. ORM 기법
jpa에서 JOIN해보자
ORM실습!!!!!!!!!!!!!!!
우선 create해서 데이터 다 날린다.
저장 후
userId날린다 아래 부분 삭제
즉, FK키를 없앤다.
JPA는??
Java Persistence API
Persistence 영속성
자바로 영구히 데이터를 저장할 수 있는 API
영구히?? 어디로??? DB에 저장
API는?? save, findAll, findById 등등 함수들의 모임
JPA 기반 기술은?? hibernate => ORM제공해준다.
확인!
데이터 넣기
다신 yml에서 none으로 설정!!!
Repository 만든다
PostApiControllerTest만든다
SELECT이 두번 일어남!
결과는???
좀 더 보기 좋게 보려면??? json parser활용!
다음과 같이 findAll이기 때문에 컬렉션으로 return된다!
다음으로, 하나만 검색해보자
실행하면??? 다음과 같은 쿼리문이 실행된다. JOIN문 실행!! 위에 findAll할때는 왜 select 두번을 했을까???
Hibernate:
select post0_.id as id1_0_0_, post0_.content as content2_0_0_, post0_.title as title3_0_0_, post0_.user_id as user_id4_0_0_, user1_.id as id1_1_1_, user1_.address as address2_1_1_, user1_.email as email3_1_1_, user1_.password as password4_1_1_, user1_.username as username5_1_1_ from post post0_ left outer join user user1_ on post0_.user_id=user1_.id where post0_.id=?
JOIN할때, driving테이블은??? FK키가 있는게 좋다!!! 왜?? FK키로 인해, 찾고나서 더이상 안내려가도 된다.
위에 ORM기법으로 했더니,,, driving테이블을 post로 잡아서 검색해줌! 위 규칙에 따라서....
추가 개념>
@JoinColumn(name = "myid")
@ManyToOne
create로 바꿔 저장후, 다시 none으로 설정
'springboot 수업일지' 카테고리의 다른 글
10일차 현재 프로젝트 Git으로 (0) | 2021.07.02 |
---|---|
10일차 Git영역 개념 및 실습 (0) | 2021.07.02 |
8일차 회원정보수정 페이지(과제) (0) | 2021.06.30 |
8일차 게시글 테이블 Post (0) | 2021.06.30 |
8일차 로그인,로그아웃form / jstl넣기(taglib) (0) | 2021.06.30 |