04장. 데이터 베이스 작업

박근수·2024년 3월 17일
0

스프링 북스터디

목록 보기
4/8

데이터베이스 생성

데이터베이스란?

데이터베이스(DataBase)란 데이터를 보관하기 위한 '상자'라고 할 수 있음.
데이터베이스에서 데이터를 모을 때는 특정한 규칙을 적용해서 데이털르 정리해서 보관함.

관계형 데이터베이스란?

관계형 데이터베이스(Relational Database)는 데이털르 표 형식으로 표현하고, 여러 표에서 항목의 값 사이에 관계를 맺고 있는 데이터베이스를 뜻함.
표는 테이블(Table)이라고 부르고 테이블과 테이블간의 관계를 관계(Relationship)라고 함.
관계형 데이터베이스는 가장 일반적으로 사용되는 데이터베이스. 줄여서 RDB라고 부름

PostgreSQL로 데이터베이스 확인

1. pgAdmin4 실행

패스워드 입력창에 설치할 때 지정한 패스워드를 입력하고 OK버튼 클릭

2. 데이터베이스 확인

Servers -> PostgreSQL16 -> DataBase 선택
PostgreSql에서는 설치 후 초기화할 때 'postgresql'라는 이름으로 데이터베이스 생성

테이블 생성

테이블이란?

데이터베이스가 데이터를 보관하기 위한 상자라고 설명했지만 데이터베이스 안에서 실제로 규칙을 가진 데이터가 저장되는 상자를 테이블이라고 함.
테이블은 데이터를 항목으로 해서 이차원 표 형식으로 정리해서 저장

레코드와 칼럼

테이블의 가로 행(row)을 레코드(record)라고함.
하나의 레코드가 한 건의 데이터이며, 테이블의 세로 열(column)을 칼럼(column)이라고함. 하나의 칼럼은 데이터의 각 요소가됨

pgAdmin4로 테이블 생성

  • 회원의 정보를 저장하는 member 테이블 생성
    Severs -> PostgreSQL16 -> Databaes -> postgres -> Schemas -> Tables 선택
    Create -> General 탭 선택 후 Name 항목에 member 입력
  • 칼럼 생성
    Columns 탭 -> '+' 클릭 후 입력란 추가
테이블 생성
NameData TypeLength/PrecisionScaleNotNUll?PrimaryKey?Default
idserialnoyes
namecharater varying10yesno

id 칼럼은 1에서 214748364까지 일련번호가 부여됨.
레코드의 제약 조건(Constraint)으로 'Primary Key'를 부여함.
name 칼럼은 문자 데이터로 10글자까지 입력되고 필수 입력의 의미로 Not Null 제약 조건을 설정

제약 조건
제약 조건개요
Not NullNull 입력을 허용하지 않음(필수 입력)
Unique중복값 입력을 허용하지 않음(고유한 값)
Check지정한 조건을 만족하지 않는 값의 입력을 허용하지 않음
Primary Key테이블 안에서 레코드를 식별하는 기본키를 설정.(기본키는 Not Null, Unique 함께 적용
Forign Key관련된 테이블을 연결하는 설정(외부 키라고도 부름)
Default칼럼의 초기값 설정

데이터 입력

SQL이란?

SQL은 데이터베이스를 조작하기 위한 언어.
SQL은 Structured Query Language(구조화 질의어)이며 SQL은 ANSI(American National Standard Institute)와 ISO(국제 표준화 기구)에서 사양이 표준화되어 있어 다른 데이터베이스에서도 같은 방법을 조작 가능

CRUD

영속적으로 데이터를 취급하는 4개의 기본적인 기능인 생성(Creat), 읽기(Read), 갱신(Update), 삭제(Delete)의 머리글자를 따서 만든 단어

SQL의 CRUD
CRUD명령어개요
CreateInsert데이터를 등록
ReadSelect데이터를 참조
UpdateUpdate데이터를 갱신
DeleteDelete데이터를 삭제

테이블에 데이터 입력

INSERT 실행

Tables -> member 선택 -> Tools -> Query Tool 선택하면 Query Editor이 표시됨

id 칼러dms serial 타입이여서 자동으로 일련번호가 설정되기 때문에 Insert 문에 설정할 필요가 없음

INSERT INTO member(name) VALUES ('홍길동');
INSERT INTO member(name) VALUES ('이순신');

Table -> member 선택 -> 표 마크 View Data 클릭하면 자동으로 Query Editor가 표시되며 Data Output에 등록된 데이터 확인 가능

SELECT 실행

Tables -> member -> 메뉴 바 -> Tools -> Query Tool -> Query Editor -> SQL 구문 입력

SELECT id, name FROM member;

UPDATE 실행

Qurey Editor 에서 다음 SQL 구문 실행

UPDATE member SET name = 'Lee Sun-sin' WHERE id=2;

DELETE 실행

Query Editor에 다음 SQL 구문 실행

DELETE FROM member WHERE id=2;

엔티티와 레포지토리 알아보기

엔티티란?

엔티티를 한마디로 표현하면 '데이터를 담아두는 객체' 입니다.
엔티티는 데이터베이스 테이블의 한 행(레코드)에 대응하는 객체이며, 엔티티의 필드는 테이블의 칼럼값에 대응함.

Member 엔티티의 예
//Member 테이블 : 엔티티
public class Member{
	//id 칼럼 대응
    private Integer id;
    //name 칼럼 대응
    private String name;
    
    public Integer getId(){
    	return id;
    }
    public void setId(Integer id){
    	this.id = id;
    }
    
    public String getName(){
    	return name;
    }
    public void setName(String name){
    	this.name = name;s
    }
    
}
  • 클래스명
    클래스명은 대응하는 데이터베이스의 테이블명으로 하는 경우가 많습니다.

  • 데이터베이스에 값 넘겨주기
    데이터베이스 값을 등록/갱신하는 경우에는 엔티티에 값을 넣어서 넘겨줍니다.

  • 데이터베이스에서 값 가져오기
    데이터베이스에서 값을 가져오는 경우에는 값을 엔티티에 넣어서 가져옵니다.

레포지토리란?

데이터베이스를 조작하는 클래스
레포지토리를 생성하는 경우에는 반드시 인터페이스를 정의하고 구현해햐함.
레포지토리 인터페이스의 필드에 레포지토리 구현 클래스를 DI하여 특정 구현에 의존하는 것을 피할 수 있기 때문.

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

O/R 매퍼란?

Object-relational Mapper 는 애플리케이션에서 사용하는 O(Object):'객체'와 R(Relational):'관계형 데이터베이스'의 데이터를 매핑하는 것

O/R 매퍼는 미리 설정된 객체와 관계형 데이터베이스 간의 대응 관계 정보를 가지고 인터페이스의 데이터에 대응하는 테이블에 내보내거나 데이터베이스에서 값을 읽어 들여 인터페이스에 대입하는 작업을 자동을 실행

스프링 데이터 JDBC란?

스프링 데이터 JDBC는 O/R 매퍼이며, 스프링 데이터가 제공하는 CrudRepository를 상속해서 자동으로 CRUD를 지원하는 메서드를 사용할 수 있습니다.

스프링 데이터 JDBC 프로그램 생성

프로젝트 생성

의존 관계(Dependencies) 추가
  • Spring Boot Devtools(개발 도구)
  • Lombok(개발 도구)
  • Spring Data JDBC(SQL)
  • PostgreSQL Driver(SQL)

application.properties 설정

src/main/resource -> application.properties 열기
아래 구문 추가

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:접속URL/postgres
spring.datasource.username=유저명
spring.datasource.password=비밀번호
설정 항목 설명
항목설명
spring.datasource.driver.class-nameJDBC 드라이버의 클래스 명을 지정.
spring.datasource.url데이터베이스의 '접속 URL설정'
spring.datasource.username데이터베이스에 접속하는 '유저명'설정
spring.datasource.password데이터베이스 접속하는 '패스워드 설정'

엔티티 생성

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    //Member 번호
    @Id	
    private Integer id;
    private String name;
}
  • @Data
    클래스에 부여하는 것으로, 전 필드에 getter/setter로 액세스 가능. hashcode(). equals(). to string() 자동 생성
  • @NoArgsConstructor
    클래스에 부여하는 것으로, 기본 생성자가 자동 생성
  • AllArgsConstructor
    전 필드에 대해 초기화 값을 인수로 가지는 생성자가 자동 생성

레포지토리 생성

public interface MemberCrudRepository extends CrudRepository<Member, Integer> {
}
CrudRepository의 CRUD 메서드
반환형메서드개요
longcount()취득한 엔티티의 수를 돌려줌
voiddelete(Member entity)지정한 엔티티 삭제
voiddeleteAll()레포지토리에서 관리하는 모든 엔티티 삭제
voiddeleteAll(Iterable entites)지정한 복수의 엔티티 삭제
voiddeleteById(Integer id)지정한 ID에 해당하는 엔티티 삭제
booleanexistsById(Integer id)지정한 ID에 해당하는 엔티티의 존재 여부 확인
IterablefindAll()모든 엔티티 반환
iterablefindAllById(Iterable ids)지정한 복수의 ID에 해당하는 엔티티 반환
OptionalfindById(Integer id)지정한 ID에 해당하는 엔티티 반환
Memberssave(Member entity)지정한 엔티티 저장
IterablesaveAll(Iterable entities)지정한 모든 엔티티 저장

클래스 생성

@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() {
		//엔티티 생성(id는 자동 부여되기 때문에 null 설정0
		Member member = new Member(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);
		}
	}

실행 결과

등록 데이터 : Member(id=3, name=이순신)
--- 전체 데이터를 취득합니다 :) ---
Member(id=1, name=홍길동)
Member(id=3, name=이순신)
profile
개발블로그

0개의 댓글