dependencies {
// spring data JPA
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('com.h2database:h2')
}
spring-boot-starter-data-jpa
h2
@NoArgsConstructor
@Getter
@Entity
public class Posts extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 50, 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;
}
public void update(String title, String content) {
this.title = title;
this.content = content;
}
}
- @NoArgsConstructor
- 기본 생성자 자동 추가하는 롬복 어노테이션
- Posts() {} 와 같은 의미이다.
- @Getter
- 클래스 내 모든 필드의 Getter 메소드를 자동 생성해주는 롬복 어노테이션
- @Entity
- JPA 어노테이션
- @Id
- 해당 테이블의 primary key 필드를 나타낸다.
- @GeneratedValue
- PK의 생성규칙을 나타낸다.
스프링 부트 2.0에서는 IDENTITY 옵션을 추가해야지만 auto_increment가 된다.- 왠만하면 PK는 Long 타입의 auto_increment를 추천한다.
- @Column
- 해당 어노테이션을 굳이 선언하지 않아도 Entity 클래스의 모든 필드는 칼럼이 된다.
기본값 이외에 추가로 변경이 필요한 옵션이 있을 경우 사용한다.- @Builder
- 해당 클래스의 빌더 패턴 클래스를 생성하는 어노테이션이다.
단, 생성자에 포함된 필드만 빌더에 포함한다.
- 엔티티 클래스에서는 Setter 메소드를 만들지 않는다.
- 만약, 해당 필드 값의 변경이 필요하다면 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야한다.
- setter 없이 생성자를 통해 최종값을 채운뒤 데이터베이스에 삽입한다.
/**
* */
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
@RunWith(SpringRunner.class)
// @SpringBootTest 어노테이션을 사용할 경우 자동으로 H2 데이터베이스를 실행해준다.
// 만약 yaml 파일에 다른 DB에 관한 configuration 이 적혀있다면 오류가 발생할 가능성이 매우 크다.
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
private PostsRepository postsRepository;
@After
public void cleanup() {
postsRepository.deleteAll();
}
@Test
public void 게시글저장_불러오기() {
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("guswns3371@gmail.com")
.build()
);
List<Posts> postsList = postsRepository.findAll();
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
@Test
public void BaseTimeEntity_등록() {
LocalDateTime now = LocalDateTime.of(2021,2,25,0,0,0);
postsRepository.save(Posts.builder()
.title("title")
.content("content")
.author("author")
.build());
List<Posts> postsList = postsRepository.findAll();
Posts posts = postsList.get(0);
System.out.println(">>>>>> createdDate="+posts.getCreatedData()+", modifiedDate="+posts.getModifiedData());
assertThat(posts.getCreatedData()).isAfter(now);
assertThat(posts.getModifiedData()).isAfter(now);
}
}
- @After
- JUnit 단위 테스트가 끝날 떄 마다 수행되는 메소드를 지정한다.
- 배포 전 전체 테스트를 수행할 경우에 테스트간 데이터 침범을 막는 용도로 사용한다.
- postsRepository.save
- 테이블 posts에 insert/update 쿼리를 실행한다.
- id값이 있다면 -> update가 실행되고
- id값이 없다면 -> insert가 실행된다.
- postsRepository.findAll()
- 테이블 posts에 있는 모든 데이터를 조회해오는 메소드이다.