102일차_SpringBoot

서창민·2023년 8월 7일
0

SpringBoot

목록 보기
7/13
post-thumbnail

23.08.07 102일차

SpringBoot

  • application.properties

# 서블릿 설정 ( 애플릿을 사용한다면 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 동작, 기존테이블이 미존재시 테이블을 신규 생성한다.


  • JPA 앤티티클래스
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에서 DB 테이블에 대응하는 하나의 클래스

주의사항

  • 기본 생성자는 필수 (JPA가 엔티티 객체 생성 시 기본 생성자를 사용)

  • final 클래스, enum, interface, inner class 에는 사용할 수 없음

  • 저장할 필드에 final 사용 불가

@Table

  • 엔티티와 매핑할 테이블을 지정
  • 생략 시 매핑한 엔티티 일므을 테이블 이름으로 사용
  • 속성
    Name : 매핑할 테이블 이름 (default. 엔티티 이름 사용)
    Catalog : catalog 기능이 있는 DB에서 catalog 를 매핑 (default. DB 명)
    Schema : schema 기능이 있는 DB에서 schema를 매핑
    uniqueConstraints : DDL 생성 시 유니크 제약조건을 만듦

@SequenceGenerator

  • 시퀀스 값을 지정하여 매핑한다.
  • <기본 키 생성 전략>
  • 직접 할당 : 기본 키를 애플리케이션에 직접 할당
    ㄴ em.persist()를 호출하기 전 애플리케이션에서 직접 식별자 값을 할당해야 함. 식별자 값이 없을 경우 예러 발생
  • 자동 생성 : 대리 키 사용 방식
  • IDENTITY : 기본 키 생성을 데이터베이스에 위임 (= AUTO_INCREMENT)
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
  • Statement.getGeneratedKeys() 를 사용해서 데이터를 저장함과 동시에 생성된 기본 키 값을 얻어 올 수 있음.
  • SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당,
    데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장
    유일한 값을 순서대로 생성(오라클, PostgreSQL, DB2, H2)

  • TABLE : 키 생성 테이블을 사용
    키 생성 전용 테이블 하나를 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어
    데이터베이스 시퀀스를 흉내내는 전략. 테이블을 사용하므로 모든 데이터베이스에 적용 가능

  • AUTO : 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(Default)
    Ex) 오라클 DB 선택 시 SEQUENCE, MySQL DB 선택 시 IDENTITY 사용

@GeneratedValue

  • 매핑한 시퀀스 값을 받아와 사용한다.

@Id

  • 기본키 p.k 역할

@Column

  • 칼럼 추가

@Column

  • 객체 필드를 테이블 컬럼에 매핑
  • 속성 중 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않음
  • 속성
    name : 필드와 매핑할 테이블 컬럼 이름 (default. 객체의 필드 이름)
    nullable (DDL) : null 값의 허용 여부 설정, false 설정 시 not null (default. true)
    @Column 사용 시 nullable = false 로 설정하는 것이 안전
    unique (DDL) : @Table 의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 적용
    columnDefinition (DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있음, default 값 설정
    (default. 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성)
    length (DDL) : 문자 길이 제약조건, String 타입에만 사용 (default. 255)
    percision, scale (DDL) : BigDecimal, BigInteger 타입에서 사용. 아주 큰 숫자나 정밀한 소수를 다룰 때만 사용
    (default. precision = 19, scale = 2)

@Enumerated

  • 자바의 enum 타입을 매핑할 때 사용
  • 속성
    value : EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
    EnumType.STRING : enum 이름을 데이터베이스에 저장
    (default. EnumType.ORDINAL)

@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에서 사용한 쿼리 메소드의 내용이다.
여러개의 쿼리 메소드를 이용해 쿼리문의 동작을 사용할 수 있다.

  • view
repository를 받는 BodardCrudRepository 파일에서 CrudRepository의 변수 값을 상속받아 사용한다.

이외에는 스프링 구조와 같게 view 동작을 만들면된다.

interface - service
Class - serviceImpl
		controller

스프링부트에서의 다양한 방법을 습득할수있도록
두고두고 읽어보면서 정리해야겠다.
화이팅

profile
Back-end Developer Preparation Students

0개의 댓글