day85 🌕

장미·2022년 9월 7일
0

오늘의 성과

목록 보기
85/129

스프링 DB 2편 - 데이터 접근 활용 기술 섹션 7 수강

섹션 7. 데이터 접근 기술 - Querydsl 수강 완료!!

만약 SQL에 클래스처럼 타입이 있고 자바 코드로 작성할 수 있게 된다면?
➡️ type-safe해질 것이다. 또한 컴파일 시 에러 체크가 가능해질 것이다.

Querydsl
쿼리를 자바로 type-safe하게 개발할 수 있도록 지원해 주는 프레임워크.
주로 JPA 쿼리(JPQL)에 사용한다.


JPA에서 쿼리 생성 방법은 크게 3가지가 있다.

  1. JPQL(HQL)
    장점: SQL 쿼리와 비슷하다.
    단점: type-safe하지 않고, 동적 쿼리 생성이 어렵다.

  2. Criteria API
    장점: 동적 쿼리 생성이 쉬움...?
    단점: type-safe X, 복잡하다.

  3. MetaModel Criteria API(type-safe)
    Criteria API + MetaModel
    Criteria API와 거의 동일하다.


Querydsl 작동 방식
Querydsl 작동 방식


SpringDataJPA + Querydsl
SpringData 프로젝트의 약점은 조회. Querydsl로 복잡한 조회 기능을 보완할 수 있다.

  • 단순한 경우: SpringDataJPA
  • 복잡한 경우: Querydsl 직접 사용

Querydsl에서 where(A, B)에 다양한 조건들을 직접 넣을 수 있다. 이렇게 쉼표로 구분해서 넣으면 AND 조건으로 처리된다. 참고로 where()에 null을 입력하면 해당 조건은 무시한다.

Querydsl은 별도의 스프링 예외 추상화를 지원하지 않는다. 대신 @Repository에서 스프링 예외 추상화를 처리해 준다.

Querydsl을 사용하면 동적 쿼리를 매우 깔끔하게 사용할 수 있고, 쿼리 문장에 오타가 있어도 컴파일 시점에 오류를 막을 수 있다.

List<Item> result = query
	.select(item)
	.from(item)
	.where(likeItemName(itemName), maxPrice(maxPrice))
	.fetch();
Querydsl 예시

토픽 1개 - DB View

뷰는 데이터베이스 개체 중 하나이다. 뷰는 테이블과 아주 밀접하게 연관되어 있다. 뷰는 한 번 생성해 놓으면 테이블이라고 생각하고 사용해도 될 정도로, 사용자들의 입장에서는 테이블과 거의 동일한 개체로 취급한다.

뷰는 테이블처럼 데이터를 가지고 있지 않다. 뷰의 실체는 SELECT 문으로 만들어져 있기 때문에, 뷰에 접근하는 순간 SELECT가 실행되고 그 결과가 화면에 출력되는 방식이다. 비유하자면 바탕화면의 바로가기 아이콘과 같다.

View와 바로가기 아이콘

뷰는 단순 뷰복합 뷰로 나뉘는데, 단순 뷰는 하나의 테이블과 연관된 뷰를 말하고, 복합 뷰는 2개 이상의 테이블과 연관된 뷰를 말한다.


뷰의 기본 생성

뷰를 만드는 형식은 다음과 같다.

CREATE VIEW 뷰_이름
AS
	SELECT;

뷰를 만든 후에 뷰에 접근하는 방식은 테이블과 동일하게 SELECT 문을 사용한다. 전체에 접근할 수도 있고, 필요하면 조건식도 테이블과 동일하게 사용할 수 있다.

SELECT 열_이름 FROM 뷰_이름
	[WHERE 조건];

member 테이블의 아이디, 이름, 주소에 접근하는 뷰를 생성해 보자.
CREATE VIEW v_member
AS
	SELECT member_id, member_name, address FROM member;

위에서 생성한 뷰를 조회하면 다음과 같은 결과가 나온다.

SELECT * FROM v_member;
member_idmember_nameaddress
JANG장미서울
JJANG짱미경기
CHA차은우경기
NEW김뉴비경북

주소가 서울, 경기인 조건식을 넣으면 다음과 같은 결과가 나온다.

SELECT member_name, address FROM v_member WHERE address IN ('서울', '경기');
member_idmember_nameaddress
JANG장미서울
JJANG짱미경기
CHA차은우경기

뷰의 작동

사용자가 뷰에 접근하는 방식은 다음 그림과 같다.

뷰의 작동


뷰를 사용하는 이유

우리가 굳이 뷰를 사용하는 이유는 무엇일까?
뷰를 사용해서 얻을 수 있는 장점은 여러 가지가 있다.

보안에 도움이 된다.
앞에서 만든 v_member 뷰에는 사용자의 아이디, 이름, 주소만 있을 뿐, 사용자의 중요한 개인 정보인 연락처, 생년월일 등의 정보는 들어있지 않다. (여기서는 member 테이블에서 사용자의 연락처와 생년월일이 중요한 개인 정보라고 가정하겠다.)

예를 들어, 쇼핑몰에 직원 할인을 추가한다고 해 보자. 이 때 직원 정보가 필요한 타 부서에게 요청이 들어왔다. 이런 경우 직원 테이블을 통째로 넘겨주기보다, 중요한 정보인 연락처, 생년월일은 제외하고 아이디와 이름만 보이는 뷰를 생성해서 넘겨주면 훨씬 안전할 것이다. 또한, 필요한 정보만 바로 눈에 보이게 함으로써 데이터를 훨씬 더 빨리 이해하고 활용할 수 있을 것이다.

복잡한 SQL을 단순하게 만들 수 있다.
다음은 물건을 구매한 회원들에 대한 SQL이다.

SELECT B.member_id, M.member_name, B.product_name, M.address, CONCAT(M.phone1, M.phone2) '연락처'
	FROM buy B
		INNER JOIN member M
		ON B.member_id = M.member_id;

위 쿼리는 내용이 길고 복잡하다. 만약 위 쿼리를 자주 사용해야 한다면 사용자들은 매번 위와 같은 긴 문장을 입력해야 할 것이다.

그러나 이 SQL을 다음과 같이 뷰로 생성해 놓고, 사용자들이 해당 뷰에만 접근한다면 복잡한 SQL을 입력할 필요가 없어진다.

CREATE VIEW v_memberbuy
AS
	SELECT B.member_id, M.member_name, B.product_name, M.address, CONCAT(M.phone1, M.phone2) '연락처'
		FROM buy B
			INNER JOIN member M
			ON B.member_id = M.member_id;

이제부터는 v_memberbuy를 테이블이라 생각하고 접근하면 된다. 필요하면 WHERE 절도 사용할 수 있다.

만약 ‘장미’의 구매 기록을 알고 싶다면 다음과 같이 사용하면 된다.

SELECT * FROM v_memberbuy WHERE member_name = '장미';

뷰의 수정, 삭제

뷰를 수정하는 문법은 다음과 같다.

ALTER VIEW 뷰_이름 AS
SELECT 필드_이름
FROM 테이블_이름

뷰를 삭제하는 문법은 다음과 같다.

DROP VIEW 뷰_이름

뷰 데이터 수정, 삽입
수정: UPDATE 뷰 이름 SET 수정 내용 WHERE 조건
삽입: INSERT INTO 뷰 이름 (열 이름) VALUES (업로드 값)

-- 뷰 데이터 삽입
INSERT INTO v_member(id, name, address) VALUES('CAT', '고양이', '서울');

-- 뷰 데이터 수정
UPDATE v_member SET address = '경기' WHERE id = 'cat';

참고 - CREATE OR REPLACE VIEW

뷰를 생성할 때 CREATE VIEW는 기존에 뷰가 있으면 오류가 발생한다. 하지만 CREATE OR REPLACE VIEW는 기존에 뷰가 있어도 덮어쓰는 효과를 내기 때문에 오류가 발생하지 않는다.
즉, DROP VIEW와 CREATE VIEW를 연속으로 작성한 효과를 갖는다.


뷰의 정보 확인
DESCRIBE 문으로 기존 뷰의 정보를 확인할 수 있다.

DESCRIBE v_viewtest;

참고
뷰에서는 PK 확인이 안 된다.


SHOW CREATE VIEW 뷰 이름
뷰가 만들어진 쿼리를 조회한다. → 기존 테이블 정보 확인 가능.

WITH CHECK OPTION
뷰를 통해 데이터를 입력할 시, 조건에 맞는 데이터만 입력된다.

ALTER VIEW v_age20
AS SELECT * FROM member WHERE age >= 20
	WITH CHECK OPTION;

참고 자료

  1. Lim’s daily note, “[SQL] MYSQL 뷰(View) 생성, 수정, 삭제”, https://anotherspringfield.tistory.com/104

  2. TCP SCHOOL, “VIEW 수정 및 삭제”, http://www.tcpschool.com/mysql/mysql_view_alterDrop

  3. 한빛미디어, “[SQL 기초 강의] 14강. 가상의 테이블: 뷰(생성, 수정, 삭제)”, https://youtu.be/JrXWxku7ZIM


투두리스트


내일 발표할 거 준비!!! (이진 탐색)

profile
김뉴비

0개의 댓글

관련 채용 정보