본문 바로가기
개발 수업/Spring Boot

[SpringBoot] JPA사용하기

by 오늘 하루s 2023. 8. 22.
728x90
더보기

Day79. 230822

JPA(Java Persitence API)

: 개발자가 직접 SQL을 작성하지 않아도 자동으로 생성해주는 인터페이스 모음. 인터페이스이므로 구현클래스 필요

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa/3.1.1

 

 

build.gradle>

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

build.gradle에 다음을 추가해준다.

 

추가해주면 gradle에서 reload해준다.(동그라미 화살표 표시)

 

application.properties>

#JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update

다음을 추가해준다.

 

 

 

Lombok설치

setting-plugins에서 Lombok을 install해준다.

 

 

 


Answer.java>

package com.mycom.app.answer.entity;

import com.mycom.app.question.entity.Question;
import jakarta.persistence.*;

import java.time.LocalDateTime;

//Question에 대한 대답(table용)을 관련한 entity
@Entity
public class Answer {

    //field
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id; //id(대답pk)
    @Column
    private String content; //content
    @Column
    private LocalDateTime createDate; //create_date

    @ManyToOne
    private Question question;
}

@Entity 어노테이션 추가해주기(jakarta안에 있는 것 import)

@Id, @colum 표시

@ManyToOne

Question하나에 대해  Answer 여러개. 1:다의 관계 (질문 기준)

 

 

 

Question.java>

package com.mycom.app.question.entity;

import com.mycom.app.answer.entity.Answer;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;
import java.util.List;

//question 테이블 관련 데이터를 처리하기 위한 클래스
/*
 */
@Getter
@Setter
@Entity
public class Question {
    //field
    //@Id : pk
    //@GeneratedValue : 1씩 자동증가
    //GenerationType.IDENTITY : 해당 컬럼만의 독립적인 자동증가번호
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;//글번호. 1씩 증가.pk

    //@Column : 컬럼
    @Column(length = 200)
    private String subject;//제목

    @Column(columnDefinition = "TEXT")
    private String content;//내용

    //필드명이 대소문자 섞인 형태는 _, 컬럼명은 전부 소문자로 처리
    @Column
    private LocalDateTime createDate;//작성일

    /*@OneToMany 속성
    mappedBy는 참조 엔티티의 속성명
    CascadeType.REMOVE : 질문을 삭제하면 그에 딸린 대답목록도 같이 삭제
    */
    @OneToMany(mappedBy = "question",cascade = CascadeType.REMOVE)
    private List<Answer> answerList;

    //constructor

    //method
}

@OneToMany

질문 하나에 대한 대답 여러 개

 

 

H2를 실행해보면 ANSWER, QUESTION테이블이 추가된 것을 볼 수 있다.

 

 

필드명이 컬럼명이 되었다.

 

 

 

QuestionRepository.java>

package com.mycom.app.question.repository;

import com.mycom.app.question.entity.Question;
import org.springframework.data.jpa.repository.JpaRepository;

//Repository는 Entity에 의하여 생성된 db에 접근하여 작업하는 여러 메서드들로 구성된 interface이다.
//=>CRUD
//JpaRepository인터페이스를 상속하고 있다.
//<Repository의 대상이 되는 Entity타입,Entity타입의 PK타입>
//여기에서는 <Question,Integer> Repository의 대상이 되는 Question의 PK는 Integer
public interface QuestionRepository extends JpaRepository<Question,Integer> {
}

 

 

 

AnswerRepository.java>

package com.mycom.app.answer.repository;

import com.mycom.app.answer.entity.Answer;
import org.springframework.data.jpa.repository.JpaRepository;

//Repository는 Entity에 의하여 생성된 db에 접근하여 작업하는 여러 메서드들로 구성된 interface이다.
//=>CRUD

//JpaRepository인터페이스를 상속하고 있다.
//<Repository의 대상이 되는 Entity타입,Entity타입의 PK타입>
//여기에서는 <Question,Integer> Repository의 대상이 되는 Answer의 PK는 Integer
public interface AnswerRepository extends JpaRepository<Answer,Integer> {
}

 

 

 

AppApplicationTests>

package com.mycom.app;

import com.mycom.app.question.entity.Question;
import com.mycom.app.question.repository.QuestionRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDateTime;

@SpringBootTest
class AppApplicationTests {
	@Autowired
	private QuestionRepository questionRepository;

	@Test
	void contextLoads() {
	}

	@Test
	void testJpa(){
		//1개의 질문 등록
		Question question = new Question();
		question.setSubject("질문제목1");
		question.setContent("질문내용1");
		question.setCreateDate(LocalDateTime.now());
		questionRepository.save(question);

		//1개의 질문 등록
		Question question2 = new Question();
		question2.setSubject("질문제목2");
		question2.setContent("질문내용2");
		question2.setCreateDate(LocalDateTime.now());
		questionRepository.save(question2);
	}
}

 

AppApplicationTests Run 한 후 AppApplication Run해서 web server를 올려준다.

H2실행 후 select * from question; 쿼리를 실행해주면 결과 값이 나온다.

728x90