[JPA] CRUD 간단한 쿼리 실습해보기

2023. 10. 27. 21:30
728x90

1. pom.xml 과 persistence.xml 파일 설정 (이 부분은 여기서  확인 가능!) 

2. App.java (main) 메인을 작성해놓고 그냥 testcode로 실습하였다. (AppTest.java) 

3. Major 전공 (필드 : id, majorName) / Student 학생정보 (필드: id, studentName, majorid) 클래스 생성

 

간단하게 학생정보 안에 전공 테이블의 전공id값을 넣으려는 것! 

쿼리문으로 짜려면 join으로 선택하여 넣고 빼고 다 해야하는데... 이걸 자동으로 해주다니....!

 

** Major 클래스 생성

1. 테이블 엔티티 생성 : @Entity

2. 프라이머리 키값 설정 : @Id

3. 프라이머리 키 밸류 설정 : 시퀀스로 설정하고 싶다. @GeneratedValue 애너테이션 활용. (관련 자세한 시퀀스 설정은 여기)

4. 컬럼은 id, majorName

5. Getter/Setter 메서드 생성

 

** Student 클래스 생성

1. 똑같이 테이블 엔티티 생성 : @Entity

2. 프라이머리 키값 설정 : @Id

3. 프라이머리 키 밸류 설정 : 시퀀스로 설정하고 싶다. @GeneratedValue 애너테이션 활용. (관련 자세한 시퀀스 설정은 여기)

4. 컬럼은 id, studentName

** 5. 학생 별로 전공정보를 주기 위해서 필드 값을 private Major major;로 주고, @JoinColumn(name = "majorid") 그리고

어떤 관계인지 설정하기 위해서 : @ManyToOne 애너테이션 활용. (여러 명의 학생은 하나의 전공에 속할 수 있다.) 

5. Getter/Setter 메서드 생성 > 그러면 getMajor()과 setMajor(Major major)도 생긴다.

package dev.syntax.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;

@Entity
@SequenceGenerator(
        name="student_seq_gen",
        sequenceName="student_seq", 
        initialValue=1, 
        allocationSize=1)
public class Student {
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_seq_gen")
	private int id;
	
	@Column(nullable = false)
	private String studentName;
	
	@ManyToOne 
	@JoinColumn(name = "majorid")
	private Major major;

	public Student() {
		super();
	}

	public Student(String studentName, Major major) {
		super();
		this.studentName = studentName;
		this.major = major;
	}

	public Student(String studentName) {
		super();
		this.studentName = studentName;
	}

	public Major getMajor() {
		return major;
	}

	public void setMajor(Major major) {
		this.major = major;
	}
// ...
}

 

그러면 실제로 testcode에서 하나씩 실험 해보자~ (계속 클래스 생성하고 해보기 귀찮아서...)

 

** Tip ** 

테스트 시 @BeforeEach, @AfterEach 애너테이션하고 메서드 활용해서 메서드 전과 후에 실행하는 로직을 미리 짜두면 편하다! 

우리는 계속 팩토리와 매니저, 트랜잭션까지 생성을 해줘야 하기 때문에 만들어주고, 끝나면 닫아주는 로직을 썼다. 

class AppTest {
	
	EntityManagerFactory factory;
	EntityManager manager;
	EntityTransaction tx;

	@BeforeEach
	void setUp() {
		factory = Persistence.createEntityManagerFactory("step02");
		manager = factory.createEntityManager();
		tx = manager.getTransaction();
	}

	@AfterEach
	void tearDown() {
		if (manager != null) {
			manager.close();
		}
		if (factory != null) {
			factory.close();
		}
	}
}

이러면 모든 테스트 메소드 실행 전후로 실행이 된다.

 

이제 진짜 쿼리 실습 해보자~~~~!~!~!

 

1. CREATE ! 

1) 트랜잭션 시작

2) 컴공 Major 객체 생성 

3) manager.persist(cs); 로 영속성 컨텍스트에 밀어넣기 

4) 솔하 유신 Student 객체 생성 

5) manager.persist(); 로 영속성 컨텍스트에 밀어넣기

6) tx.commit(); 로 영속성 컨텍스트의 엔티티를 DB로 저장해주기.

	@Test
	void testSave() {
		tx.begin(); 

		// 컴퓨터 공학과 저장
		Major cs = new Major("컴퓨터 공학과"); 
		manager.persist(cs);

		// 학생 2명 생성
		Student jo = new Student("솔하", cs);
		Student kang = new Student("유신", cs);

		manager.persist(jo);
		manager.persist(kang);

		tx.commit();
	}

2. READ ! 

1) 조회 시에는 트랜잭션이 필요하지 않다.

2) manager.find(엔티티클래, 프라이머리키); 로 id를 통해 엔티티 찾기 가능

3) 학생 엔티티로 getMajor()메소드를 통해 전공도 조회 가능 

@Test
	void testRead() {
		// id가 1인 학생 엔티티 조회
			Student s1 = manager.find(Student.class, 1);
		// 해당 학생의 전공 조회
			Major m1 = s1.getMajor();
	}

3. UPDATE !

1) 트랜잭션 시작

2) 학생 조회 (manager.find();)

3) 새로운 전공 추가 (Major 객체 생성) 후 manager.persist(); 잊지 말기

4) 조회한 학생의 전공을 다시 설정 (setMajor()메소드 활용) //이 때 set해준 경우에는 굳이 persist()할 필요가 없다!

5) tx.commit(); 로 영속성 컨텍스트의 엔티티를 DB로 저장해주기.

@Test
	void updateRelation() {
		// 한 명의 학생 조회 후 해당 학생의 전공을 다른 학과로 변경
			tx.begin();
            
			Student s1 = manager.find(Student.class, 1);
			Major m2 = new Major("영어교육과");
			manager.persist(m2);
            
			s1.setMajor(m2);	
            
			tx.commit();
	}

4. DELETE !

1) 트랜잭션 시작

2) 학생 조회 (manager.find(Student.class, 1);)

3) 그 학생의 전공 조회 (manager.find(Major.class, s1.getMajor().getId());)

4) 전공 설정 값을 없애기 null로 설정 (setMajor() 메소드 활용) 

5) manager.remove(m1); 로 전공 정보 삭제 가능. >> 이 땐 영속성 컨텍스트에 밀어넣을 필요가 없다. 영속성 컨텍스트에서 삭제된 상태...(DB에서는 삭제된 상태가 아님)

6) tx.commit(); 로 영속성 컨텍스트의 엔티티를 DB로 저장해주기.

	@Test
	void deleteEntity() {
		// 한 명의 학생 조회 후 해당 학생의 전공을 제적
			tx.begin();
			Student s1 = manager.find(Student.class, 1);
            		Major m1 = manager.find(Major.class, s1.getMajor().getId());

			s1.setMajor(null);
            		manager.remove(m1);
            
			tx.commit();
	}

 

이렇게 하면 기본적인 crud를 다 할 수 있다~~~~!! 우왕~~~~~! 

재밌다 재밌어!!!!!! ^____^

728x90

BELATED ARTICLES

more