카테고리 없음

[Project][Springboot] jpa

321 2021. 5. 3. 15:48

[책: 스프링부트와 aws로 혼자 구현하는 웹서비스] 를 보며 작성한 포스팅입니다.

 

 

원래는 끝까지 다 돌려보고 배포까지 한 다음에 포스팅하려했으나 시큐리티에서 한번(네이버..) aws에서 두번 막혀서ㅠ

어차피 복습할거 처음부터 오타는 없는지, 저자의 깃허브도 참고해가면서 처음부터 차근차근 확인하려 한다.

 

 

ORM == 입력된sql쿼리 실행하는 프레임워크

JPA == Java Persistence API == 자바 표준 ORM

관계형 DB와 객체지향언어 JAVA의 괴리감을 줄이며 표현하기 위해서 JPA프레임워크를 사용

 

스프링부트에서 사용하는 절차는 /Spring Data JPA/ -> Hibernate -> JPA 이렇게 사용함

 Spring Data JPA는 교체가능하도록 한번 더 감싸준 것

 

 

 

 

 

먼저 build.gradle에서 의존성등록

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    testCompile('org.springframework.boot:spring-boot-starter-test')

	//추가한부분
    compile('com.h2database:h2')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
}
  • h2 - 메모리 안에서 사용한 관계형DB, 이 기능을 사용해서 추후에 데이터관리가능, 일시적임(재시작하면 초기화됨)
  • spring-boot-starter-data-jpa : JPA관련 라이브러리

 

 

 

domain-posts폴더 생성

도메인은 요구사항 or 문제영역을 담을 폴더이다.

 

posts폴더 안에 Posts클래스 생성하고 아래와 같이 작성

package com.newproject.book.domain.posts;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class Posts{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length=500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author){
        this.title = title;
        this.content = content;
        this.author = author;
    }


}
  • @Entity: JPA 어노테이션,
    • NewProject.java 파일이라면 -> new_project table로 매칭한다. (CamelCase->SneakCase 자동변환이 디폴트 옵션)
  • @Builder를 사용하면 클래스명.builder().변수a(값a).변수b(값b).build(); 의 문법을 사용
    • 어떤 값을 채워야하는지 명확하게 구별한다.
    • setter대신 사용
  • @Id와 @GeneratedValue를 사용하면 pk필드와 pk필드 규칙을 알 수 있다.
  • @Column은 필드의 속성을 변경할때 쓴다. (안쓰면 그냥 기본옵션)

 

 

 

PostsRepository

package com.newproject.book.domain.posts;

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

import java.util.List;

public interface PostsRepository extends JpaRepository<Posts, Long> {
}

  • 위와 같이 JpaRepository<클래스, primary key 타입>을 상속받으면 자동으로 crud를 사용할 수 있게된다.
  • 그래서 Posts(@Entity)클래스와 PostsRepository(JpaRepository)클래스는 함께 움직이는 것이 좋다.

 

 

테스트코드

PostsRepositoryTest

import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

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

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
    
    @Autowired
    PostsRepository postsRepository;
    
    @After
    public void cleanup(){
        postsRepository.deleteAll();
    }
    
    @Test
    public void post_list(){
        
        String title = "test title";
        String content = "test content";
        
        //build작업
        postsRepository.save(Posts.builder()
                .title(title)
                .content(content)
                .author("author@test")
                .build());
        
        //잘 빌드 되었나 확인
        List<Posts> postsList = postsRepository.findAll();
        Posts posts = postsList.get(0);
        
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
        
    }
}
  • assertThat은 assertJ의 기능중 하나. 조건을 확인할때 사용한다.
  • .save .findAll은 jpa함수

 

 

 

h2를 이용한 DB setting

application.properties파일 만들고 

spring.jpa.show_sql=true 

값을 입력하여 사용할 수 있다.

 

h2의 문법을 mysql로 작동하게 하려면

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

 를 입력하고 실행한다.