JPA : 빡세당
spring-boot + Database + thymeleaf + JPA + DAO 요렇게 때릴거임 이제
완젼 실무
🤷♂️❓ JPA
- Java persistence API ( persistence : 종속성) => 자바의 종속성을 유지시키는 표준 인터페이스 모음
- Hibernate , OpenJPA
✅ 설치
thymeleaf.properties 추가
## jpa
#콘솔에 sql 문법출력 ddl
spring.jpa.show-sql=true
#자동으로 dao에서 설정된 값으로 신규 생성 및 자동 sql ddl 적용
spring.jpa.hibernate.ddl-auto=none
#create : table 생성
#update : table 초기화
#none - ddl-auto를 사용하지 않겠다, 만들어지지 않음
#validate : table을 생성하지는 않음. 단, 정상적으로 컬럼에 대한 매핑을 체크
#jpa에서 사용할 db명
spring.jpa.database=mysql
#db 에 대한 version을 설정하는 속성
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
#dao에 @Entity를 사용할 수 있도록 하는 속성
#최초 개발시 table을 만들땐 true, 그 외에는 false로 수정
spring.jpa.generate-ddl=false
#콘솔 화면에 sql ddl을 이쁘게 보여주기 위한 속성 (빼도 됨)
spring.jpa.properties.hibernate.format_sql=true
#hibernate log (Spring-boot 3.x + hibernate 6)
#prparedtatement 관련 버그가 발생 하였을 경우 출력하는 역할
logging.level.org.hibernate.SQL=DEBUG
jpa-datbase 연결 플랫폼 설정 방법
=> https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/dialect/package-summary.html
(요건 필수로 알아둘 사이트 )
MySQLDialect 요거 클릭
org.hibernate.dialect.MySQLDialect 요거 를spring.jpa.database-platform=에 넣으면 됨
❗ 개발 초기단계가 지나면
spring.jpa.hibernate.ddl-auto=none / spring.jpa.generate-ddl=false ⭐ 이 둘 중요!
로 변경 (초반에 table생성이 필요하면 각 create,true)
ddl-auto가 none 이어도 generate-ddl이 true면 생성됨
ddl-auto가 none이면 generate-ddl 속성을 따르고,ddl-auto가 none이 아니면 해당 적용값을 따름
(결국 ddl-auto가 우선이란 뜻인듯 )
👀 insert
- jpa_dao.class - dao
getter,setter만 사용하는게 아님!
아이디*
고객명 *
비밀번호 *
연락처 *
이메일 *
우편번호 *
상세주소 *
캐릭터 이미지
package kr.co.sen.web;
import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //@Setter,@Getter 모두 사용하겠다~
@Entity //JPA를 활용하겠다~ => @Table,@Id,@Column... 등등 사용 가능해짐
@NoArgsConstructor //파라미터가 없는 디폴트 생성자를 생성시
@AllArgsConstructor //모든 필드 값을 파라미터로 받는 생성자
@Table(name="member_ship")
public class jpa_dao {
@Id //primary key
@Column(nullable=false, columnDefinition="int auto_increment")
private int uidx;
//int는 굳이 length 작성 안해도 됨
//unique : unique key로 활용
@Column(nullable=false,unique = true,length=30)
private String uid;
//varchar(30) not null 과 같은 뜻(true : null)
@Column(nullable=false,length=30)
private String uname;
@Column(nullable=false,length=100)
private String upass;
@Column(nullable=false,length=11)
private String utel;
@Column(nullable=false,length=50)
private String uemail;
@Column(nullable=false,length=5)
private String upost;
@Column(nullable=false,columnDefinition="text") //길이제한 X
private String uaddr1;
@Column(nullable=false,columnDefinition="text")
private String uaddr2;
@Column(nullable=true,columnDefinition="text")
private String uimg;
@Column(nullable=false,columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private String today;
//LocalDateTime : 진짜 현재시간이 아닌 pc시간을 가져와서 적용하기때문에 실무에선 사용 X
//=> 서버시간으로 적용해야함
}
@NoArgsConstructor, @AllArgsConstructor
=> 이 두가지를 같이썼다 : 받을수도 있고 안 받을수도 있음
columnDefinition
데이터 속성 및 추가,default 등 입력시
@Table 어노테이션을 작성하지 않아 class명인 jpa_dao 가 table명으로 생성됨
🔽 서버 재가동시 table 생성됨
⭐ jpa로 테이블을 생성시 컬럼 순서로 설정이 되지 않음 ⭐
- 이 터미널의 순서 말고 , 내가 dao파일에 작성한 순서대로 넣어야함!
- 자동 table 만들때가 아니라면 사씔 실무에선 create는 잘 하지 않음
- 내가 해보니 설정 수정하고 서버 재가동시 걍 table 덮어써짐
- jpa_repo @Interface
package kr.co.sen.web;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
//JpaRepository<dao명 , primary key 속성>
public interface jpa_repo extends JpaRepository<jpa_dao, Integer>{
//jpa_repo 실행시킨순간 해당 쿼리문을 실행시키겟다
@Query("select now() as todays") //column명 : todays
String mysql_times(); //메소드 가져옴
}
@Query : sql ddl 강제 입력시 사용하는 어노테이션
- jpa_controller
package kr.co.sen.web;
import java.time.LocalDateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class jpa_controller {
@Autowired
private jpa_repo repo; //jpa interface를 load함
@GetMapping("/jpa_insert.do")
public String jpa_insert() {
//dao파일에 어노테이션 추가하는 방식으로 가져와도 됨
jpa_dao jd = new jpa_dao();
jd.setUidx(0);
jd.setUid("hong");
jd.setUname("홍길동");
jd.setUpass("a1234");
jd.setUtel("0102223333");
jd.setUemail("hong@naver.com");
jd.setUpost("12345");
jd.setUaddr1("서울시 마포구");
jd.setUaddr2("중앙빌딩 4층");
jd.setUimg("");
// LocalDateTime dt = LocalDateTime.now(); //pc시간 - 사용 X
String dt = repo.mysql_times(); //interface에서 return받음
jd.setToday(dt);
jpa_dao inserts = repo.save(jd); //save : insert 역할/무족권 dao를 활용하여 적용
System.out.println(inserts);
return null;
}
}
=> http://localhost:8081/jpa_insert.do 웹페이지 새로고침시 data insert 잘 되어있음!
=> mysql_times : local에선 내 pc 시간으로 insert되는것 같지만 실제 서버에 올리면 서버시간으로 잘 올라감!
👀 save : insert 역할/무족권 dao를 활용하여 적용
👀 delete
위 예제에 이어서 함
- Controller
@Controller
public class jpa_controller {
@Autowired
private jpa_repo repo; //jpa interface를 load함
@GetMapping("/jpa_delete.do")
public String jpa_detlete() {
jpa_dao jd = new jpa_dao();
jd.setUidx(7);
repo.delete(jd);
return null;
}
//~ 아래 insert 있음
}
=> http://localhost:8081/jpa_delete.do 웹페이지 새로고침시 data 삭제되어있음!
👀 delete : db data 삭제 역할/무족권 dao를 활용하여 적용
'CLASS > SPRINGBOOT' 카테고리의 다른 글
#8-1 / JPA 3 - 회원가입 list , delete ( onclick() + thymeleaf ) (0) | 2024.08.23 |
---|---|
#7-2 / JPA 2 - 회원가입 중복체크 , insert (0) | 2024.08.22 |
#6-3 / thymeleaf - 2차배열 출력 (0) | 2024.08.21 |
#6-2 / thymeleaf - 협업시 properties 분리 (0) | 2024.08.21 |
#6-1 / Thymeleaf 외부파일 로드 , layout (0) | 2024.08.21 |