민우의 코딩일지
article thumbnail

 

 

 

 

 

JPA란 무엇일까

JPA(Java Persistence API)는 자바에서 데이터베이스를 편하게 사용할 수 있도록 도와주는 역할을한다.

그림으로 간단하게 표현하면 요런 느낌 .. !

 

 

주로 사용하는 저장·조회·변경·삭제는 물론,  검색과 페이징까지 간단히 해결할 수 있도록 다양한 기능을 제공한다.

CrudRepository(저장·조회·변경·삭제) + PagingAndSoringRepository(검색과 페이징)  =  JpaRepository

 

 

 

잘 정리된 JpaRepository 인터페이스 상속 관계도

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

REST API에 대해서

REST API(Representational State Transfer ApplicationProgrammingInterface)의 약자인데.. 이걸 외우진 않는다

풀네임은 뭔지 기억 안나서, 필요할때 매번 구글에 REST API 라고 검색해서 찾아보는 편 (근데 풀네임이 필요한 경우가 없다)

 

REST API를 간단히 설명하기위해,  물류창고를 예시로 들어볼 수 있다.

어떤 기준으로 물건들을 각 창고에 보관하거나, 입·출고하는것과 같이 데이터를 주소단위로 보관하는것과 같다.

 

 

그리고 REST API 사용할땐 입·출고라는 용어 대신,  HTTP Method라는걸 이용한다.

REST API에서 사용되는 HTTP Method 는 5가지가 있다.

GET, POST, PATCH, PUT, DELETE

 

HTTP Method 5가지 각각을 물류창고와 비유해서 정리하면 다음과 같다.
1️⃣ GET
  물류창고에서 원하는 물건을 가져오는 출고와 같은 행위
2️⃣ POST
  물류창고에 물건을 보관하는 행위
3️⃣ PATCH
  물류창고에 물건중 일부를 바꾸는 행위
4️⃣ PUT
  물류창고에 물건을 모 ~두 바꾸는 행위
5️⃣ DELETE
  물류창고에있던 물건을 버리는 행위

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

JPA 사용하기위한 세팅

망치질할때 못과 망치가 필요한것처럼,  JPA를 사용하기위해서 다음과 같은 준비가 필요하다.

 

 

프로젝트 생성시

MySQL 기준,  디펜던시(종속성)을 다음과 같이 선택해서 프로젝트를 만들어주었다. 

Spring Web, Spring Data JPA , MySQL Driver(혹은 Orclae Driver), Lombok, Spring Boot DevTools

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

스프링부트 프로젝트 생성은 Spring Initializr 사이트에서 만드는 방법도 있다.
🔗 URL : https://start.spring.io/

 

 

 

 

 

프로젝트 생성후

application.properties 파일을 열고,  작성해주기

 

 

 

# MySql Setting 
spring.datasource.url=jdbc:mysql://localhost:3306/본인이 사용중인 스키마 이름?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234

# JPA Setting
spring.jpa.hibernate.ddl-auto=update

# Log Setting
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.orm.jdbc.bind=trace
logging.level.org.hibernate.SQL=debug
2번째 라인에 있는 spring.datasource.url는,  본인이 사용중인 스키마 이름으로 수정해서 사용하기 .. !

 

 

만약,  MySQL대신  Oracle Driver 을 사용해서 프로젝트 생성했다면 ..

더보기

 

# Port Setting
#server.port = 8080  # 오라클이 이미  8080포트 쓰고있어서, 에러 날 수 있으니 다른 숫자로 바꿔줘야할 수 있음.(암거나)

# Oralce Setting
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver # 오라클 디펜던시 필요
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe # 맨 마지막에 문자는 교육용은 xe, 아니면 orcl로 작성
spring.datasource.username=root spring.datasource.password=1234

# JPA Setting
JPA Setting spring.jpa.hibernate.ddl-auto=update

# Log Setting
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.orm.jdbc.bind=trace
logging.level.org.hibernate.SQL=debug

 

 

 

 

 

 

 

패키지 및 파일들 만들어주기

test 패키지를 만들고,  그 안에  Controller, Service, DTO, Entity, Repository 파일들을 만들어주었다.

참고로 Repository 파일은 클래스가 아닌 인터페이스 파일로 만들어야한다.

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

Controller 작성

더보기
package com.example.jpastudy01.test;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class TestController {
    private final TestService testService;


    @PostMapping("create")
    public String create(@RequestBody TestDTO dto) {
        testService.create(dto);
        log.info("@@@ save ### => " + dto);
        return "save test";
    }

    @GetMapping("/read")
    public TestDTO read(@RequestBody TestDTO dto) {
        log.info("@@@ read ### => " + dto);
        return testService.read(dto);
    }

    @PatchMapping("/update")
    public TestDTO update(@RequestBody TestDTO dto) {
        log.info("@@@ update ### => " + dto);
        return testService.update(dto);
    }

    @DeleteMapping("/delete")
    public String delete(TestDTO dto) {
        log.info("@@@ delete ### => " + dto);
        testService.delete(dto);
        return "delete test";
    }

}

 

Service 작성

더보기
package com.example.jpastudy01.test;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class TestService {
    private final TestRepository testRepository;

    public void create(TestDTO dto) {
        testRepository.save(dto.toEntity());
    }

    public TestDTO read(TestDTO dto) {
        return testRepository.findById(dto.getId())
                             .orElseThrow()
                             .toDTO();
    }

    public TestDTO update(TestDTO dto) {
        TestEntity update = TestEntity.builder()
                                      .id(dto.getId())
                                      .title(dto.getTitle())
                                      .content(dto.getContent())
                                      .build();
        return testRepository.save(update).toDTO();
    }

    public void delete(TestDTO dto) {
        testRepository.deleteById(dto.getId());
    }

}

 

DTO 작성

더보기
package com.example.jpastudy01.test;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestDTO {

    private int id;
    private String title;
    private String content;

    public TestEntity toEntity() {
        return TestEntity.builder()
                         .title( this.title )
                         .content( this.content)
                         .build();
    }
}

 

Entity 작성

더보기
package com.example.jpastudy01.test;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "test")
public class TestEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column private String title;
    @Column private String content;

    public TestDTO toDTO() {
        return TestDTO.builder()
                      .id(this.id)
                      .title(this.title)
                      .content(this.content)
                      .build();
    }
}

 

 

Repository 작성

더보기
package com.example.jpastudy01.test;

import org.springframework.data.jpa.repository.JpaRepository;

public interface TestRepository extends JpaRepository<TestEntity, Integer> {

}

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

JPA 사용해보기 (With. REST API)

구글 크롬의 확장 플러그인 Talend API 를 사용해서 테스트를 해보았다.

혹은 포스트맨(Postman)이라는 프로그램으로 테스트하는 방법도 있다.

 

 

각 매핑된 주소마다 정해진 동작이 잘 되는 모습을 확인할 수 있다 👏👏

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

깃허브

 

 

GitHub - ko0or/JPAstudy01: https://m1nwoo.tistory.com/9

https://m1nwoo.tistory.com/9. Contribute to ko0or/JPAstudy01 development by creating an account on GitHub.

github.com

application.properties 파일에서 스키마 이름을 본인것으로 수정후 실행해주어야한다.