도메인을 담을 패키지
@Entity
@Id
@GeneratedValue
@Column
@NoArgsConstructor
@Builder
@Getter
클래스 내 모든 필드의 Getter 메소드를 자동 생성
Entity 클래스에서는 절대 Setter 메소드를 만들지 않는다.
해당 인스턴스의 값들이 언제 어디서 변해야하는지 setter메소드로는 명확히 구분할 수 없기 때문에 해당 필드의 값 변경이 필요하다면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만한다.ex. 주문 취소 메소드
//잘못된 사용 예 public class Order{ public void setStatus(boolean status){ this.status = status } } public void 주문서비스의_취소이벤트(){ order.setStatus(false); } /*-------------------------------------------*/ //올바른 사용 예 pubilc class Order{ public void cancelOrder(){ this.status = false; } } public void 주문서비스의_취소이벤트(){ oredr.cancleOrder(); }
Setter가 없으면 어떻게 DB에 값을 삽입할 수 있을까?
생성자
를 통해 최종값을 채운 후 DB에 삽입
값 변경이 필요한 경우, 해당 이벤트에 맞는 public 메소드를 호출
하여 변경
(MyBatis의 Dao)
insert/save
쿼리를 실행.JPA에서 실제로 실행된 쿼리를 보고싶다면?
application.properties
,application.yml
등의 파일에 한 줄의 코드를 설정하면 볼 수 있음추가하고 테스트코드를 돌리면 아래와 같이 쿼리를 확인 가능.spring.jpa.show_sql=true
create table 쿼리에 id bigint generated by default as identity 옵션. < H2 쿼리 문법
출력되는 쿼리를 MySQL로 바꿔야 더 보기좋음
//application.properties에 추가 spring.jpa.properties.hibernate.dialect=org.hibernate. dialect.MYSQL5InnoDBDialect
cf
참고
spring 2.1.10 버전 이후로는 더 복잡한 설정이 추가되어야 쿼리문을 MySQL로 바꿀 수 잇음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