실성한 developer

[SPRING] Spring boot에서 MYSQL + JPA + REST API 설정 본문

Study/Spring

[SPRING] Spring boot에서 MYSQL + JPA + REST API 설정

실성한님 2020. 12. 26. 23:51

JPA란?  

Java Persistence API의 약자로 기존 EJB에서 Entity Been을 대체하는 기술이다. JPA의 등장으로 복잡하고 여러 개의 SQL문이 필요 없어졌으며, 개발이 빠른 장점과 비즈니스 로직에 집중으로 객체지향적으로 사용 가능하다. 하지만 잘 못 사용할 경우 데이터 꼬임 등, 끝도 없는 문제가 발생할 수 있다.

REST API란?

REpresentational State Transfer Application Programming Interface 약자로 HTTP프로토콜의 장점인 URL을 이용하여 메서드를 사용으로 업무 구분이 나눠지게 되어 개발에 집중할 수 있다.

환경

Client : window10

DB : Ubuntu 19.10

 

프로젝트 구조

연결 확인까지 최소한의 프로젝트 파일 구조

 

현재 사용중인 라이브러리

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.0-jre</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

테스트할 table 생성

create table TEST_TABLE(
	ID VARCHAR(50) PRIMARY KEY,
    NAME VARCHAR(20),
    AGE INT(6), 
    TEL VARCHAR(40));

테스트할 data insert

insert into TEST_TABLE(ID, NAME, AGE, TEL) values("A123", "홍길동", 10, "01012341234");

테스트 데이터 완성.

application.properties (Mysql Connection)

# Server
server.address=localhost
server.port=8080

# SQL 출력여부
spring.jpa.show-sql=true

# DB 제공되는 고유기능 사용여부
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

# Mysql 사용
spring.jpa.database=mysql

# MySQL JDBC
spring.datasource.url=jdbc:mysql://{DB서버IP}:{DB_PORT}/testdb?characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username={DB계정}
spring.datasource.password={계정 비밀번호}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

show-sql : false로 할 시 SQL문이 로그에 남지 않는다. 확인을 위해 true로 설정

generate-ddl : hibernate.ddl-auto 사용 여부이다. ddl-audo의 validate사용을 위해 true 설정

physical-strategy : 이 설정문이 없을 경우 DB의 Table 이름은 대문자인데 실제로 찾는 값을 소문자를 찾게 된다. 이렇게 되면 다른 값이거나 SqlException을 뱉어낸다. 그래서 대소문자 구분을 해주는 설정을 해주었다.

hibernate.ddl-auto : 

  • create : 기존 table을 지웠다가 새로만듬.
  • create-drop : table을 새로 만들고, lifeCyle이 endPoint 전에 data 지움.
  • update : entity(ex TestTableDto)에 추가된 필드를 테이블에 반영함.
  • validate : boot 실행 시 entity와 DB의 table정보가 맞지 않을 경우 Exception발생

연동에러시 이전글 참고

[Mysql] Mysql 연동시 서버타임존(server time zone) 에러

TestController.java 

package com.bootjpa.test.controller;

import com.bootjpa.test.entity.TestTableDto;
import com.bootjpa.test.repository.TestTableRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@Controller
@RestController
@RequestMapping(path = "/test")
public class TestController {

    @Autowired
    private TestTableRepository testTableRepository;

    public TestController(TestTableRepository testTableRepository) {
        this.testTableRepository = testTableRepository;
    }

    @PostMapping(path = "/all")
    public TestTableDto listAll() {
        Optional<TestTableDto> tests = testTableRepository.findById("A123");
        return tests.get();
    }
}

Been생성과 Repository주입으로 localHost:8080/test/all의 url를 Post 하게 되면 기본으로 제공되는 findById() 메서드를 사용하여 DB에 저장된 low를 불러옴.

TestTableDto.java

package com.bootjpa.test.entity;


import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@Entity
@NoArgsConstructor
@Table(name = "TEST_TABLE", schema = "testdb")
public class TestTableDto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "NAME")
    private String name;

    @Column(name = "AGE")
    private int age;

    @Column(name = "TEL")
    private String tel;
}

lombok사용으로 자동 Getter, Setter생성을 함. @Table의 name은 실제 db의 Table Name이다.

@Id를 사용으로 TEST_TABLE의 KEY로 선언

@Colnumn을 사용하여 DB의 필드를 더욱 명시적으로 표현

TestTableRepository.java

package com.bootjpa.test.repository;

import com.bootjpa.test.entity.TestTableDto;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TestTableRepository extends JpaRepository<TestTableDto, String> {
}

JpaRepository.java

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.data.jpa.repository;

import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;

@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAllById(Iterable<ID> var1);

    <S extends T> List<S> saveAll(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

간단하게 확인을 하기 위해 아무 내용 없어도 상속을 받아 JpaRepository<TableMapping.Type, KEY.Type>에 있는 메서드를 그대로 사용한다.

쿼리 문과 결과 low를 가져온 로그가 찍히게 된다.

'Study > Spring' 카테고리의 다른 글

[ Spring ] STS Mysql Mybatis 연동  (1) 2020.12.26
Comments