본문 바로가기
공부기록/Spring

5월 31일 Spring - thymeleaf, JPA

by project100 2023. 5. 31.

thymeleaf 게시판 - 회원가입 화면까지

로그정보만 넣으면 됨

파일 업로드 처리를 하려면 webapp까지는 만들어야 한다.

html 파일로 만들어서 작성

jsp에서 사용하던 것과 다름 view 없음

 

세션 정보을 불러올 때에는 session. 으로 불러온다.

redirect일 때에는 변수명만 작성

 

dao, dto, service, controller

 

 

* build 자동 설정

 

 


JPA(Java Presistence API)

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 관련 API

 

* 관계형 데이터베이스(RDB)

테이블(엔티티)과 테이블 간의 관계로 데이터를 저장하는 방식의 데이터 베이스

예) My SQL, 오라클, 마리아DB 등

 

HIbernate : JPA의 구현체

JPA는 인터페이스, Hibernat는 구현 클래스

 

Spring Data JPA  : JPA와 HIbernate를 사용하기 쉽게 만든 Spring 라이브러리

Entity 클래스(DTO)를 구현하면 해당 클라스에서 지정한 테이블 이름 및 컬럼이름으로  DB 테이블을 자동으로 생성하며, DB CRUD에 대한 메소드로 제공한다.

 

메소드 이름으로 SQL 쿼리문을 생성하는 방식을 사용한다.

 

application.properies 설정

- DebTools(Thymeleaf) 설정

- static resource

- Datasource(DB) 설정

- JPA 설정

- DB log 설정

 

프로젝트마다 setting 해줘야 한다.

 
# DebTools setting
spring.devtools.livereload.enabled=true
spring.devtools.restart.enabled=true
spring.thymeleaf.cache=false

# static resource
spring.web.resources.static-locations=classpath:static/

# data source
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/berrydb?serverTimezone=Aisa/Seoul
spring.datasource.username=buser
spring.datasource.password=12341234

# JPA setting
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=update

# JPA Log setting(DB log)
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
logging.level.org.hibernate.type.descriptor.sql=trace

 

JPA 초기화 전략 설정(a.k.a JPA 설정)

spring.jpa.generate-ddl : true로 설정하면 해당 데이터를 근거로 서버 시작 시에 DDL 문을 생성하여 DB에 적용

DDL 생성 시 데이터베이스 고유의 기능을 사용하는지에  대한 유무 체크(잘 처리 되지 않아서 false로 설정)

spring.jpa.hibernate.ddl-auto : 'create table' 관련 설정 (실질적으로 사용)

- none : 아무런 작업도 하지 않음(DB에 테이블을 따로 생성) (mysql에 설정된 것을 사용)

- creat :  서버가 시작할 때 기본 테이블을 DROP 하고 새 DDL을 실행(테이블 재생성) (매법 새로운 시작이기 때문에 잘 사용하지 않음)

- create-drop : 서버가 시작할 때 DROP 및 CREATE하고, 서버가 종료될 때 DROP 실행(잘 사용하지 않음)

- update : 기존 테이블에 해당하는 Entity 클래스가 변경되면 기존 테이블을 DROP하고, 새 클래스에 맞게 테이블 생성

변경된 내용이 없으면 테이블 유지(많이 사용)

- validate : Entity와 테이블이 잘 맵핑되어 있는지 확인하여, 맞지 않을 경우 프로그램을 종료시킴

spring.jpa.database-platform : 각 DBMS에 맞게 SQL을 생성하도록 도와주는 dialect(방언)객체를 지정.(명확성)

 

간단한 테이블 명세

테이블명 ; jpatbl

컬럼 >

 - code : 자동증가 처리, 기본키

 - strdata : 문자열 저장, 길이 50자, 필수입력

 - intdata : 정수저장, null 허용

 - regdate : 저장 날짜시간 저장, 기본값.

 

Entity class

DB 테이블과 연계하기 위한 클래스

DTO의 역할도 함께 처리할 수 있음(따로 작성하는 경우가 일반적, 작은 프로젝트의 경우 DTO는 작성하지 않고 처리 가능)

 

워크벤치랑 같이 사용하면 렉이 걸리는 경우가 있으므로 닫아놓고 사용

package com.raspberry.jpaprj.entity;

import jakarta.persistence.*;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;

import java.sql.Timestamp;

@Entity
// 테이블명 지정
@Table(name = "jpatbl")
@Data
public class jpaData {
    @Id
    // mysql 자동증가 설정, long으로 설정
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long code;
    // 데이터 베이스는 대소문자를 가리지 않기 때문에 _를 사용, not null = false, 길이
    @Column(name = "str_data", nullable = false, length = 50)
    private String strdata;

    @Column(name = "int_data")
    private int intdata;

    @Column(name = "reg_date")
    @CreationTimestamp
    private Timestamp regdate;
}

 

사용하는 어노테이션

1) @Entity : entity 임을 선언하는 어노테이션(DB DDL 생성 시 활용)

2) @Table : DB 테이블의 이름을 지정, 생략 시 클래스 이름을 테이블 생성(명시적으로 작성해 주는 것이 좋다.)

                   테이블명은 스네이크케이스('_')을 사용하는 것을 권장(클래스명 카멜케이스, 테이블 스네이크케이스)

3) @Id :  필드를 테이블의 기본키로 설정하는 어노테이션

4) @GeneratedValue : 자동으로 생성되는 키 값에 대한 설정

                                     My SQL의  Auto-Increment는 GenerationType.IDENTITY로 설정

                                     DBMS마다 설정 값이 다르다. 오라클은 GenerationType.AUTO

5) @Column :  필드를 테이블의 컬럼으로 설정하는 어노테이션(생략 시 필드명으로 컬러명 생성)

 다음 옵션으로 여러설정을 할 수 있다.

- name :  필드명과 다르게 컬럼명을 지정

- nullable : false - > not null. 생략 시 null 허용 컬럼

- length : 컬럼의 길이 지정

- columnDefinition :  그 외 컬럼의 제약 조건 설정

   예) 날짜 타입의 기본값을 설정하는 경우

    columnDefinition = "DATE DEFAULT CURRENT_DATE"

6) @ColumnDefault("값") :  컬럼의 기본값을 설정. 문자열

    예)  정수형 컬럼에 기본값 0 

           @ColumnDefalut("0")

7) @CreationTimestamp/@UpdateTimestamp(수정)

     insert 또는 update 날짜 시간을 기본값으로 설정(datetime 타입에서 사용)

8) @Transient : 컬럼으로 생성하지 않는 필드에 붙이는 어노테이션

 

Repository 인터페이스

DAO 역할을 하는 인터페이스. 이 인터페이스 내부에 다양한 작업을 위한 메소드를 작명 규칙에 맞게 작성.

작명 규칙 참고 사이트 : https://zara49.tistory.com/130

 

[JPA] JPA Repository 메서드 명명규칙

JPA는 우리가 쿼리를 열심히 짜는것을 대신해 간단하게 표현하여 쿼리를 사용할 수 있도록 해준다. 그렇다면 어떤 형태로 메소드 이름을 붙이면 되는지, 명명 규칙에 대해 간략하게 정리해두자.

zara49.tistory.com