일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Session1이 그 모든 클라이언트의 저올
- securityconfig
- Spring Security
- WebSecurity
- ㅇㅇㅇㄴㅇ
- ㅂ
- WebConfigurerAdapter
- 스프링 #스프링 시큐리티 #spring security
- HttpSecurity
- 스프링시큐리티
- Today
- Total
다오의 개발일지
TIL-20 JPA, Entity, 영속성 컨텍스트, 트랜잭션 본문
ORM : 객체와 데이터베이스를 맵핑해주는 도구
ORM은 반복적이고 번거로운 애플리케이션단에서의 sql작업을 줄여주기위해 등장한 기술입니다.
즉 객체와 DB의 데이터를 직접 맵핑하는데 쉽게 처리를 해줍니다.
JPA는 자바 ORM기술의 표준 명세입니다.
JPA가 동작하는 부분
애플리케이션 서버와 JDBC 사이에서 동작이 되고 있습니다.
JPA를 사용하면 데이터베이스 연결과정을 직접 개발하지 않아도 자동으로 처리를 해줍니다.
Hibernate : JPA를 실제로 구현한 Framwork중 사실상 표준이 Hibernate입니다. 스프링부트에서는 기본적으로 이 Hibernate 구현체를 사용하고 있습니다.
Entity 이해하기
Entity : JPA에서 관리되고 있는 클래스, 즉 객체를 의미합니다. 데이터베이스의 table하고 맵핑이 되어서 JPA에 의해서 관리가 되고 있습니다.
JPA가 Entity 클래스를 객체화 할때 기본 생성자를 사용합니다. 반드시 기본생성자가 있어야합니다.
어노테이션 정리
@Entity : JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name="memo") :매핑할 테이블의 이름을 지정
@Id : 영속성 컨텍스트 내에서 Entity를 구분할때 사용합니다. 식별자 역할
@GeneratedValue(strategy = GenerationType.IDENTITY) : auto_increment
@Column(name = "username" nullable = false, unique = true, length = 500)
영속성 컨텍스트 (persistence)
객체가 생명이나 공간을 자유롭게 유지하고 이동할 수 있는 객체의 성질
즉 Entity객체를 효율적으로 관리하기 위해 만들어진 공간입니다.
Entity Manager : 영속성 컨텍스트에 접근하여 Entity객체들을 조작하는 객체
Entity Manager는 EntityManagerFactory를 통해 생성하여 사용할 수 있습니다.
EntityManagerFactory는 일반적으로 DB 하나에 하나만 생성되어 애플리케이션이 동작하는 동안 사용됩니다.
EnttiyManagerFactory를 만들려면 DB에 대한 정보를 전달해야 합니다.
EntityManagerFactory emf;
EntityManager em;
@BeforeEach
void setUp() {
emf = Persistence.createEntityManagerFactory("memo");
em = emf.createEntityManager();
}
*@BeforeEach : test의 메서드가 각각 실행하지 전에 먼저 실행합니다.
정보 전달을 위해서는 /resources/META-INF/persistence.xml 파일을 만들어 정보를 넣어둡니다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="memo">
<class>com.sparta.entity.Memo</class>
<properties>
<property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jakarta.persistence.jdbc.user" value="root"/>
<property name="jakarta.persistence.jdbc.password" value="root"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/memo"/>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
</properties>
</persistence-unit>
</persistence>
트랜잭션
데이터베이스 데이터들의 무결성과 정합성을 유지하기 위한 하나의 논리적 개념
데이터들을 안전하게 관리하기 위해 생겨난 개념입니다.
모든 SQL이 성공적으로 수행이 되면 DB에 영구적으로 반영하지만 SQL 중 하나라도 실패한다면 모든 변경을 되돌립니다.
START TRANSACTION; # 트랜잭션을 시작합니다.
INSERT INTO memo (id, username, contents) VALUES (1, 'Robbie', 'Robbie Memo');
INSERT INTO memo (id, username, contents) VALUES (2, 'Robbert', 'Robbert Memo');
SELECT * FROM memo;
COMMIT; # 트랜잭션을 커밋합니다.
SELECT * FROM memo;
commit : 최종적으로 DB에 반영하는 명령어
JPA는 트랜잭션 개념을 통해 Entity를 관리하고 있습니다.
영속성 컨텍스트에 Entity 객체들을 저장했다고 해서 DB에 바로 반영되지 않습니다.
변경이 발생한 Entity 객체들의 정보를 쓰기지연 저장소라는 곳에 전부 보관되고 있다가 마지막에 Commit이 되는 순간 데이터베이스에 변경할 요청을 반영합니다.
@Test
@DisplayName("EntityTransaction 성공 테스트")
void test1() {
EntityTransaction et = em.getTransaction(); // EntityManager 에서 EntityTransaction 을 가져옵니다.
et.begin(); // 트랜잭션을 시작합니다.
try { // DB 작업을 수행합니다.
Memo memo = new Memo(); // 저장할 Entity 객체를 생성합니다.
memo.setId(1L); // 식별자 값을 넣어줍니다.
memo.setUsername("Robbie");
memo.setContents("영속성 컨텍스트와 트랜잭션 이해하기");
em.persist(memo); // EntityManager 사용하여 memo 객체를 영속성 컨텍스트에 저장합니다.
et.commit(); // 오류가 발생하지 않고 정상적으로 수행되었다면 commit 을 호출합니다.
// commit 이 호출되면서 DB 에 수행한 DB 작업들이 반영됩니다.
} catch (Exception ex) {
ex.printStackTrace();
et.rollback(); // DB 작업 중 오류 발생 시 rollback 을 호출합니다.
} finally {
em.close(); // 사용한 EntityManager 를 종료합니다.
}
emf.close(); // 사용한 EntityManagerFactory 를 종료합니다.
}
'WTIL' 카테고리의 다른 글
TIL-21 스프링 특강 5회차 개념 0703 (0) | 2023.07.03 |
---|---|
WIL-6 7주차 WIL (0) | 2023.07.03 |
TIL-19 스프링 특강 3회차 개념 0628 (0) | 2023.06.28 |
TIL-18 스프링 시큐리지 인증 과정 (0) | 2023.06.27 |
TIL-17 스프링 시큐리티 프레임워크 (0) | 2023.06.26 |