SPRING - SPRING BOOT 4 jpa

최성현·2023년 10월 20일
1

SPRING BOOT 4

목록 보기
2/3

jpa

Spring Starter Project

dependencies 추가

5가지 필요

pom.xml

jpa 주석 부분 추가

		<!-- jstl -->
		<dependency>
		    <groupId>jstl</groupId>
		    <artifactId>jstl</artifactId>
		    <version>1.2</version>
		</dependency>
		
		<!-- tomcat-embed-jasper -->
		<dependency>
		    <groupId>org.apache.tomcat.embed</groupId>
		    <artifactId>tomcat-embed-jasper</artifactId>
		    <scope>provided</scope>
		</dependency>


		<!-- jpa -->

		<!-- jaxb-runtime -->
		<dependency>
		    <groupId>org.glassfish.jaxb</groupId>
		    <artifactId>jaxb-runtime</artifactId>
		    <version>2.3.1</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
		<dependency>
		    <groupId>javax.xml.bind</groupId>
		    <artifactId>jaxb-api</artifactId>
		    <version>2.3.1</version>
		</dependency>

application.properties

  • JPA setting
#JPA setting
#스키마생성 create:기존테이블을 삭제 후 생성,update:변경된 부분만 반영
spring.jpa.hibernate.ddl-auto=update
#ddl생성시 데이터베이스의 고유 기능을 사용할지
spring.jpa.generate-ddl=true
#api호출시 실행되는 sql문을 콘솔에 보여줄지
spring.jpa.show-sql=true
#사용할 프로그램 종류에 따라 아래줄들은 바꿔줘야한다 위는 동일
#사용할 데이터베이스 종류
spring.jpa.database=mysql
  • mysql setting
#mysql setting
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/coffee?serverTimezone=Asia/Seoul
spring.datasource.username=tjdgus
spring.datasource.password=1234

#mysql상세지정
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#jsp setting
spring.mvc.view.prefix=/WEB-INF/mycar/
spring.mvc.view.suffix=.jsp
spring.devtools.livereload.enabled=true

application.properties

server.port=9002

#mysql setting
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/coffee?serverTimezone=Asia/Seoul
spring.datasource.username=tjdgus
spring.datasource.password=1234

#JPA setting
#스키마생성 create:기존테이블을 삭제 후 생성,update:변경된 부분만 반영
spring.jpa.hibernate.ddl-auto=update
#ddl생성시 데이터베이스의 고유 기능을 사용할지
spring.jpa.generate-ddl=true
#api호출시 실행되는 sql문을 콘솔에 보여줄지
spring.jpa.show-sql=true
#사용할 프로그램 종류에 따라 아래줄들은 바꿔줘야한다 위는 동일
#사용할 데이터베이스 종류
spring.jpa.database=mysql

#mysql상세지정
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#jsp setting
spring.mvc.view.prefix=/WEB-INF/mycar/
spring.mvc.view.suffix=.jsp
spring.devtools.livereload.enabled=true

SpringBootJpaApplication.java

@EntityScan

dto인식
테이블이 어디에 생성됐는지에 대한 것을 등록

정확한 패키지명 등록 와일드카드(*)사용 불가

@EntityScan("mycar.data") //dto인식 //테이블이 어디에 생성됐는지에 대한 것을 등록

EnableJpaRepositories

dao인식
repository에 관한 bean 등록

정확한 패키지명 등록 와일드카드(*)사용 불가

@EnableJpaRepositories("mycar.data") //dao인식 //repository에 관한 bean 등록

SpringBootJpaApplication.java

package boot.mvc.tea;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@ComponentScan({"mycar.data"})
@EntityScan("mycar.data") //dto인식 //테이블이 어디에 생성됐는지에 대한 것을 등록
@EnableJpaRepositories("mycar.data") //dao인식 //repository에 관한 bean 등록
public class SpringBootJpaApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootJpaApplication.class, args);
	}

}

mycar.data 패키지

MyCarDto.java

  • @Entity
    테이블과 매핑
    @Entity가 붙은 클래스는 JPA가 관리하는 것

  • @Table
    mysql에 mycar라는 테이블을 자동으로 만들어줌

@Table(name = "mycar")
  • @Data
    lombok Annotation

  • @Id
    각 entity를 구별하는 식별(시퀀스) 아이디 갖도록 설계
    PK지정
    @Column 어노테이션을 지정하지 않으면 열 이름은 기본 키 속성 또는 필드의 이름으로 가정

주의
@Id primary key용 자료형은 Long 자료형 사용할 것을 권장(String 안됨)

  • @GeneratedValue
    기본키(PK) 값에 대한 생성 전략을 제공
    @Id 와 함께 엔티티 또는 매핑된 슈퍼클래스의 기본 키 속성 또는 필드에 적용
@GeneratedValue(strategy = GenerationType.AUTO)
  • strategy = GenerationType.AUTO
    hibernate.dialect에 설정된 DB 방언 종류에 따라, 하이버네이트가 자동으로 전략을 선택하게끔 위임
    **주의 :하이버네이트를 무조건 믿어선 안된다! 버전에 따라 선택되는 전략이 달라질 수 있으므로, 직접 DBMS에 맞는 전략을 지정

-> @Id 와 @GeneratedValue가 함께 쓰여져 기본키 설정

  • @Column(name = "carname") / @Column
    이름을 지정해주거나 / 이름 같으면 생략가능

  • @CreationTimestamp
    entity가 생성되는 시점의 시간 자동등록

  • @Column(updatable = false)
    수정시 이 컬럼은 수정하지 않겠다는 뜻 / update시 자동 update 안되도록 만들어줘야 함
    updatable = false 없을 시 날짜가 null로 찍힐 것

-- 메인에 entity등록 후 실행 해보고 퀀텀db를 가보면 기존 테이블이 있으면 새로 추가한 컬럼 생성되어있고 index를 따로 저장하는 hibernate_sequence가 생성되어있음

package mycar.data;

import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.CreationTimestamp;

import lombok.Data;

@Entity
@Table(name = "mycar") //mysql에 mycar라는 테이블을 자동으로 만들어줌
@Data
public class MyCarDto {

	@Id //각 entity를 구별하는 식별(시퀀스) 아이디 갖도록 설계
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long num;
	//이렇게가 기본키 설정
	
	@Column(name = "carname")
	private String carname;
	
	@Column //이름 같으면 생략가능
	private int carprice;
	
	@Column
	private String carcolor;
	
	@Column
	private String carguip;
	
	@CreationTimestamp //entity가 생성되는 시점의 시간 자동등록
	@Column(updatable = false) // 수정시 이 컬럼은 수정하지 않겠다는 뜻 / update시 자동 update 안되도록 만들어줘야 함
	// updatable = false 없을 시 날짜가 null로 찍힐 것
	private Timestamp guipday;
	
	// 메인에 entity등록 후 실행 해보고 퀀텀db를 가보면 기존 테이블이 있으면 새로 추가한 컬럼 생성되어있고 index를 따로 저장하는 hibernate_sequence가 생성되어있음
}

MyCarDaoInter.java

  • extends JpaRepository<MyCarDto, Long>
    JpaRepository<자료를 가져올 타입, 그 자료 안 기준 값>

jpa extends 받아오기 <dto,기본키 자료형>

package mycar.data;

import org.springframework.data.jpa.repository.JpaRepository;

public interface MyCarDaoInter extends JpaRepository<MyCarDto, Long>{ //jpa extends 받아오기 <dto,기본키 자료형> // JpaRepository<자료를 가져올 타입, 그 자료 안 기준 값>

}

MyCarDao.java

  • @Autowired MyCarDaoInter carInter;
    implement MyCarDaoInter 자동 생성해서 override 받으면 너무 많이 받기 때문에 inter 생성해서 @autowired로 받아와 사용

  • insert
    save - id타입 유무에 따라 자동으로 insert인지 update인지 갈린다 //id타입 없으면 insert 있으면 update로 인식

	//insert
	public void insertMyCar(MyCarDto dto)
	{
		carInter.save(dto); //id타입 유무에 따라 자동으로 insert인지 update인지 갈린다 //id타입 없으면 insert 있으면 update로 인식
	}
package mycar.data;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MyCarDao{

	@Autowired
	MyCarDaoInter carInter; //implement MyCarDaoInter 자동 생성해서 override 받으면 너무 많이 받기 때문에 inter 생성해서 @autowired로 받아와 사용
	
	//insert
	public void insertMyCar(MyCarDto dto)
	{
		carInter.save(dto); //id타입 유무에 따라 자동으로 insert인지 update인지 갈린다 //id타입 없으면 insert 있으면 update로 인식
	}
	
	//전체출력
	public List<MyCarDto> getAllDataes()
	{
		return carInter.findAll();
	}
	
	//num에 대한 값(dto) 반환
	public MyCarDto getData(Long num)
	{
		return carInter.getReferenceById(num);
	}
	
	public void updateMyCar(MyCarDto dto)
	{
		carInter.save(dto);
	}
	
	public void delete(Long num)
	{
		carInter.deleteById(num);
	}
	
}

MyCarController.java

spring framework 3 와 똑같이 사용하면 된다

package mycar.data;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyCarController {

	@Autowired
	MyCarDao dao;
	
	@GetMapping("/car/carlist") //시작..
	public ModelAndView list()
	{
		ModelAndView model=new ModelAndView();
		
		List<MyCarDto> list=dao.getAllDataes();
		
		model.addObject("list", list);
		model.addObject("totalCount", list.size());
		
		model.setViewName("carlist");
		
		return model;
	}
	
	@GetMapping("/car/carform")
	public String form()
	{
		return "addform";
	}
	
	@PostMapping("/car/insert")
	public ModelAndView insert(@ModelAttribute MyCarDto dto)
	{
		ModelAndView model=new ModelAndView();
		
		model.addObject("dto", dto);
		
		dao.insertMyCar(dto);
		
		model.setViewName("redirect:carlist");
		
		return model;
	}
	
	@GetMapping("/car/updateform")
	public String updateform(@RequestParam Long num,Model model)
	{
		MyCarDto dto=dao.getData(num);
		
		model.addAttribute("dto", dto);
		
		return "uform";
	}
	
	@PostMapping("/car/update")
	public ModelAndView update(@ModelAttribute MyCarDto dto)
	{
		ModelAndView model=new ModelAndView();
		
		dao.updateMyCar(dto);
		
		model.setViewName("redirect:carlist");
		
		return model;
	}
	
	@GetMapping("/car/delete")
	public String delete(@RequestParam Long num)
	{
		dao.delete(num);
		
		return "redirect:carlist";
	}
	
}

img

img는 src/main/resources에 있는 static이 기본값이기에 ../사진이름 으로 넣으면 된다

<img alt="" src="../20.jpeg">
profile
백엔드 개발자로서 성장해 나가는 성현이의 블로그~

0개의 댓글