먼저 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 |