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 를 사용해 줌
JpaRepositoryOptional<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 |