본문 바로가기
❤️‍🔥TIL (Today I Learned)

[TIL] 2022-12-06(27day)

by elicho91 2022. 12. 5.

Database 와 SQL


👉 Database (데이터의 집합)

# DBMS : ‘Database Management System’ 의 약자로 Database를 관리하고 운영하는 소프트웨어를 의미

# RDBMS : ‘Relational DBMS’의 약자로 관계형 데이터베이스 (열(column)과 행(row)으로 이루어짐)

 

👉SQL

- ‘Structured Query Language’ 의 약자로 RDBMS에서 사용되는 언어.

 

# DDL

 - ‘Data Definition Language’ 의 약자로 테이블이나 관계의 구조를 생성하는데 사용

 

 - CREATE : 새로운 데이터베이스 및 테이블을 생성

CREATE DATABASE 데이터베이스이름;
CREATE TABLE 테이블이름
(
		필드이름1 필드타입1,
    필드이름2 필드타입2,
    ...
);

 - ALTER : 데이터베이스와 테이블의 내용을 수정

ALTER TABLE 테이블이름 ADD 필드이름 필드타입;
ALTER TABLE 테이블이름 DROP 필드이름;
ALTER TABLE 테이블이름 MODIFY COLUMN 필드이름 필드타입;

 - DROP : 데이터베이스와 테이블을 삭제. 데이터 및 테이블 전체를 삭제

DROP DATABASE 데이터베이스이름;
DROP TABLE 테이블이름;

 - TRUNCATE : 데이터베이스와 테이블을 삭제. 최초 테이블이 만들어졌던 상태 즉, 컬럼값만 남음.

TRUNCATE DATABASE 데이터베이스이름;
TRUNCATE TABLE 테이블이름;

 

# DCL

 - Data Control Language의 약자로 데이터의 사용 권한을 관리하는데 사용

 

-GRANT : 사용자 또는 ROLE에 대해 권한을 부여

GRANT [객체권한명] (컬럼)
ON [객체명]
TO { 유저명 | 롤명 | PUBLC} [WITH GRANT OPTION];

//ex
GRANT SELECT ,INSERT 
ON mp
TO scott WITH GRANT OPTION;

 

-REVOKE : 사용자 또는 ROLE에 부여한 권한을 회수

REVOKE { 권한명 [, 권한명...] ALL}
ON 객체명
FROM {유저명 [, 유저명...] | 롤명(ROLE) | PUBLIC} 
[CASCADE CONSTRAINTS];

//ex
REVOKE SELECT , INSERT
ON emp
FROM scott
[CASCADE CONSTRAINTS];

 

#DML

 - ‘Data Manipulation Language의 약자로 테이블에 데이터를 검색, 삽입, 수정, 삭제하는데 사용

 

 - INSERT : 테이블에 새로운 row를 추가

INSERT INTO 테이블이름(필드이름1, 필드이름2, 필드이름3, ...) VALUES(데이터값1, 데이터값2, 데이터값3, ...);
INSERT INTO 테이블이름 VALUES(데이터값1, 데이터값2, 데이터값3, ...);

 

 - SELECT : 테이블의 row를 선택

SELECT 필드이름 FROM 테이블이름 [WHERE 조건];

 

 - UPDATE : 테이블의 row의 내용을 수정

UPDATE 테이블이름 SET 필드이름1=데이터값1, 필드이름2=데이터값2, ... WHERE 필드이름=데이터값;

 

 - DELETE : 테이블의 row를 삭제

DELETE FROM 테이블이름 WHERE 필드이름=데이터값;

 

JPA(Java Persistence API) 기초


👉 JPA가 하는 일

  1. 쿼리를 자동으로 만들어 준다.
  2. 그리고 어플리케이션 계층에서 sql 의존성을 줄여서 번거로운 작업이 단축.
  3. 패러다임의 불일치를 해결.
  4. 특정한 상황을 제외하고는,성능이 높고,  최적화를 위한 노력이 있다.
  5. 방언도 지원 (h2 Databse를 붙여도, mySql, oracle 뭘 붙여도 코드의 변경은 없다)

# JPA 샘플

 - JAVA 클래스

@Entity // DB 테이블 역할을 합니다.
public class User {
		// ID가 자동으로 생성 및 증가합니다.
	  @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // nullable: null 허용 여부
    // unique: 중복 허용 여부 (false 일때 중복 허용)
    @Column(nullable = false, unique = true)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false, unique = true)
    private String email;

    @Column(nullable = false)
    @Enumerated(value = EnumType.STRING)
    private UserRoleEnum role;

    @Column(unique = true)
    private Long kakaoId;
}

 

 - DB 테이블 및 컬럼

 

 - 테이블 형식

 

👉 Spring Data JPA 이해

  • JPA 를 편리하게 사용하기 위해, 스프링에서 JPA 를 Wrapping
  • 스프링 개발자들이 JPA 를 사용할 때 필수적으로 생성해야 하나, 예상 가능하고 반복적인 코드들 → Spring Data JPA 가 대신 작성
  • Repostiory 인터페이스만 작성하면, 필요한 구현은 스프링이 대신 알아서 척척!

 

# Spring Data JPA 예제

- 상품 Enitity 선언

@Entity
public class Product extends Timestamped {
		@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private Long userId;
    private String title;
    private String image;
    private String link;
    private int lprice;
    private int myprice;
}

 

 - Spring Data JPA) 상품 Repository 생성

public interface ProductRepository extends JpaRepository<Product, Long> {
}

 

 - Spring Data JPA) 기본 제공해 주는 기능

// 1. 상품 생성
Product product = new Product(...);
productRepository.save(product);

// 2. 상품 전체 조회
List<Product> products = productRepository.findAll();

// 3. 상품 전체 개수 조회
long count = productRepository.count();

// 4. 상품 삭제
productRepository.delete(product);

 

 - ID 외의 필드에 대한 추가 기능은 interface 만 선언해 주면, 구현은 Spring Data JPA 가 대신!!

public interface ProductRepository extends JpaRepository<Product, Long> {
    // (1) 회원 ID 로 등록된 상품들 조회
    List<Product> findAllByUserId(Long userId);

    // (2) 상품명이 title 인 관심상품 1개 조회
		Product findByTitle(String title);

		// (3) 상품명에 word 가 포함된 모든 상품들 조회
		List<Product> findAllByTitleContaining(String word);

		// (4) 최저가가 fromPrice ~ toPrice 인 모든 상품들을 조회
    List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}

🙋‍♂️ 소감 : 

JPA를 예전에 다뤄보진 못했어서, 지금은 쿼리문 정도만 이해하고 있다.

편한 기능인거 같기는 한데, 어노테이션이나 모든게 너무 복잡하다...ㅠㅠ

😈 아는 내용이라고 그냥 넘어가지 않기! 😈

'❤️‍🔥TIL (Today I Learned)' 카테고리의 다른 글

[TIL] 2022-12-08(29day)  (0) 2022.12.08
[TIL] 2022-12-07(28day)  (0) 2022.12.07
[TIL] 2022-12-05(26day)  (0) 2022.12.05
[TIL] 2022-12-02(25day)  (0) 2022.12.02
[TIL] 2022-12-01(24day)  (0) 2022.12.01

댓글