[JPA] JPA란? JPA 사용법 알아보기

728x90

JPA에 대한 간단한 포스팅을 해보겠습니다.

공부를 해서 아는 내용이 추가될수록 이 글에도 추가적으로 글을 수정하도록 하겠습니다.

 

JPA란?

JPA를 사용하기 위해서는 기본적인 데이터베이스 쿼리를 사용할 수 있으면 좋습니다. 

기본적으로 DB를 핸들링 하기 위해서는, SQL쿼리를 통해서 할 수 있습니다. 

그러나 ORM(object relational mapping)을 사용하면은 자바 문법을 이용하여 DB를 핸들링 할 수 있습니다.

즉 ORM을 이용하면 개발자가 쿼리를 작성하지 않고, DB의 데이터를 핸들링할 수 있다는 것이다.

 

- ORM

기존 SQL을 바탕으로 ORM을 활용할 수 가 있습니다.

예를들어 

num id pass email
1 abc 1234 abc@gmail.com
2 def 5678 def@gmail.com
3 ghi 9012 ghi@gmail.com

이런 테이블이 있습니다.

여기서 만약 전체 데이터를 조회하기 위한 쿼리를 작성하면은

select * from 테이블이름

을 사용하여 조회를 할 수 가 있습니다. 

 

그러나 자바의 ORM인 JPA를 사용하면은

TableEx t1 = new TableEx();
t1.find();

find() 메소드 하나로 조회를 할 수가 있습니다.

 

즉 직접적인 쿼리를 작성하지 않고도 DB에 있는 데이터를 조회할 수 있는 장점이 있습니다. 

즉 다시말하면 SQL쿼리를 몰라도 ORM사용법을 알면은 DB 데이터를 핸들링 할 수가 있다는 장점이 있습니다.

 

위 코드에서 TableEx는 자바 클래스 이고, 이건 DB에서는 테이블 이름을 의미 합니다.

 

위처럼 데이터를 관리하는데 사용하는 ORM 클래스를 엔티티(Entity) 라고 합니다.

나중에 DTO를 관리하는 클래스를 만들때 @Entity 어노테이션을 선언하여 사용합니다.

 

그리고 다른 ORM을 장점은 

어느 한 쿼리를 사용하여 데이터 출력을 하려 하면은, 여러 개발자가 쿼리를 다르게 짤 수도 있습니다.

그래서 유지보수나, 가독성 측면에서 좋다고 말을 할 수 가없죠.

그러나 JPA를 사용하면은 메소드가 다 통일되기 때문에, 일관되 코드를 유지할 수가 있어 프로그램 유지보수에

편리성을 제공하고, 오류 발생률도 줄일 수 있다고 생각합니다. 

 

즉 JPA란 (Java Persistence API) 을 줄임말로 자바에서 데이터베이스를 처리하는 기술 입니다.

JPA는 인터페이스 이다.
따라서 인터페이스를 구현하는 실제 클래스가 필요합니다.
JPA를 구현한 대표적인 실제 클래스는 Hibernate가 있습니다. 
그래서 나중에 JPA를 사용시에 Hibernate를 implements를 받습니다.

 

다음으로는 JPA 사용법을 알아보도록 하겠습니다.

 

엔티티(Entity) 설계

엔티티는 DB 테이블과 매핑되는 자바 클래스이름을 말합니다.

간단하게 코드를 통해서 어떻게 설계하는 지 보여드리겠습니다.

 

기본적으로 엔티티를 설계를 하기전에 프로젝트 설정부터 해놔야 합니다.

 

프로젝트이름Application.java

package spring.mvc.main;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@ComponentScan({"spring.mvc.*"})
@EntityScan("spring.mvc.*")
@EnableJpaRepositories("spring.mvc.*")
public class SpringBootExApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootExApplication.class, args);
    }

}

프로젝트 생성시 생기는 main에 위 작업을 해줘야 합니다.

그래야 bean이 자동으로 entity를 찾기 때문이죠

 

application.yml

server:
  port: 9001

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/docs?serverTimezone=Asia/Seoul
    username: 본인 아이디
    password: 본인 비번

  jpa:
    hibernate:
      ddl-auto: update  # create ?? update? ?? ??
      format_sql : true
      show_sql : true
    generate-ddl: true
    show-sql: true
    database: mysql
    database-platform: org.hibernate.dialect.MySQLDialect

 

bulid.gradle

dependencies {
    //이거 꼭 있어야함
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    // 이것도 꼭 있어야함
    runtimeOnly 'com.mysql:mysql-connector-j'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

위 두개 설정을 한 후에 진행을 할 수 있습니다.

 

바로 코드로 들어가서 엔티티 작성을 해보겠습니다.

package com.project.dto;

import java.sql.Timestamp;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Data;

@Data
@Entity
public class Question {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	
	@Column(length = 200)
	private String subject;
	
	@Column(columnDefinition = "TEXT")
	private String content;
	
	private Timestamp wirteday;
}

위 코드를 작성하고 실행하면은 내가 create 쿼리를 작성하지 않아도, 바로 DB에 테이블과 컬럼이 생성이 됩니다.

 

엔티티로 만들기 위한 @Entity 어노테이션을 적용하여 JPA가 엔티티라고 인식한다.

그리고 lombok을 @Data 어노테이션을 통해서 getter,setter,toStirng을 해줍니다.

 

Primary key => @Id 어노테이션을 통해서 기본 키 설정

@Generatevalue => Auto_Increment랑 같다. 자동으로 1씩 증가시킨다는 뜻 이다. 

  • 여기서 GenerationType.IDENTITY는 고유번호를 생성하여 독립적인 시퀀스를 생성시킨다는 뜻.

@column => 생성할 컬럼 설정

  • length를 통하여 sql문에서 varchar(200)을 사용하는 것처럼 글자수 제한을 한다.
  • columnDefinition는 컬럼의 속성을 정의할때 사용한다. 위처럼 TEXT라고 하면은 글자 수                                            제한없이 사용할 수 있다고 의미하는 것입니다.

 

그리고 한 가지 알아둬야 할게 우리가 코드에서 변수(=컬럼) 이름을 대문자로 하여도 DB가 생성 될 때는

모두 소문자로 생성이 됩니다.

 

 

다음 엔티티 구성 입니다.

package com.project.dto;
import java.sql.Timestamp;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

import jakarta.persistence.ManyToOne;
import lombok.Data;

@Data
@Entity
public class Answer {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

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

	private Timestamp writeday;

	@ManyToOne
	private Question question;
}

요번 엔티티에는 다른게 있습니다

바로 @ManyToOne이라는 어노테이션 입니다.

이게 뭘까요?

이 어노테이션은 Many(많고) One(하나) 즉 Answer 테이블과 Question 테이블은 N:1 관계 이므로

그걸 명시하고 연결하기 위해서 사용하는 어노테이션 입니다.

즉 Quesion 테이블은 질문 테이블이기 때문에 질문하는 글을 올리면은 딱 1번만 올릴 수 있습니다.

그러나  Ansewr은 답변 즉 여러 사람이 답변을 달 수 있는 구조이기 때문에 n:1 구조라고 할 수 있습니다.

간단하게 말하면 부모 자식 관계라고도 설명을 할 수 있습니다.
부모(Quesion) 자식(Answer)
? => 부모가 없으면 자식이 없기 때문에, Quesion이 없으면 Answer도 없기 때문입니다.

 

반대로 N:1이 아닌, 1:N 관계라면은 반대로 @OneToMany 어노테이션을 사용하면 된다. 

 

이상 포스팅 마치겠습니다. 나중에 공부를 더하고 추가하도록 하겠습니다.

 

 

ref : https://wikidocs.net/161165

728x90