
ORM 은 객체를 매핑
SQL Mapper 는 쿼리를 매핑
Posts.java
package com.pgrrr.book.springboot.domain.posts;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Getter // 6
@NoArgsConstructor // 5
@Entity // 1
public class Posts {
    
    @Id // 2
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 3
    private Long id;
    
    @Column(length = 500, nullable = false) // 4
    private String title;
    
    @Column(columnDefinition = "TEXT",  nullable = false)
    private String content;
    
    private String author;
    @Builder // 7
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}@Entity@Id@GeneratedValueGenerationType.IDENTITY 옵션을 추가해야만 auto_increment 가 된다@Column웬만하면 Entity의 PK 는 Long 타입의 Auto_increment (MySQL 기준 bigint)
@NoArgsConstructor
- 기본 생성자 자동 추가
public Posts() {}와 같은 효과
@Getter
- 클래스 내 모든 필드의 Getter 메소드를 자동 생성
@Builder
- 해당 클래스의 빌더 패턴 클래스를 생성
- 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함
- Entity 클래스에서는 절대 Setter 메소드를 만들지 않는다
- 대신 목적과 의도를 나타낼 수 있는 메소드를 추가
PostsRepository.java
package com.pgrrr.book.springboot.domain.posts;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts, Long> {
    
}package com.pgrrr.book.springboot.domain.posts;
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 // 1
    public void cleanup() {
        postsRepository.deleteAll();
    }
    
    @Test
    public void 게시글저장_불러오기() {
        //given
        String title = "테스트 게시글";
        String content = "테스트 본문";
        postsRepository.save(Posts.builder() // 2
                .title(title)
                .content(content)
                .author("pgrrr119@gmail.com")
                .build());
        
        //when
        List<Posts> postsList = postsRepository.findAll(); // 3
        
        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
    }
}@AfterpostsRepository.savepostsRepository.findAllapplication.properties
spring.jpa.show-sql=true // 1
spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect // 2