본문 바로가기
CLASS/SPRINGBOOT

#7-1 / JPA 1 - 회원가입

by hingu 2024. 8. 21.

JPA : 빡세당

spring-boot + Database + thymeleaf + JPA + DAO 요렇게 때릴거임 이제

완젼 실무


🤷‍♂️❓ JPA 

  • Java persistence API  ( persistence : 종속성) => 자바의 종속성을 유지시키는 표준 인터페이스 모음
  • Hibernate , OpenJPA

 

✅ 설치

이거 체크 => pom.xml 체크 => fisish

 

 

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를 활용하여 적용