본문 바로가기
국비 교육/SQL(Oracle)

[자바 - 오라클] (잊지 않으려고 적어둠)JPA 연결 - 1

by 육츠 2024. 2. 13.
Contents 접기

* Spring Tool Suite 4 = STS


STS 에서 FILE - NEW -  SPRING STARTER PROJECT 클릭
 

위 창에서 조건과 맞는 옵션인지 확인 

검색을 통해 위에 3가지를 선택하여 프로젝트를 생성한다.

생성을 하게 되면 pakage Explorer 에서 아래와 같이 [boot] 라는 표시가 되어있는 프로젝트가 생성된다.

자동적으로 생겨나는 파일들 중 META-INF (이름 다르면 안된다. ) 안에 persistence.xml 넣고
바깥에 히스토리를 위한 logback.xml 도 같이 넣어놓는다.

 

lombok.jar 에 정상적으로 되어있다면 아래와 같이 필요한 것을 @ (애노테이션) 을 통해 적어두고 import 하기

package com.kdigital.jpa02.entity;

import java.time.LocalDateTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;


@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
@Entity
@Table(name="myuser")

public class User {
	
	@Id
	private String email;
	private String username;
	
	@Column(name = "join_date")
	private LocalDateTime joinDate;
	// LocalDate 도 가능
	

}
종류 의미
@NoArgsConstructor 기본 생성자
@AllArgsConstructor 오버로딩 생성자 (모든 아규먼트)
@Setter , @Getter, @ToString  
@Entity 테이블과 매핑할 클래스는 붙여야 한다.
@Table(name="myuser") SQLdeveloper 와 테이블 이름이 다를때 설정
@Id
PK 표시
@Column(name = "join_date")
SQLdeveloper 와 컬럼 이름이 다를때 설

 

만약 롬복이 잘 되어있지 않다면 직접 아래 코드를 생성 시켜주어야 한다.

protected User() { }

public User(String email, String name, LocalDateTime createDate) {
this.email = email;
this.name = name;
this.createDate = createDate;
}

public String getEmail() {
return email;
}
public String getName() {
return name;
}
public LocalDateTime getCreateDate() {
return createDate;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User[email="+ email

 

package com.kdigital.jpa02;

import java.time.LocalDateTime;

import com.kdigital.jpa02.entity.User;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;

public class MainJPA {

	public static void main(String[] args) {
		// 설정값을 읽어옴
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpastudy");
		
		EntityManager manager = factory.createEntityManager();
		
		EntityTransaction tx = manager.getTransaction();
		
		try {
			tx.begin(); // 트랜잭션 시작 
			
			User user = new User("aaa@aaa.com", "홍길동", LocalDateTime.now()); 
			manager.persist(user); // insert 시켜주는 메소드
			
			
			
			tx.commit(); // 커밋이 되면종료 된다.
			System.out.println("저장 완료");
			
			
		} catch(Exception e) {
			tx.rollback();
			
		} finally {
			manager.close();
		}
		
		// 리소스 정리
		factory.close();
		
	}
	

}
코드 의미
EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpabegin"); persistence.xml의 <persistence-unit name="persistence unit명 " > 값을 읽어 EntityManagerFactory생성
(DB 연동을 위한 설정값을 읽어옴)
EntityManager entityManager = factory.createEntityManager(); EntityManagerFactory 객체를 통해 EntityManager 생성 (DB연동 처리)
EntityTransaction tx = entityManager.getTransaction(); EntityManager 객체를 통해 EntityTransaction 객체 생성
try {

   
     transaction.begin();
    User user = new User("user1@user.com", "user", LocalDateTime.now());
    
    entityManager.persist(user); 
    
    transaction.commit();

}

begin  = transaction 시작


* 데이터 매핑 및 transaction 종료

 - entityManager.persist(user);
persist()메소드를 이용하여 DB에 객체 저장


-  transaction.commit();
실제 insert는 commit() 시 실행 (식별자를 직접 설정하는 경우)
factory.close(); 리소스 정리 (자원 반납)

 

만든 sql문에서 SELECT 문을 사용하여 데이터베이스에 잘 연동 되었는지 확인 가능하다.

-- JPA-02 와 연동하는 테이블의 생성

DROP TABLE myuser;
CREATE TABLE myuser(
    email varchar2(50) primary key
    , username varchar2(50) not null
    , join_date date default sysdate
);

select * from myuser;

 

예제 2

-- JPA-03 rhk 연동하는 테이블의 생성

DROP TABLE friend;
CREATE TABLE friend(
    email varchar2(50) primary key
    , username varchar2(50) not null
    , birthday date
    , age number(3)
);

select * from friend;

 

lombok.jar 사용 대신 직접 생성하여 연다.

package com.kdigital.jpa03.entity;

import java.time.LocalDate;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;


@Entity
public class Friend {
	@Id
	private String email;
	private String username;
	private LocalDate birthday;
	private int age;
	
	public Friend() {
		super();
	}
	
	public Friend(String email, String username, LocalDate birthday, int age) {
		super();
		this.email = email;
		this.username = username;
		this.birthday = birthday;
		this.age = age;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public LocalDate getBirthday() {
		return birthday;
	}

	public void setBirthday(LocalDate birthday) {
		this.birthday = birthday;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
}

 

삽입

package com.kdigital.jpa03;

import java.time.LocalDate;

import com.kdigital.jpa03.entity.Friend;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;

public class FriendInsert {

	public static void main(String[] args) {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpastudy");
		
		EntityManager manager = factory.createEntityManager();
		
		EntityTransaction tx = manager.getTransaction();
		
		try {
			tx.begin();
			
			for (int i =1; i<=10; ++i) {
				Friend friend = new Friend("f" +i + "@naver.com","이름_"+i,LocalDate.of(1999, 01, 20), 26);
				manager.persist(friend);
				
			}
			
			// Member member = new Member("f1@naver.com","손오공",LocalDate.of(1999, 01, 20), 26);
			//manager.persist(member);
		
			tx.commit();
			System.out.println("저장 완료");
		}catch(Exception e) {
			tx.rollback();
			e.printStackTrace();
		}finally {
			manager.close();
			
		}
		factory.close();
		
	}

}

 

삭제

package com.kdigital.jpa03;

import java.time.LocalDate;

import com.kdigital.jpa03.entity.Friend;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;

public class FriendDelete {

	public static void main(String[] args) {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpastudy");
		
		EntityManager manager = factory.createEntityManager();
		
		EntityTransaction tx = manager.getTransaction();
		
		try {
			tx.begin();
			
			// 삭제하려고 하는 정보가 있는지 확인 후 삭제
			Friend friend = manager.find(Friend.class,"f10@naver.com");
			// pk를 넣어서 전달되는 값
			
			if(friend == null) {
				System.out.println("친구 정보 없음");
			} else {
				manager.remove(friend);
			}
			
			tx.commit();
			System.out.println("삭제 완료");
		}catch(Exception e) {
			tx.rollback();
			e.printStackTrace();
		}finally {
			manager.close();
			
		}
		factory.close();
		
	}

}

 

수정

package com.kdigital.jpa03;

import java.time.LocalDate;

import com.kdigital.jpa03.entity.Friend;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;

public class FriendUpdate {

	public static void main(String[] args) {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpastudy");
		
		EntityManager manager = factory.createEntityManager();
		
		EntityTransaction tx = manager.getTransaction();
		
		try {
			tx.begin();
			
			// 삭제하려고 하는 정보가 있는지 확인 후 
			Friend friend = manager.find(Friend.class,"f1@naver.com");
			// pk를 넣어서 전달되는 값
			
			if(friend == null) {
				System.out.println("친구 정보 없음");
			} else {
				friend.setUsername("전우치");
				friend.setBirthday(LocalDate.of(1990, 12, 23));
				System.out.println("변경 완료");
			}
			
			tx.commit();
		}catch(Exception e) {
			tx.rollback();
			e.printStackTrace();
		}finally {
			manager.close();
			
		}
		factory.close();
		
	}

}

 

조회

- 여러개를 조회하는 것은 JPA로 되지 않는다.

package com.kdigital.jpa03;

import java.time.LocalDate;

import com.kdigital.jpa03.entity.Friend;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;

public class FriendSelect {

	public static void main(String[] args) {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpastudy");
		
		EntityManager manager = factory.createEntityManager();
		
		EntityTransaction tx = manager.getTransaction();
		
		try {
			tx.begin();
			
			// 삭제하려고 하는 정보가 있는지 확인 후 삭제
			Friend friend = manager.find(Friend.class,"f9@naver.com");
			// pk를 넣어서 전달되는 값
			
			if(friend == null) {
				System.out.println("친구 정보 없음");
			} else {
				System.out.println(friend);
			}
			
			tx.commit();
		}catch(Exception e) {
			tx.rollback();
			e.printStackTrace();
		}finally {
			manager.close();
			
		}
		factory.close();
		
	}

}