본문 바로가기
개발 관련 지식/JAVA

Spring boot - 5. JPA test CRUD 만들기

by 권태일1147 2020. 3. 23.

먼저 MySQL Workbench로 test 스키마에 테이블을 만든다.

테이블을 생성할 때 컬럼은 snake case를 사용해서 구분해야할 단어 사이에  _(언더바)를 넣는다.

 

그리고 user에 대한 model을 만든다.

model 패키지 안에 entity 패키지를 만들고 그 안에 User 클래스를 만든다.

 

user 테이블 컬럼에 맞춰서 camel case를 사용하여 User 클래스 다음과 같이 만든다.

package com.example.test.model.entity;

import lombok.Data;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Data
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userId;
    private String userName;
    private String phoneNumber;
}

@Data : lombok annotation으로 getter/setter 생성

@Entity : 테이블에 대응하는 하나의 클래스로 매핑 시키는 annotation.

@Id : entity의 primary key를 지정하는 annotation

@GeneratedValue : primary key에 대한 생성 전략을 지정하는 annotation, Id annotation과 함께 entity의 primary key에 적용될 수 있다.

GenerationType.IDENTITY : 데이터베이스 ID 컬럼을 사용하여 엔티티에 기본 키를 지정해야 함을 나타낸다.

https://www.objectdb.com/api/java/jpa/GenerationType

 

 

그 다음, repository package를 생성하고 그 안에 UserRepository 인터페이스를 생성한다.

UserRepository 인터페이스에 JpaRepository를 상속시킨다. 인터페이스에 User entity로 CRUD가 가능하도록 한다.

package com.example.test.repository;

import com.example.test.model.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
}

@Repository : 해당 클래스가 데이터 접근계층이나 DAO라는 것을 알리는 annotation

JpaRepository : 기본적인 CRUD가 가능하게 해주는 스프링부트에서 제공해주는 인터페이스. entity 클래스와 primary key의 type이 들어간다.

 

그 다음, 테스트 클래스를 만들어서 테스트 해본다.

test 패키지 아래에 repository 패키지를 만들고 그 안에 UserRepositoryTest 클래스를 생성한다.

그 다음, TestApplicationTests 클래스를 실행시키기 위해 public으로 변경한다.

그리고 UserRepositoryTest 클래스에 TestApplicationTests 클래스를 상속하고 테스트 코드를 만든다.

 

insert 메소드

package com.example.test.repository;

import com.example.test.TestApplicationTests;
import com.example.test.model.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

public class UserRepositoryTest extends TestApplicationTests {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void insert(){
        User user = new User();
        user.setUserName("K.TaeIl");
        user.setPhoneNumber("010-1234-1234");

        userRepository.save(user);
    }
}

@Autowired : 스프링에 의해 만들어진 자바객체(bean)을 자동으로 주입시켜준다. ( User entity로 CRUD가 가능해진 인터페이스의 객체(bena)를 주입시킨다. )

junit : java unit test를 지원해주는 프레임워크

@Test : 테스트를 수행하는 메소드라고 선언하는 annotation.

 

저장하고, test 모듈을 실행하면 테이블에 데이터가 추가된다.

MySQL Workbench로 검색해본다.

 

read 메소드 추가

@Test
public void read(){
    Optional<User> user = userRepository.findById(1L);

    user.ifPresent(selectedUser -> {
        System.out.println(selectedUser);
    });
}

Optional<T> : Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 널(null) 값으로 인해 발생하는 예외를 처리.( 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class). 따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다. )

ifPresent : 이 메소드는 특정 결과를 반환하는 대신에 Optional 객체가 감싸고 있는 값이 존재할 경우에만 실행될 로직을 함수형 인자로 넘긴다.

 

저장하고 다시 test 모듈 실행.

( insert 메소드를 주석처리 하지 않으면 test 모듈을 실행할 때 마다 데이터가 쌓인다. )

 

 

 

update 메소드 추가

@Test
public void update(){
    Optional<User> user = userRepository.findById(1L);

    user.ifPresent(selectedUser ->{
        selectedUser.setUserName("TestName");
        selectedUser.setPhoneNumber("010-0000-9999");
        userRepository.save(selectedUser);
    });

    System.out.println(user);
}

실행 결과.

 

 

 

delete 메소드 추가

@Test
public void delete(){
    Optional<User> user = userRepository.findById(1L);

    user.ifPresent(selectedUser -> {
        userRepository.delete(selectedUser);
    });
}

실행 결과.

 

'개발 관련 지식 > JAVA' 카테고리의 다른 글

객체와 클래스  (0) 2020.03.30
객체 지향 프로그래밍  (0) 2020.03.29
Spring boot - 4. JPA 설정  (0) 2020.03.22
annotation processor 란  (0) 2020.03.21
lombok  (0) 2020.03.20