[1주차] Spring boot Rest API

소스코드는 깃허브 주소에서 확인 가능 합니다.

https://github.com/hyeonnie/demo

 

1. 프로젝트 생성

  • 아래 링크를 클릭하여 Spring Initializr 서비스로 접속한다.

https://start.spring.io

  • Maven Project 선택
  • Java 선택
  • 원하는 버전 선택 ( 필자는 2.5.0 을 선택 )
  • Dependencies ADD... 클릭 후 아래 디펜더시를 추가한다.

 

Spring Web

  • 스프링 부트 어플리케이션 실행시 내부적으로 Tomcat, Netty와 같은 웹어플리케이션서버(WAS)를 포함하여 실행된다.
  • Spring Web을 사용시 REST API를 쉽게 구현 할 수 있다.

LomBook

  • 자바 모델 클래스 작성시에 Lombok에서 제공하는 어노테이션을 활용하면 귀찮은 생성자, Getter/Setter, toString 등을 컴파일 시 자동으로 작성해준다.

Spring Data JPA

  • JPA(Java Persistence API) 는 자바 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
  • 자바 모델 클래스에 @Entity 어노테이션을 달면 DB테이블 엔티티로 맵핑되고,
    자바 레파지토리 인터페이스에 @Repository 어노테이션을 달면 DB테이블 CRUD 명령을 자동으로 생성해준다.

H2 Database

  • 인메모리(In-memory) 데이타베이스로서 스프링 부트 어플리케이션이 실행시에 내부적으로 포함되어 자동으로 실행된다.
  • 스프링 부트 내부에 포함되어 자동 실행되므로, 따로 데이타베이스 연결 설정이 필요없다.
  • 인메모리 데이타베이스이기 때문에 모든 데이타는 휘발성이다. 서버의 임시데이타(테스트용 데이타베이스, REST API 결과데이타 캐쉬, 사용자 로그인 세션 값)를 저장하는데 용이하다.

 

2. 클래스 작성

Product.java

package com.example.demo.model;

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

import javax.persistence.Entity;
import javax.persistence.Id;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Product {

    @Id
    int id;

    String title;

    double price;

    int inventory;

}
  • 이 클래스에 Getter/Setter 생성을 위해 Lombok 어노테이션 @Data를 달아준다.
  • 모든 변수 받는 생성자가 필요하므로 Lombok 어노테이션 @AllArgsConstructor를 달아준다.
  • 빈 생성자가 필요하므로 Lombok 어노테이션 @NoArgsConstructor를 달아준다.
  • 이 클래스는 JPA의 엔티티(Entity) 이기 때문에 , JPA 어노테이션 @Entity를 달아준다.
  • 이 클래스의 “id” 속성값의 엔티티의 키(key)가 되므로, JPA 어노테이션 @Id를 달아준다.

ProductRepository.java

package com.example.demo.repository;

import com.example.demo.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProductRepository extends JpaRepository<Product, Integer> {

}
  • 이 클래스는 JPA의 레파지토리(Repository) 이기 때문에 , JPA 어노테이션 @Repository 달아준다
  • 이 클래스에서 JPA의 레파지토리(Repository) 구현을 위해 JpaRepository 클래스를 상속받는다.
  • 이때 제네릭타입 첫번째(T)는 앞에서 생성한 “Product”, 두번째(ID)는 Product의 키 타입 “Integer”를 넣어준다.

ProductController.java

package com.example.demo.controller;

import com.example.demo.model.Product;
import com.example.demo.repository.ProductRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
public class ProductController {

    private final ProductRepository productRepository;

    @RequestMapping("/product")
    public List<Product> getProducts() {
        return productRepository.findAll();
    }

    @RequestMapping("/product/{id}")
    public Product getProductById(@PathVariable("id") int id) {
        return productRepository.findById(id).get();
    }

}
  • 필드 주입방식은 Spring boot 에서 추천하지 않는다, 따라서 생성자 주입 방식을 이용하며,
    Lombok 에서 제공하는 @RequiredArgsConstructor 어노테이션을 사용하였다.
    이 어노테이션은 final 이 붙은 필드 변수에 생성자를 자동으로 생성한다.
  • 이 클래스는 REST API 를 제공하는 컨트롤이기 때문에 스프링 어노테이션 @RestController 를 추가한다.
  • “/product” 경로의 요청을 처리하기 위해 스프링 어노테이션 @RequestMapping 을 추가한다.
  • “/product/{id}” 경로의 요청을 처리하기 위해 스프링 어노테이션 @RequestMapping 을 추가한다.

DemoApplication.java

package com.example.demo;

import com.example.demo.model.Product;
import com.example.demo.repository.ProductRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@RequiredArgsConstructor
public class DemoApplication {

    private final ProductRepository productRepository;

    @Bean
    public ApplicationRunner applicationRunner() {
        return args -> {
            productRepository.save(new Product(1, "iPad 4 Mini", 500.01, 2));
            productRepository.save(new Product(2, "H&M T-Shirt White", 10.99, 10));
            productRepository.save(new Product(3, "Charli XCX - Sucker CD", 19.99, 5));
        };
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
  • @Bean 어노테이션을 이용하여 ApplicationRunner 클래스를 ApplicationContext 에 등록한다.
  • 스프링부트 어플리케이션이 실행 될 때 ApplicationRunner 클래스의 run() 메소드가 자동으로 실행 된다.
  • 메모리 DB를 사용하므로, 어플리케이션이 구동 된 후 메모리 디비에 데이터가 저장 될 수 있도록
    이전에 생성 한 레파지토리 클래스를 활용하여 H2 메모리 디비에 데이터를 넣어보았다.

 

 

댓글(0)

Designed by JB FACTORY