본문 바로가기
Back-end/Spring

[Spring] chapter04 데이터베이스 작업

by na1-4an 2023. 7. 21.

아래 글은 스프링 프레임 워크 첫걸음 책을 기반하여 작성한 글입니다.

 

4-1 데이터베이스 생성

(1) 데이터베이스란?

: 데이터를 보관하는 상자! 

 

(2) 관계형 데이터베이스란?

RDB(Relational DatBase)

: 데이터를 표 형식으로 표현하고, 여러 표에서 항목의 값 사이에 관계를 맺고 있는 데이터베이스를 말한다.

 

(3) PostgreSQL로 데이터베이스 확인

chapter01에서 다운로드한 'pgAdmin4'를 실행시킨다.


4-2 테이블 생성

(1) 테이블이란?

: 데이터 베이스 안에서 실제로 규칙을 가진 데이터가 저장되는 상자.

  • 레코드(record): 테이블의 가로 행. 하나의 레코드가 한 건의 데이터이다.
  • 칼럼(column): 테이블의 세로 열. 하나의 칼럼이 데이터의 각 요소이다.

 

(2) pgAmin 4로 테이블 생성

member 테이블 생성

 

(3) 데이터의 제약 조건

제약 조건 개요
NOT NULL null 값 허용 x
UNIQUE 중복값 허용 x
CHECK 지정한 조건을 만족하지 않는 값 허용 x
PRIMARY KEY 테이블 안에서 레코드를 식별하는 기본 키 설정
(NOT NULL, UNIQUE가 함계 적용됨.)
FOREIGN KEY 관련 테이블을 연결하는 설정
DEFAULT 칼럼의 초기값을 설정

 


4-3 데이터 입력

(1) SQL이란

Structed Query Language

: 데이터베이스를 조작하기 위한 언어

 

CRUD!?:영속적으로 데이터를 취급하는 4개의 기본적인 기능을 뜻함.

CRUD 명령어 개요
생성(create) INSERT 데이터를 등록
읽기(read) SELECT 데이터를 참조
갱신(update) UPDATE 데이터를 갱신
삭제(delete) DELETE 데이터를 삭제

 

(2) 테이블에 데이터 입력

member 테이블을 우클릭해 [Query Tool]을 선택하면 아래와 같이 Query Editor가 표시된다. 

앞서 배운 CRUD를 사용해보자.

위처럼 코드를 짰는데 에러가 걸렸다..!

이유는 "id = 2"에서 띄어쓰기를 해서 그랬다.

아래와 같이 바꿔줬더니 잘 실행되었다.


4-4 엔티티와 리포지토리 알아보기

(1) 엔티티란?

: 데이터를 담아두는 객체. → 데이터베이스 테이블의 한 행(레코드)에 대응하는 객체이다.

엔티티의 필드는 테이블의 칼럼값에 대응한다!

// 엔티티
public class Member{
    private Integer id; //id 칼럼 대응
    private String name;    // name 칼럼 대응

    public Integer getId(){
        return id;
    }
    public void setId(Integer id){
        this.id = id;
    }
    
    public String getName(){
        return name;
    }
    public void setName(String id){
        this.name = name;
    }
}

<엔티티를 다룰 때 기억할 세 가지!>

  1. 클래스명은 대응하는 테이블명으로!
  2. 데이터베이스 값을 등록/갱신 하는 경우 엔티티에 값을 넣어서 넘기기!
  3. 데이터베이스에서 값을 가져오는 경우 엔티티에 넣어서 가져오기!

 

(2) 리포지토리란?

: 데이터베이스를 조작하는 클래스.

흐음.. 데이터베이스와 인터페이스 사이에서 연결하는 역할을 하는 듯..!? (뇌피셜..)

리포지토리를 생성하는 경우 반드시 인터페이스를 정의하고 구현해야한다!

(리포지토리 인터페이스의 필드에 리포지토리 구현 클래스를 DI하여, 특정 구현에 의존하는 것을 피할 수 있기 때문!)


4-5 스프링 데이터 JDBC 사용해보기

(1) O/R 매퍼란?

: 애플리케이션의 객체(Object)관계형(Relational)데이터베이스의 데이터를 매핑하는 것!!!

 

(2) 스프링 데이터 JDBC란?

: O/R 매퍼의 종류 중 하나이다.

직접 스프링 데이터 JDBC를 사용해서 데이터베이스에 액세스하는 프로그램을 만들어보자.

(1) 프로젝트 생성하기

(2) applicaation.properties 설정: pgAdmin과 IntelliJ IDEA를 연결!! 

// src/main/resources/application.properties
// JDBC 드라이버의 클래스명을 지정
spring.datasource.driver-class-name=org.postgresql.Driver
// 데이터베이스의 접속 url 설정
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
// 데이터베이스에 접속하는 user명 설정
spring.datasource.username=postgres
// 데이터베이스에 접속하는 비밀번호 설정
spring.datasource.password=password

I(3) 엔티티 생성

package com.example.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;

@Data   // 클래스에 부여되는 것으로 모든 필드에 getter/setter로 액세스 가능.
@NoArgsConstructor  // 클래스에 부여되는 것으로 기본 생성자가 자동 생성됨.
@AllArgsConstructor // 클래스에 부여되는 것으로 모든 필드에 대해 초기화 값을 인수로 가지는 생성자가 자동 생성됨.
public class Member {
    @Id // id가 Primary key!!
    private Integer id;
    private String name;
}

(4) 리포지토리 생성: 멤버 테이블에 대해서 데이터를 조작하는 리포지토리를 생성

package com.example.demo.repository;

import com.example.demo.entity.Member;
import org.springframework.data.repository.CrudRepository;

// 아래의 인수 중 Integer는 @Id 어노테이션을 부여한 필드 타입임!
public interface MemberCrudRepository extends CrudRepository<Member, Integer> {

}

(5) 실제 작업을 처리하는 클래스 생성

package com.example.SpringDataJDBCSample;

import com.example.demo.entity.Member;
import com.example.demo.repository.MemberCrudRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringDataJdbcSampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringDataJdbcSampleApplication.class, args)
				.getBean(SpringDataJdbcSampleApplication.class).execute();	//등록과 전체취득 메서드를 호출하기 위해
	}

	@Autowired
	MemberCrudRepository repository;

	private void execute(){
		//등록
		executeInsert();
		//전체 취득
		executeSelect();
	}

	//등록
	private void executeInsert(){
		Member member = new Member(null, "이순신");	// 엔티티 생성(id는 자동 부여되니까 null로 설정)
		member = repository.save(member);	// 리포지토리를 이용해 등록하고, 결과를 취득
		System.out.println("등록 데이터: " + member);	// 결과를 표시
	}

	//전체 취득
	private void executeSelect(){
		System.out.println("---- 전체 데이터를 취득합니다 ----");
		Iterable<Member> members = repository.findAll();  // 리포지토리를 이용해 전체 데이터 취득
		for(Member member : members){
			System.out.println(member);
		}
	}

}

기억할 점!

- CurdRepository를 상속한 것만으로 CRUD을 실행할 수 있는 메서드를 사용할 수 있는 것은 개발을 편리하게 해줌!

- 주의할 점: CrudRepository를 상속한 인터페이스에 @Repository를 부여하지 않는다.