SpringBoot
# 서블릿 설정 ( 애플릿을 사용한다면 none 로 설정 )
spring.main.web-application-type=servlet
# 톰캣 port 번호
server.port=8888
### 데이터베이스 연동 ###
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=system
spring.datasource.password=1234
## JPA Setting
##무조건 새로 만든다 (drop 후 Create)
#spring.jpa.hibernate.ddl-auto=create
#없을때만 새로 만든다 (기존 테이블에 Update 또는 기존테이블 없을 시 신규생성)
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.OracleDialect
spring.jpa.properties.hibernate.format_sql=true
## Logging Setting
logging.level.org.hibernate=info
### JSP 경로 설정 ###
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
## Thymelead Cache Setting
#spring.thymeleaf.cache=false
jpa 세팅을 설정한다.
create는 테이블을 drop 후 신규 생성
update는 기존 테이블이 존재시 update 동작, 기존테이블이 미존재시 테이블을 신규 생성한다.
package com.jpaBoard.k5.domain;
import java.util.Date;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import jakarta.persistence.Transient;
import jakarta.persistence.UniqueConstraint;
import lombok.Data;
@Data
@Entity // 테이블과 매핑시켜주는 역할
@Table(name="T0807", uniqueConstraints= {@UniqueConstraint (columnNames= {"SEQ", "board_title"})})
@SequenceGenerator(
name = "T_GENERATER",
sequenceName = "T_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Board0807 {
@Id // 기본키 p.k 역할
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "T_GENERATER")
private long seq;
// 칼럼에 null 값 삽입 불가
@Column(name="board_title", nullable = false, length=30)
private String Title;
// 값 수정 불가 (쿼리에서 칼럼 제외 > DB 디폴트값으로 입력)
@Column(updatable= false)
private String writer;
private String content;
// 날짜 데이터를 매핑
@Temporal(value = TemporalType.TIMESTAMP)
private Date createDate;
private Long cnt;
// 컬럼생성 없이 vo를 사용하고 싶을때
@Transient
private String searchCondition;
@Transient
private String searchKeyword;
}
각 주석의 설명이 존재 하지만 간단히 설명해보자.
@Data
@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode을 한꺼번에 설정해주는 매우 유용한 어노테이션
클래스 레벨에서 @Data 어노테이션을 붙여주면, 모든 필드를 대상으로 접근자와 설정자가 자동으로 생성되고, final 또는 @NonNull 필드 값을 파라미터로 받는 생성자가 만들어지며, toStirng, equals, hashCode 메소드가 자동으로 만들어집니다.
@Entity
주의사항
기본 생성자는 필수 (JPA가 엔티티 객체 생성 시 기본 생성자를 사용)
final 클래스, enum, interface, inner class 에는 사용할 수 없음
저장할 필드에 final 사용 불가
@Table
@SequenceGenerator
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당,
데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장
유일한 값을 순서대로 생성(오라클, PostgreSQL, DB2, H2)
TABLE : 키 생성 테이블을 사용
키 생성 전용 테이블 하나를 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어
데이터베이스 시퀀스를 흉내내는 전략. 테이블을 사용하므로 모든 데이터베이스에 적용 가능
@GeneratedValue
@Id
@Column
@Column
@Enumerated
@Transient
// 타이틀 레코드 조회
List<Board0807> findByTitle(String searchKeyword);
// 작성자 레코드 검색값 포함 조회
List<Board0807> findByWriterContaining(String serchKeyword);
// 작성자 레코드 2개의 검색값 포함 조회 후 시퀀스 값으로 내림차순 정렬
List<Board0807> findByWriterContainingOrWriterContainingOrderBySeqDesc(String str1, String str2);
// 시퀀스값이 변수값보다 작고, 작성자 이름이 포함된 레코드 조회 후 시퀀스 값으로 내림차순
List<Board0807> findBySeqLessThanAndWriterContainingOrderBySeqDesc(Long ttl, String wrt);
BodardCrudRepository에서 사용한 쿼리 메소드의 내용이다.
여러개의 쿼리 메소드를 이용해 쿼리문의 동작을 사용할 수 있다.
repository를 받는 BodardCrudRepository 파일에서 CrudRepository의 변수 값을 상속받아 사용한다.
이외에는 스프링 구조와 같게 view 동작을 만들면된다.
interface - service
Class - serviceImpl
controller
스프링부트에서의 다양한 방법을 습득할수있도록
두고두고 읽어보면서 정리해야겠다.
화이팅