티스토리 뷰
0. DB 연결 방법

방법 | 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;
}
'정리용 > DB' 카테고리의 다른 글
[DB 기초] 6-2. JDBC Template (0) | 2025.03.19 |
---|---|
[DB 기초] 6-1. JDBC API / Driver (0) | 2025.03.19 |
[DB 기초] 5. 인덱스 (0) | 2025.03.18 |
[DB 기초] 3-1. DB 동시성 제어 기법(Pessimistic / Optimistic Lock) (0) | 2025.03.11 |
[DB 기초] 3. DB 동시성 제어(Concurrency Control) (0) | 2025.03.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- useMemo
- useLayoutEffect
- acas#acas7기
- useRef
- git
- useContext
- useCallback
- useEffect
- ASAC
- acac
- Nginx
- asac7#asac
- memo
- asac7
- useState
- react
- ssh
- asac#asac7기
- asac7기
- useReducer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함