java 스프링부트 ( spring boot ) / JPA ( 1 )

김동명·2022년 12월 1일
0

스프링부트

목록 보기
11/19

프로젝트 설정

  • application.properties

#port
server.port=9090

#encoding
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true
server.servlet.encoding.enabled=true

  • 계정 생성
sqlplus

create user springjpa identified by springjpa;

grant connect, resource to springjpa;

  • 디비버
Database : XE
username = springjpa
password = springjpa
  • resources > META-INF 폴더 생성 > persistence.xml 생성
    • hibernate.hbm2ddl.auto 옵션
      • 데이터베이스 스키마 자동생성 옵션
      • create : 기존 테이블 삭제 후 다시 생성 ( drop + create )
      • create-drop : create와 같으니 종료시점에 테이블 drop
      • update : 변경분만 반영
      • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
      • none : 사용하지 않음
<?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="hello">
      <properties>
         <!-- 필수 속성 -->
         <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
         <property name="javax.persistence.jdbc.user" value="springjpa" />
         <property name="javax.persistence.jdbc.password" value="springjpa" />
         <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe" />
         <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
		
        <!-- 테이블 생성 옵션 ( 필요할 때만 사용 ) -->
		<property name="hibernate.hbm2ddl.auto" value="create"/>
		
         <!-- 옵션 -->
         <!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
         <property name="hibernate.show_sql" value="true" />
         <!-- SQL 출력 시 보기 쉽게 정렬 -->
         <property name="hibernate.format_sql" value="true" />
         <!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
         <property name="hibernate.use_sql_comments" value="true" />
      </properties>
   </persistence-unit>
</persistence>



ㅇ 개념 정리

- ORM이란

  • Object-relational mampping
  • RDB와 객체를 각각 설계
  • ORM Framework가 중간에서 mapping
  • 어플리케이션 class와 RDB의 테이블을 연결해주는 것

장점

- SQL문이 아닌 Method를 통해 DB를 조작 할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중 가능
- 선언문, 할당 등의 코드가 줄어들고, 각종 객체에 대한 코드는 별도 작성하여 코드의 가독성이 높음
- 객체지향적인 코드 작성이 가능하기 때문에 생산성이 증가
- 매핑 정보가 class로 명시되기 때문에, ERD 의존도를 낮출 수 있다.
- 데이터베이스가 바뀌어도 쿼리를 수정할 필요가 없다. 유지보수 및 리팩토링에 유리

단점

- 프로젝트 설계가 잘못 된 경우, 속도 저하나 일관성을 무너뜨리는 문제점 발생
- 복잡하고 비즈니스 로직에 종속적인 쿼리의 경우 속도를 위해 별도 튜닝이 필요하기 때문에 결국 SQL문을 써야 할 수 있다.

- JPA

  • Java Persistence API
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 자바 진영의 ORM 기술 표준
  • JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하지 않아도 된다.
  • JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를 자동으로 Mapping 해준다.
  • JPA는 특정 데이터베이스에 종속되지 않는다
    -> 각각의 데이터 베이스가 제공하는 SQL문법과 함수는 조금씩 다른데 이를 데이터베이스 방언이라고 한다.
    -> JPA는 메서드 수정만으로 데이터베이스가 바뀌더라도 쉽게 수정 할 수 있다.

- JPQL

  • JPA를 사용하면 객체 중심으로 개발
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • JPQL: 객체를 대상으로 쿼리 작성



시작

1. 기본

1-1. 회원 등록 ( 테이블 create , 데이터 insert )

  • Member.java 생성
  • @Entity : JPA가 관리할 객체
  • @Id : 데이터베이스 PK와 매핑
@Entity
@Getter @Setter
public class Member {

	@Id
	private Long id;
	private String name;
    
}    

-> create table Member( id number primary key, name varchar(200) };


  • JpaMain.java 생성
public class JpaMain {

	public static void main(String[] args) {
			
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
		EntityManager em = emf.createEntityManager();
        
        // Transaction 발생
		EntityTransaction tx = em.getTransaction();
        tx.begin();
        
        try {
            Member member = new Member();

            // 데이터 추가 ( 확인용 )
            member.setId(1L);
            member.setName("userA");

            // persist: DB에 저장
            em.persist(member);

            tx.commit();
        } catch (Exception e) {
			tx.rollback();
		} finally {
			em.close();
			emf.close();		
		}
	}        
}        

  • 콘솔

    • 테이블 생성옵션 ( 테이블 드랍 )

    • 테이블 생성옵션 ( 테이블 생성 )

    • 인서트




1-2. 회원 조회

  • JpaMain.java 수정
...
			Member findMember = em.find(Member.class, 1L);
...



1-3. 회원 수정

  • JpaMain.java 수정
...
			findMember.setName("UpdateUser");
...



1-4. 회원 삭제

  • JpaMain.java 수정
...
			em.remove(findMember);
...



2. JPQL

JPA는 쿼리를 짤 때 Table을 대상으로 쿼리를 작성하지 않고,
member 객체를 통해서 쿼리를 작성한다.

2-1. 기본

  • JpaMain.java 수정
...
		try {
    
  			List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
			for(Member member : result) {
				System.out.println("member.name = " + member.getName());
			}            
...

  • 콘솔창 출력



2-2. 페이징 처리

  • JpaMain.java 수정
...
		try {
			List<Member> result = em.createQuery("select m from Member as m", Member.class)
					.setFirstResult(5)		// 5번
					.setMaxResults(10)		// 10개 가져오기
					.getResultList();

			for(Member member : result) {
			System.out.println("member.name = " + member.getName());
			}          
...

  • 콘솔창 출력

-> java 스프링부트 ( spring boot ) / JPA ( 2 ) 영속성 컨텍스트 계속

profile
코딩공부

0개의 댓글