수색…


소개

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. */
}

여기에는 두 개의 속성, idtext 가있는 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);
}

GreetingRepositoryCrudRepository 인터페이스를 확장합니다. GreetingLong 과 함께 작동하는 엔티티 및 ID 유형은 CrudRepository 의 일반 매개 변수에 CrudRepository 됩니다. CrudRepository 를 확장함으로써 GreetingRepositoryGreeting 엔티티를 저장, 삭제 및 검색하는 방법을 포함하여 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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow