일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 리눅스에서 이클립스
- 우분투 후기
- linux eclips
- debian9 eclips
- 우분투18.04
- server.xml
- 재정렬
- JDK
- 이클립스
- openjdk
- debian9
- 리눅스
- ubuntu
- debian
- jre
- 자바
- jsp
- eclips install
- MySQL
- Servlet
- 18.04
- java
- 데비안9
- ubuntu 18.04
- 데비안 이클립스
- eclips
- 리눅스 이클립스
- 우분투 이클립스
- Linux
- 우분투 사용
- Today
- Total
실성한 developer
[SPRING] Spring boot에서 MYSQL + JPA + REST API 설정 본문
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 |
---|