본 포스팅은 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 보고 작성하였음
구현체 교체의 용이성
저장소 교체의 용이성
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' ⓐ
runtimeOnly 'com.h2database:h2' ⓑ
ⓐ spring-boot-starter-data-jpa
ⓑ h2
실제 DB의 테이블과 매칭될 클래스이며, 보통 Entity 클래스라고도 함
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@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;
}
}
롬복은 코드를 단순화시켜 주지만 필수 어노테이션은 아님
코틀린 등의 새 언어 전환으로 롬복이 더이상 필요 없을 경우 삭제 필요
ⓐ @Getter
ⓑ @NoArgsConstructor
ⓖ @Builder
- 해당 클래스의 빌더 패턴 클래스를 생성
Entity 클래스는 절대 Setter 메소드를 만들지 않음, 대신 해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만 함
예시
public class Order {
public void setStatus(boolean status) {
this.status = status;
}
}
public void 주문서비스의_취소이벤트() {
order.setStatus(false);
}
public class Order {
public void setStatus(boolean status) {
this.status = status;
}
}
public void 주문서비스의_취소이벤트() {
order.setStatus(false);
}
Setter가 없는 상황에서 값을 채워 DB에 삽입?
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@After ⓐ
public void cleanup() {
postsRepository.deleteAll();
}
@Test
public void saveAndFindPosts() {
//given
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder() ⓑ
.title(title)
.content(content)
.author("sunsky300@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);
}
}
ⓐ @After
ⓑ postsRepository.save
ⓒ postsRepository.findAll
별다른 설정없이 @SpringBootTest를 사용할 경우 H2 데이터베이스를 자동으로 실행
실행된 쿼리 로그
설정 위치 : src/main/resource -> application.poperties
설정 코드 :
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.datasource.hikari.jdbc-url=jdbc:h2:mem://localhost/~/testdb;MODE=MYSQL