먹었으면 뇌를 쓰자

JPA 학습 내용을 정리한 로드맵 - 1.1 기본 CRUD 본문

Framework/JPA

JPA 학습 내용을 정리한 로드맵 - 1.1 기본 CRUD

뇌이비 2022. 12. 19. 12:58

 

1. JPA란 무엇인가
     1.1 기본 CRUD
     1.2 기초 지식

2. 연관관계
     2.1 다대일 연관관계 
     2.2 일대다 연관관계 

3. 상속
     3.1 상속관계
     3.2 CASCADE

4. SQL
     4.1 JPQL
     4.2 Querydsl

 

1.1  기본 CRUD

 

- 실습 환경 준비하기 

- 엔티티 작성하기

- CRUD 구현하기

 

 

 

 

<실습 환경 준비하기>

 

① 실습에 사용할 RDB는 MySQL, IDE는 인텔리J이다.

 

MySQL -  jpa_playground 데이터베이스 생성하고 movie 테이블을 만든다.

인텔리J -  maven 빌드툴로 프로젝트를 생성한다. 

 

 

② 프로젝트의 pom.xml에 RDB/JPA 의존 설정을 추가한다.

 

RDB 라이브러리 - MySQL Connector/J 를 설치한다.

JPA 라이브러리 - Hibernate EntityManager Relocation 을 설치한다.

 

 

③ persistence.xml 을 생성한다.

 

persistence.xml이란 쉽게 말해 JPA 환경 설정을 할 수 있는 공간이다. 

'영속성 유닛'이라고도 한다.

하나의 데이터베이스에는 하나의 영속성 유닛이 등록된다. 

 

resources/META-INF/persistence.xml 를 생성한다.

 

 

<persistence.xml> 일부 발췌


<persistence-unit name="playground" transaction-type="RESOURCE_LOCAL">
*영속성 유닛 이름은 해당 프로젝트의 메인 클래스 이름을 쓴다.


<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/jpa_playground?serverTimezone=UTC" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="1234" />

*위의 코드는 ORM과 관련된 것들이다.
*JDBC Driver, url(DB 접속), user(DB 계정), password(DB 비밀번호) 



<property name=
"hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />


*위의 코드는 Hibernate와 관련된 것들이다.
*dialect(해당 RDB), show_sql(SQL문 보기), format_sql(깔끔하게 보기) 등등...

 

 

덧. Auto-DDL

 

Hibernate 관련 코드 중 마지막 코드는 Auto-DDL 설정과 관련된 value 값을 지정한다.

 

none 데이터베이스 구조를 바꾸지 않는다. (DDL 실행 x)

update 변경사항이 있으면 이에 맞게 데이터베이스 구조를 바꾼다. (DDL 실행)

validate 변경사항이 있으면 실행을 종료한다. 

create 변경사항을 저장하지 않고 실행 때마다 새 데이터베이스 구조가 생성된다. 

create-drop 실행할 때 새 데이터베이스 구조 생성하고, 종료할 때 삭제한다.

 

개발 초기에는 update

테스트 시기에는 update 또는 validate

운영 시기에는 validate 또는 none을 지정한다. 

 

 

 

 

 

<엔티티 작성하기>

 

src/main/java/study/Main.class

src/main/java/study/Movie.class

 

 

<Movie.class>


@Entity
@Table(name="MOVIE")
public class Movie {
@Id // pk 설정 어노테이션
@Column(name="ID") // 테이블 생성 시 여러 가지 편집 가능한 어노테이션
private Long id;
@Column(name="NAME")
private String movieName;
<Main.class>


public static void Main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory(" playground ");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();

// 엔티티매니저팩토리 -> 아까 만든 영속성 유닛의 객체를 생성한다.
// 엔티티매니저 -> 엔티티매니저팩토리를 통해 엔티티매니저 객체를 생성한다.
// 엔티티트랜잭션 -> 엔티티매니저를 통해 트랜잭션을 수행한다.


try {
tx.begin(); // 트랜잭션 시작
Movie movie = new Movie(); 
movie.setMovieId(1L); 
movie.setMovieName("Titanic");
em.persist(movie); // persist (Create-INSERT문 실행)
tx.commit(); // 트랜잭션 커밋(종료)
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}

// 엔티티매니저, 엔티티매니저팩토리는 사용 후 닫아준다.

 

 

JPA의 엔티티매니저는 데이터베이스 연결을 유지하며, JPA 기능의 대부분을 처리한다.

위의 코드에서는 트랜잭션 기능을 처리하고 있지만 쿼리 기능도 처리한다. 

 

엔티티매니저팩토리는 엔티티매니저의 객체를 만드는 공장이다. 

엔티티매니저팩토리 자체는 객체를 만들지 않는 싱글톤 형태로 사용한다. 

(동일한 하나의 데이터베이스에 연결되어야 하기 때문이다.) 

 

 

 

 

<CRUD 구현하기>

 

Create(persist)

 

Movie movie = new Movie();
movie.setMovieId = (1L);
movie.setMovieName = ("hobit");
em.persist(movie);

*Main.class가 접근하여 사용할 수 있도록 Movie.class에 Setter를 미리 설정한다.

 

 

 

Read(find)

 

Movie findMovie = em.find(Movie.class,1L);
System.out.println("findMovie = " + findMovie); // 출력

*find에는 엔티티.타입과 식별자를 명시한다.
*Movie.class에 toString() 메소드를 작성해둬야 문자열 형태로 정상 출력이 가능하다.
toString() 메소드를 쓰지 않으면 해당 데이터의 메모리 주소값이 출력된다.

 

 

 

Update

 

Movie findMovie = em.find(Movie.class,1L);
findMovie.setMovieName("avatar");

*find로 바꾸고 싶은 레코드를 찾고 setter를 이용해 값을 변경한다.
*따로 api를 사용하지 않아도 자동으로 적용된다.

 

 

 

Delete(remove)

 

em.remove(findMovie);

*이름이 avatar인 레코드가 삭제되었다.

 

 

Comments