카테고리 없음
[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
를 입력하고 실행한다.