JPA란?
JPA는 인터페이스로서 자바 표준명세서이다.
자바에서 관계형 데이터베이스를 사용하는 방식을 정의하는 인터페이스
JPA를 사용하기 위해서는 구현체가 필요한데 대표적으로 Hibernate, Eclipse Lin 등이 있다.
먼저 build.gradle에 의존성들을 등록해야한다.
다음 두 코드를 작성해주어야한다.
JPA를 사용하기 위해서 Posts 클래스를 만들어주고 코드를 작성해준다.
@Getter //클래스 내 모든 필드의 getter 메소드를 자동생성
@NoArgsConstructor //기본 생성자 자동 추가
@Entity //테이블과 링크될 클래스임을 나타냄
public class Posts {
@Id //해당 테이블의 PK필드를 나타냄
@GeneratedValue(strategy = GenerationType.IDENTITY) //PK 생성 규칙을 나타냄, 스프링 2.0에서는 GenerationType.IDENTITY를 추가해야만 auto increment가 된다.
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 클래스에서는 절대 Setter 메소드를 만들지 않아야한다.
-> 해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가
그렇다면 setter 없이 어떻게 값을 삽입할 수 있을까?
해당 이벤트에 맞는 public 메소드를 호출
이번에는 생성자 대신 @builder를 통해 제공되는 클래스 사용
posts 클래스로 database를 접근하게 해줄 jpaRepository를 생성
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
코드는 이렇게 작성해주고
해당 코드를 테스트하기 위해 PostsRepositoryTest란 이름의 클래스를 생성한다.
@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("dydqja4582@naver.com").build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
}
사용되는 쿼리를 실제로 찍어보고 싶다면
resources 파일에 application.properties 파일을 만들어서
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
다음 코드를 확인하여 콘솔에서 확인할 수 있다.