00. 기본 개념
▶︎ ORM(Object Relational Mapping)
- 객체와 관계형데이터베이스 매핑, 객체가 테이블이 되도록 매핑시켜주는 프레임 워크
- 프로그램 복잡도를 줄이고 자바 객체와 쿼리를 분리할 수 있으며 트랜잭션 처리나 기타 데이터베이스 관련 작업들을
좀 더 편리하게 처리할 수 있는 방법
- SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있다.
: 기존쿼리( SELECT * FROM MEMBER;)를 ORM을 사용하면 member.findAll()이라는 메서드호출로 데이터 조회 가능
▶︎ JPA(Java Persistence API)
- 자바 ORM 기술에 대한 API 표준 명세, ORM을 사용하기 위한 표준 인터페이스 모아둔 것
- spring Boot는 Spring Data JPA를 구현한 Hibernate를 사용
- 결국 인터페이스 이기 때문에 JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은
ORM 프레임워크를 사용해야 한다. 이 외에도 Open JPA, TopLink등이 있다.
▶︎ Hibernate
- JPA를 사용하기 위해 JPA를 구현한 ORM 프레임워크 중 하나
- javax.persistence.EntityManager와 같은 JPA의 인터페이스를 직접 구현한 라이브러리
- entity : 현실상에 존재하는 db에 저장하고 싶은 개념
▷ JPA를 사용하는 이유
- 신규 컬럼 추가 등 CRUD SQL을 반복적으로 사용하는 DB중심 설계 단점을 개선하여 효율적으로 개발할 수 있는 방법.
- 장점 : 뛰어난 생산성, 유지보수 용이, DBMS에 대한 종속성 감소
- 단점 : 어려움(학습비용이 높음)
01. 설정방법
▶︎ pom.xml
- web, devtools, jpa 추가 (project 만들때 dependency 추가)
- ojdbc6, tomcat-embeded-jasper 추가 (따로 태그 가져와서 넣어준다.)
▶︎ application.properties
- port, view, resources, datasource, hibernate 설정
# port
server.port=8787
# encoding
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true
# view
spring.thymeleaf.prefix=/WEB-INF/views/
spring.thymeleaf.suffix=.html
# resources
spring.mvc.static-path-pattern=/resources/**
# datasource
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=kh
spring.datasource.password=kh
# hibernate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
spring.jpa.hibernate.ddl-auto=none
▶︎ Entity 클래스 생성(JpaDto)
- @Entity : JPA가 관리하는 클래스로 테이블과 매핑할 테이블은 해당 어노테이션을 붙인다.
- @Table : 테이블명 명시
- @Id : primary key(기본키) 지정
- @GenerateValue : table 생성 시 해당 필드를 PK, AUTO_INCREMENT로 설정하였기 때문에 직접 할당방식이 아닌,
자동으로 생성되도록 하기 위한 어노테이션. GenerationType.Auto는 기본키 생성을 자동으로 함
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity // javax.persistence.Entity
@Table(name = "MYBOARD") // javax.persistence.Table
public class JpaDto {
@Id // primary key
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
private int myno;
@Column
private String myname;
@Column
private String mytitle;
@Column
private String mycontent;
@Column
private Date mydate;
public JpaDto() {
super();
}
// 이하 생성자, getter-setter 생략
▶︎ Repository 설정(JpaDao)
- 여기서는 Impl 클래스와 Service(Biz)는 생략하고 인터페이스 Dao만 생성했다.
- JPA에서는 단순히 Repository 인터페이스를 생성한 후 JpaRepository<Entity, 기본키 타입>을 상속받으면
기본적인 CRUD가 자동으로 생성된다.
- findBy 뒤에 컬럼명을 붙여주면 이를 이용한 검색이 가능하다.
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.boot.jpa.model.dto.JpaDto;
@Repository
public interface JpaDao extends JpaRepository<JpaDto, Integer> {
public List<JpaDto> findAll();
public JpaDto findByMyno(int myno);
public JpaDto save(JpaDto dto);
public JpaDto saveAndFlush(JpaDto dto);
@Transactional
public void deleteByMyno(int myno);
}
▶︎ Controller 생성
import java.util.Date;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.boot.jpa.model.dao.JpaDao;
import com.boot.jpa.model.dto.JpaDto;
@Controller
@RequestMapping("/member")
public class JpaController {
@Autowired
private JpaDao dao;
@GetMapping("/list")
public String selectList(Model model) {
model.addAttribute("list", dao.findAll());
return "jpalist";
}
@GetMapping("/insertForm")
public String insertForm() {
return "insertForm";
}
@PostMapping("/insert")
public String insert(JpaDto dto) {
dto.setMydate(new Date());
dao.save(dto);
return "redirect:list";
}
@GetMapping("/selectOne")
public String selectOne(Model model, int myno) {
model.addAttribute("dto", dao.findByMyno(myno));
return "selectOne";
}
@GetMapping("/updateForm")
public String update(Model model, int myno) {
model.addAttribute("dto", dao.findByMyno(myno));
return "updateForm";
}
@PostMapping("/update")
public String update(JpaDto dto) {
dao.saveAndFlush(dto);
return "redirect:selectOne?myno=" + dto.getMyno();
}
@GetMapping("/delete")
public String delete(int myno) {
dao.deleteByMyno(myno);
return "redirect:list";
}
}
▶︎ View : 우선 게시판 목록을 보여주는 jpalist.html만 보도록 한다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>List</h1>
<table border="1">
<tr>
<th>MYNO</th>
<th>MYNAME</th>
<th>MYTITLE</th>
<th>MYDATE</th>
</tr>
<tr th:if="${list.size() == 0}">
<td colspan="4" align="center">-------- 작성된 글이 존재하지 않습니다. --------</td>
</tr>
<tr th:unless="${list.size() == 0}" th:each="dto:${list}">
<td th:text="${dto.myno}">myno</td>
<td th:text="${dto.myname}">myname</td>
<td><a th:href="|@{selectOne}?myno=${dto.myno}|" th:text="${dto.mytitle}">mytitle</a></td>
<td th:text="${dto.mydate}">mydate</td>
</tr>
<tr>
<td colspan="4" align="right">
<input type="button" value="write" onclick="location.href='./insertForm'"/>
</td>
</tr>
</table>
</body>
</html>
'Web > Spring' 카테고리의 다른 글
[Spring]SpringBoot02_Thymeleaf: utility, expression, params.. (0) | 2020.11.11 |
---|---|
[Spring]SpringBoot01 (0) | 2020.11.10 |
[Spring]MVC_08.jdbc_lamda(익명함수) (0) | 2020.11.07 |
[Spring]MVC_07.update (0) | 2020.11.07 |
[Spring]MVC_06.file (0) | 2020.11.06 |