데이터베이스와 CRUD (JPA 개념)

2025. 4. 4. 21:04·BackEnd

데이터베이스와 CRUD


데이터베이스와 CRUD가 필요한 이유는?

대량의 데이터를 체계적으로 저장, 관리, 조작하여 정보의 무결성과 일관성을 유지하면서 실제 애플리케이션 개발에서 사용자의 다양한 데이터를 안정적으로 처리하기 위한 기본 기술이기 때문

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

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

행(Row)과 열(Column)으로 구성된 표형태로 저장하고 관리하는 데이터베이스. 다른 테이블과 '관계'라는 개념으로 연결되어 구조적으로 데이터를 관리할 수 있음.

스키마(schema)

스키마는 데이터베이스의 전체 설계도와 같음. 테이블 사이의 관계나 규칙이 무엇인지를 정의하고 데이터베이스에 대한 전반적인 정의가 포함됨

컬럼(column)

테이블 안에서 데이터를 저장하는 세로 방향의 필드. 각 컬럼은 특정한 데이터 타입과 함께, 그 데이터가 어떤 의미를 가지는지 정의함. 엑셀파일들의 이름, 이메일 등의 정보와 같이 각 컬럼에 데이터의 의미를 기입함.

대표적인 데이터 타입

  • 문자열 타입 (String)

    • VARCHAR: 가변 길이 문자열을 저장함. 저장할 문자의 수가 다양할때 주로 이용.
    • TEXT: 제한 없이 긴 문자열을 저장할 수 있음.
    • DB관리 시스템에 따라 권장되는 타입이 다르므로 알아보고 사용!
  • 숫자 타입 (Numeric)

    • INTEGER: 정수 데이터를 저장.
    • BIGINT: 더 큰 범위의 정수를 저장할 때 사용.
    • FLOAT, DOUBLE: 부동소수점 숫자를 저장.
  • 날짜 및 시간 타입 (Date and Time)

    • DATE: 연도, 월, 일, 정보를 저장.
    • TIME: 시간 정보를 저장.
    • DATETIME: 날짜와 시간 정보를 함께 저장. 보통 레코드 생성 시간이나 수정 시간을 저장할때 사용함.

레코드(Row)

레코드는 테이블 내에서 하나의 데이터를 의미함.(ex, 한 명의 사용자, 한 건의 요청)
user_id(PK) name(VARCHAR) email(VARCHAR) created_at(DATETIME)
1 정코딩 jung@gmail.com 2025-04-04 15:00:00
  • user_id: 정수형 타입의 데이터. 기본키(PK) 이므로 테이블에서 하나만 존재해야함.
  • name: 문자열 타입. '이름'을 저장
  • email: 문자열 타입. '이메일'을 저장
  • created_at: 날짜를 저장. 데이터가 생성된 년,일,시 를 저장함.

기본키(Primary Key)와 외래 키(Foreign Key)

  • 기본키 : 각 행을 유일하게 식별하는 키

    • 유일성: 모든 데이터(row)가 서로 달라야함.
    • 중복 불가: 같은 기본키를 2번이상 사용할 수 없음.
    • NULL 불허: 기본키에 해당하는 데이터는 비어있을 수 없음.
  • 외래키: 두 테이블 간의 관계를 연결해주는 키.

  • 기타 제약 조건

    • NOT NULL: 해당 컬럼이 NULL이 될 수 없음을 나타냄.
    • UNIQUE: 해당 컬럼이 유일한 값을 가져야함. (PK가 아닌 일반 컬럼에도 적용이 가능함.)
    • CHECK: 특정 조건을 만족해야 컬럼에 값을 넣을 수 있음.
    • DEFAULT: 값이 없을 경우 자동으로 채워질 기본값 설정.

JPA 개념


CRUD 데이터베이스에서의 가장 기본적인 4가지 동작

  • Create(생성)
  • Read(읽기)
  • Update(수정)
  • Delete(삭제)

JPA

자바 애플리케이션에서 데이터(RDB)와 객체(클래스)를 쉽게 연결하기 위한 표준 인터페이스. 객체지향적으로 작성된 코드와 데이터베이스간의 어색한 간극을 줄여주는 역할을 함. 기존에는 SQL을 직접 사용해서 DB에 접근했어야했지만, JPA를 사용하면 자바 객체(Entity)를 사용해 간단하게 CRUD를 수행할 수 있음.
  • Hibernate, EclipsLink 등은 JPA 표준을 구현한 대표적인 구현체. (실무에서는 Hibernate를 주로 사용함)
  • Entity 클래스: DB 테이블과 매핑될 자바 클래스.
  • Repository: 기본적인 CRUD 작업을 제공해주는 인터페이스.
  • Service/Controller: Repository를 사용해 실제 비즈니스 로직 구현 (CRUD)
  • 일반적으로 SQL에서는 CREATE TABLE 로 만들지만, JPA에서는 코드로 DB 테이블 매핑이 가능함.

예시 코드

// 이 클래스가 JPA 엔티티(테이블과 매핑됨)임을 나타냄
@Entity
// 실제 DB 테이블 이름을 "notes"로 지정
@Table(name = "notes")
public class Note {

    // 기본 키(PK)로 사용할 필드
    @Id
    // id 값을 자동 생성 (DB에 따라 AUTO_INCREMENT 또는 SEQUENCE 등으로 처리됨)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 내용 컬럼 - null 허용 안 함, 최대 길이 500자
    @Column(nullable = false, length = 500)
    private String content;

    // 작성자 컬럼 - null 허용, 중복 허용 안 함
    @Column(unique = true)
    private String author;

    // 기본 생성자 (JPA에서 필수)
    public Note() {
    }

    .
    .
    .
}
  • @Entity: JPA가 이 클래스를 테이블과 매핑한다고 인식
  • @Table(name = "notes"): DB에서 테이블의 이름을 지정 (생략시 클래스 이름을 이용)
  • @Id: 기본 키로 사용될 필드를 나타냄 (필수)
  • @GeneratedValue: id 값이 DB에서 자동 증가되도록 설정
  • @Column: 테이블 컬럼의 세부 속성 지정
import org.springframework.data.jpa.repository.JpaRepository;

public interface NoteRepository extends JpaRepository<Note, Long> {
}
  • JpaRepository<Entity, PK 타입>을 상속받으면 기본적인 CRUD 메서드가 자동 생성됩니다.
  • findAllBy<속성이름> 으로 모든 데이터를 조회할 수 있음.

@Service 부분에서 예시코드

@Service
public class NoteService {

    private final NoteRepository noteRepository;

    @Autowired
    public NoteService(NoteRepository noteRepository) {
        this.noteRepository = noteRepository;
    }

    // Create
    public Note create(Note note) {
        return noteRepository.save(note);
    }

    // Read - 전체 조회
    public List<Note> findAll() {
        return noteRepository.findAll();
    }

    // Read - 단건 조회
    public Optional<Note> findById(Long id) {
        return noteRepository.findById(id);
    }

    // Update
    public Note update(Note note) {
        return noteRepository.save(note);
    }

    // Delete
    public void delete(Long id) {
        noteRepository.deleteById(id);
    }
}
  • findById() 와 같은 메서드를 repository에 따로 정의하지 않아도 findById(), findAll()과 같은 메서드를 사용할 수 있다.

'BackEnd' 카테고리의 다른 글

Spring에서 로깅이 필요한 이유 (SLF4J, Logback, Lombok)  (0) 2025.04.04
스프링 빈(Spring Bean)과 의존성 주입(DI: Dependency Injection)  (0) 2025.03.31
디자인 패턴과 패키지 구조  (0) 2025.03.29
API의 구현과 API 명세서-2  (1) 2025.03.25
API의 구현과 API 명세서-1  (2) 2025.03.21
'BackEnd' 카테고리의 다른 글
  • Spring에서 로깅이 필요한 이유 (SLF4J, Logback, Lombok)
  • 스프링 빈(Spring Bean)과 의존성 주입(DI: Dependency Injection)
  • 디자인 패턴과 패키지 구조
  • API의 구현과 API 명세서-2
devStudent
devStudent
저의 개발(Development) 공부(Study) 기록을 추적(Tracing) 하는 블로그입니다!
  • devStudent
    Dev_Study_Trace
    devStudent
  • 전체
    오늘
    어제
    • 분류 전체보기 (23)
      • BackEnd (11)
      • DevOps (4)
      • Algorithm (7)
      • DDD 12기 (Server) (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Divide and conquer
    yml
    프록시 실습
    알고리즘
    GitHub Actions
    데브 옵스
    분할 정복 알고리즘
    도커
    백준 1092
    boj 1992
    boj1068
    http 상태코드
    백준 1068번
    쿠버네티스
    백준
    boj
    리버스 프록시
    devops
    NGINX
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
devStudent
데이터베이스와 CRUD (JPA 개념)
상단으로

티스토리툴바