Spring Boot 만들기

애플리케이션 계층

계층(Layer) @Component
표현(presentation) @Controller
서비스(Service) @Service
영속화(Persistence) @Repository

개발 방향은 아래에서 위로 올라간다.

Entity와 repository를 개발하고 그다음 서비스를 작성하고 서비스를 이용하는 컨트롤러를 만드는것 으로 차근차근 개발.

루트 application, 컨트롤러가 있는 애플리케이션 콘텍스트


Repository

  • ORM ( Object Relational Mapping)

    • 대부분의 개발 언어 플랫폼마다 제공
    • 객체(Object) 로 관계형 데이터베이스(RDMBS)를 관리
    • hiberate를 주로 사용
  • JPA(Java Persistence API)

    • Java 객체 정보를 영속화 하는 중간과정을 처리한다.

    • 엔티티 객체를 저장하고 변경하고 삭제하면 그에 대응하는 쿼리를 생성하고 실행한다

    • hibrate를 조금더 사용하기 쉽게 추상화 한 라이브러리가 JPA
      프로그램마다 객체와 entity 테이블 사이의 관계를 맵핑하고 쿼리를 생성해주는 프레임워크 java 에서는 hibernate, springdata jpa로 활용을 하게 된다.
      jpa가 객체의 상태를 보고 update, delete,insert, 등을 사용하게 된다
      https://www.slideshare.net/zipkyh/ksug2015-jpa1-jpa-51213397
      https://www.slideshare.net/zipkyh/spring-datajpa
      @Entity
      class Book{

        Long id;
      String isbn13;
      String isbn10;

      }

      insert into book(id,isbn13,isbn10) value (...);

    Spring Data JPA Repository interface

    public interface BookRepository extends JpaRepository<Book,Long>{
      List<Book> findByNameLike(String name);
    }

    인터페이스를 확장해서 사용하게 된다.
    이름으로 해서 유사 검색을 할수 있도록 하는 것
    Named method query 를 사용해 줌
    JpaRepository

    Optional<T> findById(ID id);
    List<T> findAll();
    List<T> findAll(Sort sort);
    List<T> findAllById(Iterable<ID> ids);
    <S extends T> List<S> saveAll(Iterable<S> entities);
    void flush();
    <S extends T> S saveAndFlush(S entity);
    void deleteInBatch(Iterable<T> entities);
    void deleteAllInBatch();
    T getOne(ID id);
  • JPA 동작원리
    BookRepository --> Spring Data JPA Proxy, SimpleJpaRepository -->Book Repository 구현체
    http://haviyj.tistory.com/28

  • 빨간색 부분이 JPA 부분

    서비스에서 레파지토리 호출 구현체에서 JPA 를 통해서 쿼리로 변경하고 jdbc에서 객체로 맵핑 되어서 가지고옴

    업무(=비즈니스 로직 ) 구현에만 집중해라!!

    • 영속화 계층(@Repository)에서는 엔티티 관리만
    • 비즈니스 로직구현은 도메인 영역에서
    • 서로 다른 도메인 사이에 연계는 서비스 계층(@Service) 에서
    • 외부 요청에 대한 처리는 컨트롤러 계층(@Controller) 에서
      entity를 가지고 오는 것이 간단함

repository만들기 실습

AbstractPersistable : JPA 추상 클래스

Entity들의 id 값은 보통 long을 많이 씀

도메인 : Book 클래스

package com.merona.study.domain;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.jpa.domain.AbstractPersistable;

import javax.persistence.Entity;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@Entity
public class Book extends AbstractPersistable<Long> {
//id 값을 Long으로 generic으로 받아서 하기 때문에 @GeneratedValue를 설정 안해도됨
//    @Id
//    private Long id;

    private String name;
    private String isbn13; //13자리
    private String isbn10; //10자리

}

AbstractPersistable 이란 ?

Repository : BookRepository

package com.merona.study.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface BookRepository extends JpaRepository<Book, Long> {
    //T : entity의 타입
    //ID : Long
    List<Book> findByNameLike(String name);

}

TestCode

package com.merona.study.domain;

import jdk.nashorn.internal.ir.LiteralNode;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;


import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;


@RunWith(SpringRunner.class)
@DataJpaTest
public class BookTest {

    @Autowired
    BookRepository repository;

    @Test
    public void testTave(){

        Book book = new Book();
        book.setName("boot-spring-boot");
        book.setIsbn10("0123456789");
        book.setIsbn13("0123456789123");

//        assertThat("Simple Text",is(equalTo("Simple Text")));
        System.out.println(" book is NEw ? "+ book.isNew());
        repository.save(book);
        System.out.println(" book is NEw ? "+ book.isNew());
//        assertThat(book.isNew(),true);
    }


    @Test
    public void testFindByNameLike(){
        Book book = new Book();
        book.setName("boot-spring-boot");
        book.setIsbn10("0123456789");
        book.setIsbn13("0123456789123");

        repository.save(book);

        List<Book> books = repository.findByNameLike("boot");
        for(Book bookItem : books){
            System.out.println("bookName : "+bookItem.getName());
        }

    }
}

테스트 코드를 적는데 있어서

assertThat이 계속 오류가 나는데

import static org.assertj.core.api.Assertions.assertThat;

위 패키지의 assertThat을 사용하면 해결된다.

'BackEnd > SpringBoot' 카테고리의 다른 글

Spring Boot Logging (1)  (0) 2020.04.16
Request Body 의 값 BadRequest 로 보내기  (0) 2020.04.11
SpringBoot(4) -T-Academy  (0) 2019.05.24
SpringBoot(3)-T-Academy  (0) 2019.05.22
SpringBoot 시작하기(1)-T-Academy  (0) 2019.05.20

+ Recent posts