왕초보일지

231222 TIL |

다시은 2023. 12. 22. 19:10

데이터베이스와 인텔리제이 연결

 

이 아이콘을 통해 데이터베이스의 연결정보 입력 (이름, 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
}

여러 개의 값을 열거해서 사용할 수 있도록 정의해 놓은 클래스

특정 그룹안의 구성 요소를 정의하는 값이 필요할 때!