[Spring Data Jpa 적용하기]
domain
- 도메인을 담을 패키지
- xml에 쿼리를 담고 클래스는 오직 쿼리의 결과만 담던 일들이 모두 도메인 클래스에서 해결
src/main/java/com/intellij/project/springboot/domain/posts/Posts
@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;
}
}
- Posts클래스는 실제 DB의 테이블과 매칭될 클래스
- Entity클래스라고도 함
- JPA를 사용할때는 실제 쿼리를 날리기 보다 Entity 클래스의 수정을 통해 작업한다.
- Setter가 없이 어떻게 값을 채워 DB에 삽입할까?
- 기본적인 구조는 생성자를 통해 최종값을 채운 후 DB에 삽입하는 것
- 값 변경이 필요한 경우 해당 이벤트에 맞는 public메소드를 호출하여 변경
- 여기선 생성자 대신 @Builder를 통해 빌더 클래스 사용
- 빌더를 사용하면 어느 필드에 어떤 값을 채워야 할지 명확하게 인지
- 어노테이션
1. @Entity
- 테이블과 링크될 클래스임을 나타냄
- 기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍으로 테이블 이름을 매칭
2. @Id
- 해당 테이블의 PK필드를 나타낸다.
3. @GeneratedValue
- PK의 생성규칙
4. @Column
- 테이블의 컬럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의필드는 모두 컬럼이 된다.
5. @NoAragsConstructor
- 기본 생성자 자동 추가
6. @Getter
- 클래스 내 모든 필드의 Getter메소드를 자동 생성
7. @Builder
- 해당 클래스의 빌더 패턴 클래스 생성
src/main/java/com/intellij/project/springboot/domain/posts/PostsRepository
public interface PostsRepository extends JpaRepository<Posts,Long> {
}
- dao라고 생각하면됨
- DB Layer 접근자
- JpaRepository<Entity 클래스, PK타입>을 상속하면 기본적인 CRUD 메소드가 자동으로 생성
src/test/java/com/intellij/project/springboot/domain/posts/PostsRepositoryTest
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@After
public void cleanup() {
postsRepository.deleteAll();
}
@Test
public void 게시글저장_불러오기() {
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder().title(title).content(content).author("smh17903@gmail.com").build());
List<Posts> postsList = postsRepository.findAll();
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
}
1. @After
- 단위테스트가 끝날 때마다 수행되는 메소드를 지정
- 보통 배포 전 전체 테스트를 수행할 때 테스트간 데이터 침범을 막기 위해 사용
2. postRepository.save
- 테이블 posts에 insert/update쿼리 실행
- id값이 있다면 update, 없다면 insert
3. postsRepository.findAll
- 테이블 posts에 있는 모든 데이터를 조회