domain패키지는 도메인을 담을 패키지
@NoArgsConstructor
@Getter
@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;
}
}
@Entity
- 테이블과 링크될 클래스임을 나타낸다
- 기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍으로 테이블 이름을 매칭한다
@GeneratedValue
- PK의 생성 규칙을 나타낸다
@Column
- 테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 된다
- 사용하는 이유는, 기본값 외에 추가로 변경이 팔요한 옵션이 있으며 사용한다
- 문자열의 경우 VARCHAR 기본값이 255인데 500으로 늘리고 싶거나 타입을 TEXT로 변경하고 싶거나(ex.content)등의 경우에 사용된다
@NoArgsConstructor
- 기본 생성자 자동 추가
- public Posts(){}와 같은 효과
@Builder
- 해당 클래스의 빌더 패턴 클래스를 생성
- 생성자 상단에 선언 시 생성자에 포함된 필드
💡Entity클래스에선는 절대 Setter메소드를 만들지 않는다
Builder를 쓰면 장점이 있다
예를 들어 다음과 같은 생성자가 있다면 new Example(b,a)처럼 a와 b의 위치를 변경해서 코드를 실행하기 전까지는 문제를 찾을 수 없다.
public Example(String a, String b){
this.a = a;
this.b = b;
}
하지만 Builder 어느 필드에 어떤 값을 채워야 할지 명확하게 인지할 수 있다.
Example.builder()
.a(a)
.b(b)
.build();
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts,Long> {
}
JpaRepository<Entity,PK타입>를 상속하면 기본적인 CRUD메소드
@ExtendWith(SpringExtension.class)
@SpringBootTest
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("bee1162@naver.com")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
org.assertj.core.api.Assertions.assertThat(posts.getTitle()).isEqualTo(title);
org.assertj.core.api.Assertions.assertThat(posts.getContent()).isEqualTo(content);
}
}
spring.jpa.show_sql=true
application.properties에 추가하면 이런식으로 로그에 찍힌다
h2에서 MySQL로 바꾸면
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect