spring-boot
스프링 부트 + 스프링 데이터 JPA
수색…
소개
Spring Boot를 사용하면 최소한의 번거 로움없이 스프링 기반의 프로덕션 수준의 응용 프로그램과 서비스를 쉽게 만들 수 있습니다. 컨벤션보다 규칙을 선호합니다.
Spring Data JPA 는 대규모 Spring Data 제품군의 일부로 JPA 기반 저장소를 쉽게 구현할 수있게 해줍니다. 데이터 액세스 기술을 사용하는 앱을보다 쉽게 만들 수 있습니다.
비고
특수 효과
@Repository
: 주석이 달린 클래스가 객체 컬렉션을 에뮬레이트하는 저장, 검색 및 검색 동작을 캡슐화하기위한 메커니즘 인 "리포지토리"임을 나타냅니다. "데이터 액세스 개체"와 같은 전통적인 J2EE 패턴을 구현하는 팀은 DAO 클래스에도이 스테레오 타입을 적용 할 수 있습니다. 그러나 데이터 액세스 개체와 DDD 스타일 리포지토리 간의 차이점을 이해해야합니다. 이 주석은 범용 스테레오 타입이며 개별 팀은 의미를 좁히고 적절하게 사용할 수 있습니다.
@RestController
: @Controller
와 @ResponseBody.Types
주석이 붙은 편의 주석은 @RequestMapping
메서드가 @ResponseBody
의미를 기본적으로 가정하는 컨트롤러로 처리됩니다.
@Service
: 주석 된 클래스가 "서비스"(예 : 비즈니스 서비스 외관)임을 나타냅니다. 이 주석은 @Component
의 전문화 역할을하므로 클래스 패스 스캐닝을 통해 구현 클래스를 자동 감지 할 수 있습니다.
@SpringBootApplication
: 많은 Spring Boot 개발자들은 항상 @Configuration
, @EnableAutoConfiguration
및 @ComponentScan
주해 된 메인 클래스를 가지고 있습니다. 이러한 주석은 함께 사용되는 빈도가 @SpringBootApplication
때문에 (특히 위의 베스트 프랙티스를 따르는 경우), Spring Boot는 편리한 @SpringBootApplication
대안을 제공합니다.
@Entity
: 클래스가 엔티티임을 지정합니다. 이 주석은 엔티티 클래스에 적용됩니다.
공식 문서
Pivotal Software는 Spring Framework에 관한 매우 광범위한 문서를 제공했으며, 다음에서 찾을 수 있습니다.
스프링 부트 및 스프링 데이터 JPA 통합 기본 예제
POJO를 데이터베이스에 저장하는 애플리케이션을 빌드 할 것입니다. 이 애플리케이션은 Spring Data JPA를 사용하여 관계형 데이터베이스에 데이터를 저장하고 검색합니다. 가장 강력한 기능은 런타임에 저장소 인터페이스에서 저장소 구현을 자동으로 생성하는 기능입니다.
메인 클래스
package org.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
main()
메소드는 Spring Boot의 SpringApplication.run()
메소드를 사용하여 애플리케이션을 시작한다. 한 줄의 XML이 없다는 것을 알아 두십시오. web.xml 파일도 없습니다. 이 웹 응용 프로그램은 100 % 순수 자바이며 배관이나 인프라 구성을 다룰 필요가 없습니다.
엔티티 클래스
package org.springboot.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Greeting {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String text;
public Greeting() {
super();
}
public Greeting(String text) {
super();
this.text = text;
}
/* In this example, the typical getters and setters have been left out for brevity. */
}
여기에는 두 개의 속성, id
및 text
가있는 Greeting
클래스가 있습니다. 또한 두 개의 생성자가 있습니다. 기본 생성자는 JPA를 위해서만 존재합니다. 직접 사용하지 않으므로 protected
으로 지정할 수 있습니다. 다른 생성자는 데이터베이스에 저장할 Greeting
인스턴스를 만드는 데 사용할 생성자입니다.
Greeting
클래스는 @Entity
로 주석 처리되어 JPA 엔티티임을 나타냅니다. @Table
어노테이션이 없으면이 엔티티가 'Greeting'이라는 테이블에 매핑된다고 가정합니다.
Greeting의 id
속성은 @Id
로 주석 처리되므로 JPA @Id
객체의 ID로 인식합니다. id
속성은 또한 @GeneratedValue
로 주석 처리되어 ID가 자동으로 생성되어야 함을 나타냅니다.
다른 속성 인 text
에는 주석이 없습니다. 속성과 동일한 이름을 공유하는 열에 매핑되는 것으로 가정합니다.
일시적인 속성
위와 비슷한 엔티티 클래스에서 우리는 데이터베이스에 유지되기를 원하지 않는 속성을 가질 수도 있고 데이터베이스의 열로 생성 된 속성을 가질 수도 있습니다. 왜냐하면 런타임에 설정하고 응용 프로그램에서 사용하기를 원하기 때문일 것입니다. 따라서 우리는 @Transient 어노테이션으로 어노테이션 된 그 속성을 가질 수 있습니다.
package org.springboot.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;
@Entity
public class Greeting {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String text;
@Transient
private String textInSomeLanguage;
public Greeting() {
super();
}
public Greeting(String text) {
super();
this.text = text;
this.textInSomeLanguage = getTextTranslationInSpecifiedLanguage(text);
}
/* In this example, the typical getters and setters have been left out for brevity. */
}
여기에는 현재 Greeting 클래스가 있으며, 런타임에 초기화되고 사용할 수 있으며 데이터베이스에 유지되지 않는 일시적인 속성 textInSomeLanguage
가 있습니다.
DAO 클래스
package org.springboot.repository;
import org.springboot.model.Greeting;
import org.springframework.data.repository.CrudRepository;
public interface GreetingRepository extends CrudRepository<Greeting, Long> {
List<Greeting> findByText(String text);
}
GreetingRepository
는 CrudRepository
인터페이스를 확장합니다. Greeting
및 Long
과 함께 작동하는 엔티티 및 ID 유형은 CrudRepository
의 일반 매개 변수에 CrudRepository
됩니다. CrudRepository
를 확장함으로써 GreetingRepository
는 Greeting
엔티티를 저장, 삭제 및 검색하는 방법을 포함하여 Greeting
지속성을 사용하는 몇 가지 방법을 상속받습니다.
CrudRepository
, PagingAndSortingRepository
, JpaRepository
비교는 이 토론 을 참조하십시오.
스프링 데이터 JPA는 메소드 메쏘드를 간단히 선언함으로써 다른 쿼리 메소드를 정의 할 수도있다. GreetingRepository
의 경우, 이것은 findByText()
메소드로 표시됩니다.
일반적인 Java 애플리케이션에서는 GreetingRepository
를 구현하는 클래스를 작성해야합니다. 그러나 이것이 Spring Data JPA를 강력하게 만드는 이유입니다. 저장소 인터페이스의 구현을 작성할 필요가 없습니다. 스프링 데이터 JPA는 애플리케이션을 실행할 때 즉석에서 구현을 생성합니다.
서비스 클래스
package org.springboot.service;
import java.util.Collection
import org.springboot.model.Greeting;
public interface GreetingService {
Collection<Greeting> findAll();
Greeting findOne(Long id);
Greeting create(Greeting greeting);
Greeting update(Greeting greeting);
void delete(Long id);
}
서비스 빈
package org.springboot.service;
import java.util.Collection;
import org.springboot.model.Greeting;
import org.springboot.repository.GreetingRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class GreetingServiceBean implements GreetingService {
@Autowired
private GreetingRepository greetingRepository;
@Override
public Collection<Greeting> findAll() {
Collection<Greeting> greetings = greetingRepository.findAll();
return greetings;
}
@Override
public Greeting findOne(Long id) {
Greeting greeting = greetingRepository.findOne(id);
return greeting;
}
@Override
public Greeting create(Greeting greeting) {
if (greeting.getId() != null) {
//cannot create Greeting with specified Id value
return null;
}
Greeting savedGreeting = greetingRepository.save(greeting);
return savedGreeting;
}
@Override
public Greeting update(Greeting greeting) {
Greeting greetingPersisted = findOne(greeting.getId());
if (greetingPersisted == null) {
//cannot find Greeting with specified Id value
return null;
}
Greeting updatedGreeting = greetingRepository.save(greeting);
return updatedGreeting;
}
@Override
public void delete(Long id) {
greetingRepository.delete(id);
}
}
컨트롤러 클래스
package org.springboot.web.api;
import java.util.Collection;
import org.springboot.model.Greeting;
import org.springboot.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/api")
public class GreetingController {
@Autowired
private GreetingService greetingService;
// GET [method = RequestMethod.GET] is a default method for any request.
// So we do not need to mention explicitly
@RequestMapping(value = "/greetings", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Collection<Greeting>> getGreetings() {
Collection<Greeting> greetings = greetingService.findAll();
return new ResponseEntity<Collection<Greeting>>(greetings, HttpStatus.OK);
}
@RequestMapping(value = "/greetings/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Greeting> getGreeting(@PathVariable("id") Long id) {
Greeting greeting = greetingService.findOne(id);
if(greeting == null) {
return new ResponseEntity<Greeting>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<Greeting>(greeting, HttpStatus.OK);
}
@RequestMapping(value = "/greetings", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Greeting> createGreeting(@RequestBody Greeting greeting) {
Greeting savedGreeting = greetingService.create(greeting);
return new ResponseEntity<Greeting>(savedGreeting, HttpStatus.CREATED);
}
@RequestMapping(value = "/greetings/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Greeting> updateGreeting(@PathVariable("id") Long id, @RequestBody Greeting greeting) {
Greeting updatedGreeting = null;
if (greeting != null && id == greeting.getId()) {
updatedGreeting = greetingService.update(greeting);
}
if(updatedGreeting == null) {
return new ResponseEntity<Greeting>(HttpStatus.INTERNAL_SERVER_ERROR);
}
return new ResponseEntity<Greeting>(updatedGreeting, HttpStatus.OK);
}
@RequestMapping(value = "/greetings/{id}", method = RequestMethod.DELETE)
public ResponseEntity<Greeting> deleteGreeting(@PathVariable("id") Long id) {
greetingService.delete(id);
return new ResponseEntity<Greeting>(HttpStatus.NO_CONTENT);
}
}
MySQL 데이터베이스 용 응용 프로그램 등록 정보 파일
#mysql config
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=Welcome@123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy
#initialization
spring.datasource.schema=classpath:/data/schema.sql
SQL 파일
drop table if exists greeting;
create table greeting (
id bigint not null auto_increment,
text varchar(100) not null,
primary key(id)
);
pom.xml 파일
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
실행 가능한 JAR 빌드하기
Maven을 사용하여 명령 행에서 애플리케이션을 실행할 수있다. 또는 모든 필요한 종속성, 클래스 및 자원을 포함하는 단일 실행 가능 JAR 파일을 빌드하고 실행할 수 있습니다. 따라서 개발 수명주기, 다양한 환경에 걸쳐 응용 프로그램으로 서비스를 쉽게 배포, 버전 및 배포 할 수 있습니다.
./mvnw spring-boot:run
사용하여 응용 프로그램을 ./mvnw spring-boot:run
합니다. 또는 ./mvnw clean package
사용하여 JAR 파일을 빌드 할 수 있습니다. 그런 다음 JAR 파일을 실행할 수 있습니다.
java -jar target/springboot-0.0.1-SNAPSHOT.jar