본문 바로가기
카테고리 없음

RDBMS , SQL , JPA

by 소년수 2022. 7. 26.

RDMS 가 뭘까? 스프링 프로젝트를 구성하는데 있어서 아주 중요한 역할을 한다.

우선 클라이언트와 서버와 데이터베이스 구조관계를 보자

RBDMS, 줄여서 RDB는 관계형 데이터 베이스를 말한다. 정보 저장소라고 생각하자.

예를 들어 쇼핑몰이면 주문정보,고객정보 등을 컴퓨터에 저장,관리하는 것을 도와준다.

성능과 관리면에서 아주 고도화된 엑셀이라고 생각하자.

 

RBDMS의 종류로는  MySQL, PostgreSQL,Oracle Database 등등 이있다.

나는 연습용으로 H2 DB를 사용하겠다. H2의 장점은 서버가 돌아갈때만 데이터베이스라서 연습용으로

딱이다.

 

H2를 쓰려면 어떻게해야될까?

main폴더의 resources의 application.properties 에 저 두줄의 코드를 추가해주면 된다.

그리고 자바폴더의  Week02Application.java 파일을 실행 시켜주면 된다.

실행시켜주고 localhost:8080/h2-console 주소로 들어가면,

콘솔창이 문제없이 뜨는것을 확인할 수있다.

 

이제 이 콘솔창에 connect를 누르고 각 테이블 생성과 데이터 삽입을 해준다. 하지만 이러한 방식은

너무 비효율적이라고 한다. 왜냐면 JPA로 자바로 데이터 삽입 조회 등이 가능하기 때문...

우선은 h2 콘솔에서 테이블 및 데이터 삽입코드를 적어놓긴 하겠다.

 

테이블cousrses생성하기 코드

CREATE TABLE IF NOT EXISTS courses (
    id bigint(5) NOT NULL AUTO_INCREMENT, 
    title varchar(255) NOT NULL,
    tutor varchar(255) NOT NULL,
    PRIMARY KEY (id)
);

courses 데이터 삽입

INSERT INTO courses (title, tutor) VALUES
    ('웹개발의 봄, Spring', '남병관'), ('웹개발 종합반', '이범규');

corses 조회하기

SELECT * FROM courses;

- JPA란?

JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기다

- JPA가 없다면?

자바 짜다가 갑자기 SQL 짜고, 그걸 잘 맞추어 넣어야 한다.

 

JPA을 시작하기전 Domain과 Repository에 대해 먼저 이해를 하고 넘어가자.

 

  • 자바로 DB를 사용하도록 도와주는 녀석이 JPA 다.
  • 그럼 DB를 이용하는데 핵심이었던 "테이블"과 "SQL"과 동일한 개념의 자바 용어가 있다.
  • "테이블"은 Domain, "SQL"은 Repository 이다.

 

나는 아까 h2를 이용해 courses라는 테이블에 title,tutor라는 컬럼을 미리 만들어 두었다. 이것이

자바로 어떻게 표현되는지 살펴보자.

1. src > main > java > com.sparta.week02에 domain 이라는 패키지를 만든다.

2. 패키지 안쪽에 Course.java, CourseRepository.java(인터페이스)파일을 만든다. 

 

course.java 에 코드를 써보자

@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 테이블임을 나타냅니다.
public class Course {

    @Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
    @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
    private Long id;

    @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
    private String title;

    @Column(nullable = false)
    private String tutor;

    public String getTitle() {
        return this.title;
    }

    public String getTutor() {
        return this.tutor;
    }

    public Course(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
}
  • 코드 설명 

@NoArgsConstructor : Args는 파리미터 재료다, No라고 있으니 기본생성자를 자동으로 넣어줘라는 뜻.

@Entify : 데이터베이스 기준으로 테이블역할을 할 클래스라고 표시를 해주어 할때 쓴다.

@Id : ID값을 primary키로 사용하겠다는 뜻.

@Column(nullable = false) : 컬럼값이고 비어 있으면 안됀다는 뜻.

@GeneratedValue(strategy = GenerationType.AUTO) : ID가 생성이 될텐데 그 생성되는 방법이 자동으로 증가라하는 뜻.

id는 데이터베이스에서만 사용되는 데이터니 Getter,Setter를 설정해주지 않는다.

title과 tutor에 대해서만 Getter를 설정해준다. Setter 설정은 Repository에서 자동으로 설정해준다.

맨아래에는 들어가는 생성자 코드를 써준다.

 

이제 CourseRepository 인터페이스에 넣어줘야할 코드를 보자

public interface CourseRepository extends JpaRepository<Course, Long> {
}

Repoistory는 SQL기능을 대신 해주는 것이다. 코드에 보이는대로 설명하자면 CourseRepository 라는 인터페이스에

JpaRepository라는 기능을 상속(extends)을 사용하겠다라는 뜻이다. 뒤쪽 <> 사이에는 식별할수있는 대상과, 대상의 타입을 써줘야한다. Course라는 테이블을 대상으로 쓰고 프라이머리키인 ID의 타입인 Long을 써준다.

 

JPA의 사용준비가 끝이 났다. 이제 본격적으로 사용해보자.

사용해보기전 SQL이 보이도록 application.properties에 세팅을 해주어야한다.

그리고 Week02Application.java.파일에 또 실행코드를 적어주어야한다

하지만 이 코드같은 경우는 이번만 쓰고 다시는 안 쓰는 코드다.

@Bean,익명 함수등은 실무에서 중요한 것들이 맞지만 지금 단계에선 필요한게 아니다. 일단 그런정도로만 알고있자.

 

이제 내가 넣은 값들을 데이터베이스에 넣어보고 잘 넣어졌는지 조회를 해보자

1.Course라는 테이블에 데이터를 저장하고싶으면 우선 클래스를 만들어야한다.

2.Course를 임포트를 시킨다. 그리고 course1 이라고 선언해준뒤 데이터를 적어준다.

3.이제 데이터를 저장시켜줘야하는 코드를 적어준다.

4. SQL은 repository 이니까  repository.save(course1) 만들어준 변수를 넣어줘서 저장을 시켜준다.

5.JPA의 리턴타입은 여러개가 오는것이니 List를 써준다. 추가적으로 courseList의 변수도 만들어준다.

6.반복문을 돌려서 리스트를 하나하나 까본다. c라는 변수를 정해준뒤 sout getTilte, getTutor를 출력해준다.

실행결과는 

정상적으로 나오는걸 확인 할 수 있다.

 

댓글