JPA
의 도입으로 개발자는 DBMS
를 통해 DDL
,DML
조작을 하는 것이 아닌 스프링부트의 프로젝트 내에서 코드를 통해 쿼리 조작이 가능해졌다.build.gradle
jpa
와 내가 사용하는 mysql-driver
Dependency를 추가했다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
}
application.properties
yml
로 계층구조로 만드는게 뭔가 가독성도 그렇고 확실히 편한 것 같다....
# 서버포트 설정
server.port=8060
# MySQL Driver 지정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# DB Source URL
spring.datasource.url=jdbc:mysql://localhost:3306/basic1
# DB username
spring.datasource.username=root
# DB password
spring.datasource.password=
# jpa 구현체가 실행한 쿼리를 콘솔창에 보여준다
spring.jpa.show-sql=true
# DB TABLE 자동 생성
# create 설정 시 스프링부트 어플리케이션을 재시작할때마다 테이블이 초기화된다.
spring.jpa.hibernate.ddl-auto=create
# hibernate가 실행한 sql 쿼리를 보기 쉽게 포맷하여 보여준다.
spring.jpa.properties.hibernate.format_sql=true
# 영속성 컨텍스트를 HTTP 요청 처리가 완료된 후에 종료하는 기능을 비활성화하는 속성
spring.jpa.open-in-view=false
# 템플릿 캐싱 기능을 비활성화
spring.thymeleaf.cache=false
# 템플릿 파일의 위치 지정
spring.thymeleaf.prefix= file:src/main/resources/templates/
# LiveReload 기능 활성화
spring.devtools.livereload.enabled=true
spring.devtools.restart.enabled=true
@Entity
@Id
@GeneratedValue
: 기본 키 생성 전략IDENTITY
: 기본 키 생성을 DB에 위임 (AUTO INCREMENT)AUTO
: DB에 맞게 생성 전략 자동 생성SEQUENCE
: 시퀀스를 사용해서 기본 키 할당LocalDateTime
@Entity
public class Article {
@Id // Primary Key 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) // AUTO INCREMENT
private long id;
private LocalDateTime createDateTime; // 데이터 생성 날짜
private LocalDateTime modifyDateTime; // 데이터 수정 날짜
private String title;
private String body;
}
@Repository
는 생략 가능JpaRepository
는 Entity
와 관련된 CRUD
작업을 수행할 수 있는 메서드를 제공한다.JpaRepository<Article, Long>
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}
JpaRepository
를 구현한 프록시 객체를 자동 생성한다.JpaRepository
를 상속받은 repository
는 이를 구현체로 사용한다.repository
인터페이스를 구현할 필요 없이 인터페이스 만으로 사용할 수 있게 된다.@Builder
어노테이션을 통해 해당 엔티티 객체 생성 시 빌더패턴을 적용할 수 있다.Article
클래스 내부에 ArticleBuilder
라는 클래스가 자동으로 생성되고 이를 통해 객체 초기화가 가능하다.
@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Article {
@Id // Primary Key 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) // AUTO INCREMENT
private long id;
private LocalDateTime createDate; // 데이터 생성 날짜
private LocalDateTime modifyDate; // 데이터 수정 날짜
private String title;
private String body;
}
Article.builder()
를 통해 ArticleBuilder
클래스 객체를 생성.build()
를 통해 객체가 생성된다.Article article = Article
.builder()
.title(title)
.body(body)
.build();
@Builder
를 클래스에 적용 시 클래스의 모든 필드를 인자로 받는 @AllArgsConstructor
를 생성해준다.
하지만 명시적으로 @NoArgsConstructor
, @AllArgsConstructor
를 적용한다면 @Builder
는 생성자를 생성해주지 않는다.
jpa
의 entity
는 무조건 기본 생성자를 필수로 가져야 한다. (왜지??)
자바는 명시적으로 생성자를 안만들었을때 기본 생성자를 자동으로 추가한다. 하지만, @Builder
를 적용하면 모든 필드를 받는 생성자가 생성되니, 자바가 알아서 만들어주던 기본 생성자는 만들어지지 않게된다.
따라서 @NoArgsConstructor
를 통해 기본생성자를 만들어준다, 이렇게 되면 @Builder
는 또 @AllArgsConstructor
를 만들어주지 않으니 @AllArgsConstructor
또한 따로 만들어주어야 한다. ( 나 진짜 설명 못하네 )
결론, @Builder
적용 시 @NoArgsConstructor
,@AllArgsConstructor
추가해주자..