본문 바로가기
Web Develop/Book Study

[Book Study] 스프링 프레임워크 첫걸음 - 4. 데이터베이스 작업

by tripleup 2023. 8. 9.
728x90
반응형

[Book Study] Spring Framework 스프링 프레임워크 첫걸음
4. 데이터베이스 작업


4 - 1 데이터베이스 생성

데이터베이스

- 데이터를 보관하기 위한 '상자'

 

데이터

- 규칙을 가지고 데이터를 정리

 

관계형 데이터베이스 (RDB)

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

 

PostgresQL 실행


4 - 2 테이블 생성

테이블

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

 

레코드와 칼럼

- 레코드(가로/행), 칼럼(세로/열)

 

제약 조건

- 제약조건에 따라 테이블 내의 데이터를 자유롭게 제약하여 불일치 값이 저장되는 것을 막을 수 있다.

 

1. NOT NULL : NULL 입력을 허용하지 않음(필수 입력).

2. UNIQUE : 중복값 입력을 허용하지 않음(고유한 값).

3. CHECK : 지정한 조건을 만족하지 않는 값의 입력을 허용하지 않음

4. PRIMARY KEY : 테이블 안에서 레코드를 식별하는 기본키를 설정. 기본키는 NOT NULL과 UNIQUE가 함께 적용

5. FOREIGN KEY : 관련된 테이블을 연결하는 설정 (외부 키)

6. DEFAULT : 칼럼의 초깃값 설정


4 - 3 데이터 입력

SQL

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

 

CRUD

- 영속적으로 데이터를 취급하는 4개의 기본적인 기능인 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete)


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

엔티티

- 데이터를 담아두는 객체, 데이터베이스 테이블의 한 행에 대응하는 객체

- 엔티티의 필드는 테이블의 칼럼값에 대응

 

리포지토리

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

- 리포지토리를 생성하는 경우는 반드시 인터페이스를 정의하고 구현 (리포지토리 인터페이스의 필드에 리포지토리 구현 클래스를 DI하여 특정 구현에 의존하는 것을 피할 수 있기 때문)

- 자바에서는 인터페이스를 구현한 클래스의 접미사에 'Impl'을 붙이는 경우가 많음 (Implements의 약자)

 


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

O/R 매퍼

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

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

 

스프링 데이터 JDBC

- 스프링 데이터가 제공하는 CrudRepository를 사옥해서 자동으로 CRUD를 지원하는 메서드를 사용할 수 있음

 

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

 

application.properties 설정

- postgres 데이터베이스 접속 관련 설정

spring.datasource.driver-class-name=org.postgresql.Driver
//JDBC 드라이버의 클래스명을 지정
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
//데이터베이스의 접속 URL 설정
spring.datasource.username=postgres
//데이터베이스의 접속하는 유저명 설정
spring.datasource.password=0000
//데이터베이스의 접속하는 패스워드 설정

 

엔티티 생성

package com.example.demo.entity;

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

/**
 * Member 테이블 엔티티
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    /** Member 번호 */
    @Id
    private Integer id;
    /** Member 이름 */
    private String name;

}

 

@Data

- 클래스에 부여하는 것으로, 전 필드에 대해 getter/setter 로 액세스 할 수 있음

- hashCode(), equals(), toString()도 자동 생성

 

@NoArgsConstructor

- 클래스에 부여하는 것으로, 기본 생성자가 자동 생성

 

@AllArgsConstructor

- 클래스에 부여하는 것으로, 전 필드에 대해 초기화 값을 인수로 가지는 생성자가 자동 생성

 

@Id

- 기본키에 해당하는 필드에 어노테이션 부여

- org.springframework.data.annotation.Id가 임포트 됨

 

리포지토리 생성

package com.example.demo.repository;

import com.example.demo.entity.Member;

import org.springframework.data.repository.CrudRepository;

/**
 * Member 테이블 : 리포지토리
 */
public interface MemberCrudRepository extends CrudRepository<Member, Integer> {
}

 

Member : CrudRepository 인수의 타입 (저장 대상 객체의 타입)

Integer : @Id 어노테이션을 부여한 필드의 타입 (저장 대상 객체의 기본기 타입)

 

-> MemberCrudRepository 인터페이스 안에서 메서드를 작성하지 않아도 사용 가능

 

* MeberCrudRepository는 인터페이스이므로 인스턴스화 불가 -> @Repository 어노테이션을 따로 부여 불가

 

CrudRepository의 CRUD 메서드

반환형 메서드 개요
long count() 취득한 엔티티의 수를 돌려줍니다.
void delete(Member Entity) 지정한 엔티티를 삭제합니다.
void deleteAll() 리포지토리에서 관리하는 모든 엔티티를 삭제합니다.
void deleteAll(Iterable entities) 지정한 복수의 엔티티를 삭제합니다.
void deleteById(Integer id) 지정한 ID에 해당하는 엔티티를 삭제합니다.
boolean existsById(Integer id) 지정한 ID에 해당하는 엔티티의 존재 여부를 확인합니다.
Iterable findAll() 모든 엔티티를 반환합니다.
Iterable findAllById(Iterable ids) 지정한 복수의 ID에 해당하는 엔티티를 반환합니다.
Optional findById(Integer id) 지정한 ID에 해당하는 엔티티를 반환합니다.
Member save(Member Entity) 지정한 엔티티를 저장합니다.
Iterable saveAll(Iterable entities) 지정한 모든 엔티티를 저장합니다.

 

 

실제 작업을 처리하는 클래스

 

package com.example.SpringDataJDBCSample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.example.demo.entity.Member;
import com.example.demo.repository.MemberCrudRepository;

/**
 * 스프링 부트 기동 클래스
 */
@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을 설정)
		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);
		}
	}
}

 

 


728x90
반응형

댓글