데이터베이스와 인텔리제이 연결
이 아이콘을 통해 데이터베이스의 연결정보 입력 (이름, Host, 인증방법, User, password)
조회도 할 수 있고 insert 도 가능, console 에서 쿼리도 가능하다.
Application 과 데이터베이스 연결
데이터베이스에 맞는 드라이버를 설치해야 한다.
지금은 Postgre 를 사용하므로 Postgre 드라이버를 설치한다.
Postgre 종속성
runtimeOnly("org.postgresql:postgresql") // 컴파일 시점이 아닌, 실행시점에 해당 종속성 필요
implementation 과 runtimeonly 차이
이것만 해서 끝나는게 아니라 해당 Application 에 DB 의 정보를 주어야 한다. (인텔리제이와 연결시 연결정보를 준 것처럼) * resources 하위의 application.properties 파일에 정보를 입력 (정보는 인텔리내부연결정보참조)
spring.datasource.url={연결정보}
spring.datasource.username={유저이름}
spring.datasource.password={비밀번호}
* yml 형식
spring:
datasource:
url: {URL}
username: postgres
password: {비밀번호}
DB는 보안을 위해 위의 두 가지 방법이 아닌 DB정보를 환경변수로 설정, 보안 소프트웨어 사용
* configuration 의 modify options 내에서 환경변수 설정
SPRING_DATASOURCE_URL={URL}?user={USERNAME}&password={PASSWORD}
ORM (Object-Relational Mapping)
: 객체와 관계형 데이터베이스 간의 매핑
- 별도의 SQL 쿼리 작성할 필요 X
- 객체 활용 -> 재사용성 증대
JPA (Java Persistence API)
: ORM 의 한 종류
🚩우리는 PostgreSQL 을 쓸 건데
JDBC 로 java application 에서 PostgreSQL 에 접근을 하여 각종 SQL 을 사용할 수 있게 해주고
JPA 가 이 JDBC API 를 내부적으로 사용하면서 객체지향적으로 DB를 다룰 수 있도록 하고
이런 JPA 를 더욱 쓰기 편하게 만들어 놓은 라이브러리인 Spring Data JPA 으로 내부적으로 JPA 를 사용한다.
JDBC (Java Database Connectivity)
= 하나의 인터페이스인 JDBC API + 인터페이스의 DB별 구현체인 JDBC Driver
Hibernate
=JPA 인터페이스의 구현체 중 하나
테이블과 맵핑되는 객체가 Entity
이 Entity의 인스턴스가 데이터와 맵핑
@Entity등의 어노테이션을 통해 JPA 에서 관리하는 객체로 작동
@Entity
@Table(name = "post") // @Table 생략 가능, 생략 시 클래스 이름으로 자동 맵핑
class Post(
@Column(name = "title") // DB의 Column 과 맵핑
var title: String,
// ... 다른 필드 및 메소드
@OneToMany(mappedBy = "post")
val comments: List<Comment> = mutableListOf(),
@ManyToOne
@JoinColumn(name = "author_id", nullable = false)
val author: User,
) {
@Id // Entity의 Primary Key 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 자동으로 생성되는 식별자
var id: Long? = null
}
이렇게 정의한 Entity 는 영속성 컨텍스트에 포함되어 있는지, 아닌지에 따라 JPA 가 데이터베이스에 변경사항을 저장하여 영속성을 부여할지, 말지 결정
JPA Persistence Context 영속성 컨텍스트
: Entity 가 어떤 산태에 있는지 추적
Transient / Managed / Detached / Removed
이런 상태를 통해 트랜잭션 종료시 최종적으로 DB에 어떤 쿼리를 날릴지 결정,
트랜잭션이 끝나는 시점에 Managed / Removed 상태의 Entity 들의 변경사항이 DB에 반영됨
트랜잭션을 통한 쓰기 지연, Dirty Checking : ??
Course Entity 설정 중
status 에 open closed 가 아닌 다른 값이 들어가는 것을 방지하기 위해 타입을 enum? 으로 설정
enum class 열거 클래스
enum class status {
OPEN,
CLOSED
}
여러 개의 값을 열거해서 사용할 수 있도록 정의해 놓은 클래스
특정 그룹안의 구성 요소를 정의하는 값이 필요할 때!
'왕초보일지' 카테고리의 다른 글
231227 | Todo Step1 (0) | 2023.12.27 |
---|---|
231226 | Entity 작성, Service layer 연결 (0) | 2023.12.26 |
231221 TIL | (2) | 2023.12.21 |
231220 TIL | Spring Service Layer 작성 (1) | 2023.12.20 |
231219 TIL API설계/DTO작성/챌린지반주제 (0) | 2023.12.19 |