[SpringBoot] Spring Data Jpa

C____JIN·2022년 10월 13일
0

SpringBoot

목록 보기
5/6
post-thumbnail
post-custom-banner

Spring Data Jpa

의존성 추가

implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation('com.h2database:h2')
  • spring-boot-starter-data-jpa : 스프링 부트용 Spring Data Jpa 추상화 라이브러리
    • JPA 관련 라이브러리 버전 관리
  • h2 : 인메모리 관계형 데이터 베이스
    • 별도의 설치 없이 의존성으로만 관리 가능
    • application에서 실행 -> 재시작 할 때마다 초기화 -> 테스트 용도로 사용

Domain 설계

Posts.java

@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 : 테이블과 리으될 클래스임을 나타냄

    • 기본값으로 클래스의 Camel case 이름을 언더스코어 네이밍으로 테이블 이름을 매칭
  • @Id : 해당 테이블의 PK 필드를 나타냄

  • @GeneratedValue : PK의 생성 규칙을 나타냄

    • Spring Boot 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment가 됨
  • @Column : 테이블의 컬럼을 나타냄

    • 기본값 외에 추가로 변경이 필요한 옵션이 있을 때 사용
  • @NoArgsConstructor : 기본 생성자 자동 추가

  • @Builder : 빌더 패턴 클래스 생성

    • 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함

주의) Entity 클래스에서는 절대 Setter 메소드를 만들지 않음

Repository 생성

public interface PostsRepository extends JpaRepository<Posts, Long> {
}
  • `JpaRepository<Entity 클래스, PK 타입>를 상속하면 기본 적은 CRUD 메소드가 자동으로 실행

Spring Data JPA 테스트 코드 작성

PostsRepositoryTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

    @After
    public void cleanup() {
        postsRepository.deleteAll();
    }

    @Test
    public void 게시글저장_불러오기() {
        //given
        String title = "테스트 게시글";
        String content = "테스트 본문";

        postsRepository.save(Posts.builder()
                        .title(title)
                        .content(content)
                        .author("sgn03077@gmail.com")
                        .build());

        //when
        List<Posts> postsList = postsRepository.findAll();

        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
    }
}
  • @After : Junit에서 단위 테스트가 끝날 때마다 수행되는 메소드 지정
    • 테스트간 데이터 침범을 막기 위해 사용

참고

이동욱, 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

profile
개발 블로그🌐 개발일지💻
post-custom-banner

0개의 댓글