위 글은 김성렬 교수님의 KOCW강의를 보고 작성한 글로 자세한 내용은 해당 강의를 통해 확인하시길 권장합니다.
http://www.kocw.net/home/cview.do?cid=5e6aec4a9ae2dd45
스프링과 JPA를 이용한 웹개발
본 강의는 JPA와 스프링프레임워크를 이용한 웹 개발 방법을 설명하고 있습니다.
www.kocw.net
학습 환경 세팅
- Java: Java 11
- IDE: IntelliJ
- 데이터베이스: MySQL
- 빌드툴:
mavengradle (강의에선 maven을 사용하나 gradle 이용함)
간단한 예제 테스트
- MySQL 데이터베이스 및 테스트 테이블 생성
- 새로운 데이터베이스 생성: jpa_playground
- MOVIE 테이블 생성
CREATE TABLE 'jpa_playground'.'movie'(
'MOVIE_ID' INT NOT NULL
'NAME' VARCHAR(45) NULL,
PRIMARY KEY('MOVIE_ID')
);
- gradle 프로젝트 생성 및 필요 라이브러리 의존 설정
pom.xml에 JPA, MySQL 라이브러리 설치gradle 사용하면서 해당 과정 필요 없음- build.gradle 파일 설정
dependencies {
implementation group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.6.1.Final'
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.28'
}
참고 사이트: https://jojelly.tistory.com/63
인텔리제이 설치 / gradle설정/ springboot 프로젝트 만들기
이클립스가 아닌 인텔리제이를 이용하여 프로젝트를 만들고자 한다. 나와 같은 초보자 혹은 미래에 이 글을 찾아올 나를위해 설치 및 프로젝트 생성법을 남겨둘것이다. 1. 인텔리를 받기전
jojelly.tistory.com
- META-INF 폴더 생성 및 persistence.xml 생성
- 프로젝트 구조
- persistence.xml 일부
<persistence-unit name="playground" transaction-type="RESOURCE_LOCAL">
<description>
Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
</description>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>study.Movie</class>
<properties>
<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="root2829!" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />
<property name="hibernate.show_sql" value="true" />
<!-- <property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
📌 build.gradle의 의존설정과 persistence.xml의 의존설정은 뭐가 다를까? 🤔
라이브러리 의존성 ➡️ build.gradle에 설정
설정이 필요한 데이터베이스 등 ➡️ persistence.xml에 설정
- Main class, Movie class 작성
package study;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
// 의존 설정 참고
@Entity
public class Movie {
@Id
@Column(name = "MOVIE_ID")
private Long movieId;
@Column(name = "NAME")
private String movieName;
public Long getMovieId() {
return movieId;
}
public void setMovieId(Long movieId) {
this.movieId = movieId;
}
public String getMovieName() {
return movieName;
}
public void setMovieName(String movieName) {
this.movieName = movieName;
}
@Override
public String toString() {
return "Movie{" +
"movieId=" + movieId +
", movieName='" + movieName + '\'' +
'}';
}
}
package study;
import javax.persistence.*;
public class Main {
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("타이타닉");
em.persist(movie);
tx.commit();
} catch (Exception e){
tx.rollback();
} finally {
em.close();
}
}
}
JPA 관련 코드는 트랜잭션 안에서 수행
- Movie class (엔티티) 어노테이션 생성
트랜잭션의 중요성
- JPA의 수행 로직은 반드시 트랜잭션 내에서 수행해야 함
- 트랜잭션 밖에서 수행할 경우 에러 발생
try{
tx.begin();
// JPA 관련 코드
tx.commit();
} catch(Exception e){
tx.rollback();
}
- 주의
- persist 메소드는 엔티티를 영속성 컨텍스트(=컨테이너)라는 곳에 저장하는 것이지 엔티티의 내용을 DB에 저장하는 것은 아님
- 저장은 언제?
- 트랜잭션이 종료되는 시점에 DB에 전달할 모든 SQL을 모아서 한 번에 처리 (tx.commit)
- 저장은 언제?
- persist 메소드는 엔티티를 영속성 컨텍스트(=컨테이너)라는 곳에 저장하는 것이지 엔티티의 내용을 DB에 저장하는 것은 아님
엔티티 매니저 설정
- 엔티티 매니저 팩토리와 엔티티 매니저
- 엔티티 매니저는 엔티티 매니저 팩토리에서 받아옴
- 엔티티 매니저가 DB 연결을 유지하고 있음
- 엔티티 매니저는 JPA의 대부분의 기능 (DB와 연동되는 부분)을 제공
- 엔티티 매니저 팩토리가 엔티티 매니저 인스턴스를 제공
- 서로 다른 DB에 접근할 경우 복수 개의 엔티티 매니저 팩토리 생성
- 엔티티 매니저 팩토리는 생성 오버헤드가 있으므로 싱글톤 형태로 관리(하나의 인스턴스만 공유)
- 엔티티 매니저 팩토리를 통해 엔티티 매니저를 생성하는게 바람직함
- 엔티티 매니저 팩토리는 생성된 오버헤드가 커서 싱글톤 패턴으로 관리
기본 CRUD
- 등록: em.persist(movie)
try{
tx.begin();
Movie movie = new Movie();
movie.setMovieId(1L);
movie.setMovieName("타이타닉");
em.persist(movie);
tx.commit();
} catch (Exception e){
tx.rollback();
} finally {
em.close();
}
- 조회: Movie findMovie = em.find(Movie.class, 1L)
try{
tx.begin();
Movie findMovie = em.find(Movie.class, 1L);
System.out.println("findMovie = " + findMovie);
tx.commit();
} catch (Exception e){
tx.rollback();
} finally {
em.close();
}
- 수정
Movie findMovie = em.find(Movie.class, 1L);
findMovie.setMovieName("로미오와줄리엣");
try{
tx.begin();
Movie findMovie = em.find(Movie.class, 1L);
findMovie.setMovieName("로미오와줄리엣");
tx.commit();
} catch (Exception e){
tx.rollback();
} finally {
em.close();
}
📌 em.update() 같은거 쓸 필요 없음 JPA가 알아서 findMovie를 가지고 찾아서 해 줌
- 삭제: em.remove(findMovie);
try{
tx.begin();
Movie findMovie = em.find(Movie.class, 1L);
em.remove(findMovie);
tx.commit();
} catch (Exception e){
tx.rollback();
} finally {
em.close();
}
'강의 > etc' 카테고리의 다른 글
[Spring/JPA] JPA 기초지식 (0) | 2022.04.20 |
---|---|
[Spring/JPA] 강의소개 및 JPA 소개 (1) | 2022.03.30 |
[JS] 2022 30분 요약 강좌(1) (0) | 2022.03.15 |
[SwiftUI fundamental Tutorial] Redux (0) | 2021.10.16 |
[SwiftUI fundamental Tutorial] LazyVGrid (0) | 2021.10.07 |