티스토리 뷰

0. DB 연결 방법

출처 : ASAC 수업자료

방법 Spring Boot  DB 특징
1 로컬 로컬 - 로컬에서 개발 및 디버깅 시 사용하는 방법 (가장 초보적인)
2 로컬 Docker - 로컬에서 개발 및 디버깅 시 사용하는 방법
3 Docker 로컬 - 도커화된 앱과 로컬 DB 간의 테스트
4 Docker Docker - 배포와 비슷한 환경 테스트 혹은 실제 배포 시 사용하는 방법

0.1 로컬 내 Docker를 통해 데이터베이스 서버 구동 - PostgresQL

- gitbash에서 해당 명령어를 수행함

docker run --name postgresql-container \ // 이름이 postgresql-container인 컨테이너 시작
-e POSTGRES_USER=사용자이름 \ // -e : 환경변수 설정, POSTGRES_USER=사용자이름
-e POSTGRES_PASSWORD=패스워드 \ // POSTGRES_PASSWORD=패스워드
-e POSTGRES_DB=DB이름 \ // POSTGRES_DB=DB이름
-p 54322:5432 -d postgres:15 // 호스트의 포트번호:PostgreSQL의 기본 포트 번호, -d : 백그라운드 실행

 

- 추가적인 확인을 위한 도커 명령어

docker ps // 컨테이너 조회
docker exec -it 컨테이너명 bash // 해당 컨테이너명에 직접 접근
# PostgresQL Docker 컨테이너 중지
docker stop postgresql-container

# PostgresQL Docker 컨테이너 시작
docker start postgresql-container

# PostgresQL Docker 컨테이너 재시작
docker restart postgresql-container

 

- PostgresQL의 간단한 명령어

psql -U 유저명 -d DB명 // MySQL기준 USE database_name;

\l // MySQL기준 SHOW DATABASES

\dt // MySQL기준 SHOW TABLES

0.2 Docker로 구동되는 데이터베이스 접속 

1. 데이터베이스 접속 관리 : JDBC (Driver)

2. 데이터베이스 객체-쿼리 : JPA (Java ORM 표준, Dialect 통한 쿼리 변환)

3. 데이터베이스 쿼리 메서드 : Spring Data JPA (엄청 간편하게 데이터베이스를 사용할 수 있도록)

더보기
// application.properties 사용 시

# ORM
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

# PostgresQL - CREATE USER user PASSWORD '!@#' SUPERUSER;
spring.datasource.url=jdbc:postgresql://localhost:54322/DB이름?useSSL=false
spring.datasource.username=유저이름
spring.datasource.password=패스워드

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true

 

// application.yml 사용 시
spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:54322/DB이름?useSSL=false
    username: 유저이름
    password: 패스워드
  jpa:
    generate-ddl: true
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
    show-sql: true

0.3 주의점

:: JPA를 사용할 때, DB내 예약어가 포함된 테이블이나 컬럼 이름을 사용할 경우, 에러 / 문법 오류 발생

:: 해결을 위해서는 쿼리 내 예약어에 대해서 " "로 감싸주어야 함

DROP TABLE employees,  user;  // 문법 오류
DROP TABLE employees, "user"; // 오류 해결
// application.properties
spring.jpa.properties.hibernate.globally_quoted_identifiers=true

// application.yml
spring:
  jpa:
    properties:
      hibernate.globally_quoted_identifiers: true

해당 설정을 통해 Hibernate가 생성하는 모든 테이블명과 컬럼명에 자동으로 " "추가


1. Entity 클래스를 통한 테이블 생성

1.1 Auto DDL (Automatic Data Definition Language)

:: JPA와 Hibernate에서 제공하는 기능

:: 애플리케이션이 실행될 때, Entity 클래스에 따라 자동으로 DB의 테이블과 구조를 생성하거나 업데이트하는 기능

 

- 위의 0.2에서 설정한 내용들을 포함함

설정 옵션 내용
1. none 테이블 자동 생성 X, 이미 존재하는 테이블을 사용
2. update Entity 클래스에 따라 자동 업데이트 - 테이블 삭제 X이므로, 기존 데이터 유지(RollBac X)
기존 테이블 변경 / 새로운 컬럼 추가
3. create 애플리케이션 시작 시 DB 테이블을 삭제하고 새로 생성
재생성 시, 기존 데이터는 모두 삭제
4. create-drop  create와 유사 애플리케이션 종료 시 DB 테이블 삭제
spring.jpa.hibernate.ddl-auto=update  # 'create', 'create-drop', 'none' 등으로 변경 가능

1.2 JPA 엔티티 정의

1. @Entity

항목 내용
- 역할 :: JPA에서 해당 클래스가 엔티티임을 명시 -> 해당 클래스는 DB의 테이블과 매핑됨
:: DB의 행에 대한 CRUD 작업
- 특징 :: 기본적으로 클래스의 이름 == 테이블 이름
:: @Entity가 선언된 클래스에는 반드시 기본 키(@Id)를 지정해야 함
:: @Entity가 선언된 클래스는 반드시 public / protected로 접근 가능한 기본 생성자를 제공해야 함

 

2. @Id

항목 내용
- 역할 :: 해당 필드를 엔티티의 기본 키(Primary Key)로 지정
:: 해당 컬럼이 유일하고 각 엔티티 객체를 식별하는 데 사용된다는 것을 명시
- 특징 :: @Id는 엔티티 클래스 내에서 하나의 필드에만 사용 가
:: JPA는 해당 필드를 기준으로 데이터베이스에서 레코드를 조회하거나 수정

 

3. @GeneratedValue

항목 내용
- 역할 :: 기본 키(@Id) 값을 자동으로 생성하는 방법을 정의
:: strategy 옵션으로 자동 생성 전략을 지정 가능
- 옵션  1. GenerationType.AUTO :: 자동으로 기본 키 생성 전략을 결정
2. GenerationType.IDENTITY :: DB의 자동 증가 기능을 사용하여 기본 키를 생성 - MySQL, PostgreSQL
3. GenerationType.SEQUENCE :: DB의 시퀀스를 사용하여 기본 키를 생성 - Oracle, PostgreSQL
4. GenerationType.TABLE :: 기본 키를 생성하기 위한 별도의 테이블을 사용

1.3 Ex

@Getter
@Entity
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)  // 기본 생성자를 제공 (public / protected)
@ToString
public class User {
    /**
     * JPA 통한 Database 사용 시 @GeneratedValue 전략에 대해 조금 상세히 알 필요가 있다.
     * - AUTO     : ID 생성 책임이 JPA 에게 있다 (JPA 는 hibernate_sequence 라는 sequence 테이블을 만들어 활용, nextval 호출)
     * - IDENTITY : ID 생성 책임을 Database 에게 위임한다. 
     * (PostgresQL 은 Primary Key 에 대해 SERIAL 로 정의 및 DB 자체적으로 Sequence 생성)
     * > MySQL 라면 AUTO_INCREMENT 사용할것이고,
     * > PostgresQL 이라면 SERIAL + Sequence 사용 (sequence name 형식은 {tablename}_{columnname}_seq), currval 호출)
     */
    @Id // id 필드를 기본키로 설정 
    @GeneratedValue(strategy = GenerationType.IDENTITY) // id 필드에 대한 키는 자동 생성됨을 의미
    @Setter
    private Integer id;
    private String name;
    private Integer age;
    private String job;
    private String specialty;
    private LocalDateTime createdAt;
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함