Devlog
article thumbnail
Published 2022. 4. 19. 16:37
[Spring/JPA] 환경설정 강의/etc

위 글은 김성렬 교수님의  KOCW강의를 보고 작성한 글로 자세한 내용은 해당 강의를 통해 확인하시길 권장합니다.

http://www.kocw.net/home/cview.do?cid=5e6aec4a9ae2dd45

 

스프링과 JPA를 이용한 웹개발

본 강의는 JPA와 스프링프레임워크를 이용한 웹 개발 방법을 설명하고 있습니다.

www.kocw.net

 

학습 환경 세팅

  • Java: Java 11
  • IDE: IntelliJ
  • 데이터베이스: MySQL
  • 빌드툴: maven gradle (강의에선 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)

 

 

엔티티 매니저 설정

  • 엔티티 매니저 팩토리와 엔티티 매니저
    • 엔티티 매니저는 엔티티 매니저 팩토리에서 받아옴
    • 엔티티 매니저가 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
profile

Devlog

@덩이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그