관련 어노테이션
클래스에 붙이는 어노테이션 |
@Entity | 해당 클래스를 Entity로 사용하겠다고 선언 이 클래스는 Jpa가 관리 |
@Table(name = "테이블명") | Entity 클래스를 테이블로 설정(매핑) 테이블명 지정 가능 기본값은 클래스명 |
|
변수에 붙이는 어노테이션 |
@ID | 필드 변수와 연결되는 컬럼을 기본키로 설정(생성) |
@GeneratedValue | 자동으로 값을 생성하는 컬럼으로 설정(AI) MySQL의 auto-increment 설정 => strategy = GenerationType.IDENTITY로 설정 |
|
@Column | 필드 변수를 기반으로 테이블의 컬럼을 설정하기 위한 설정 - name : "필드명" => 기본값은 변수명 - nullable : true / false => false일 경우 null 허용 - length : 길이값(정수), 컬럼의 크기를 지정 |
|
@Creationtimestamp | Insert 시점의 일시를 저장하도록 설정 | |
@UpdateTimestamp | Update 시점의 일시를 저장하도록 설정 |
Package
1. Entity 클래스
Dto 겸 테이블 생성용 클래스
필드 변수명 작성 시 유의사항 : SQL 예약어 사용 금지 ex) insert, update, delete, select 등
@Entity
@Table(name = "producttbl")
@Data
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long pnum;
@Column(nullable = false, length = 45)
private String pname;
@Column(nullable = false)
private int price;
@Column(nullable = false)
private int amount;
@Column
@CreationTimestamp
private Timestamp rdate;
}
2. JpaRepository 인터페이스
CRUD 처리를 위한 인터페이스로, 테이블의 생성은 Entity로 하고 DML에 해당하는 select(R), insert(C), update(U), delete(D) 관련 처리를 하기 위한 인터페이스이다.
(Mybatis는 SQL을 작성해줘야 하지만, Jpa는 SQL 쿼리문도 자동 생성해준다)
Repository 인터페이스에서 제공하는 메소드)
- long count() : select count(*) from table
- save() : insert, update 처리
- delete(entity) : delete 처리 => deleteById(long id) - primary key로 delete
- findBy...() : select 처리 => selectById(long id) - primary key로 select
* @Query : 순수 SQL을 작성하여 활용
ex) @Query(value = "SELECT price FROM producttbl WHERE amount >= 10", nativeQuery = true)
public int selectPrice(int amount);
- ProductRepository.java
직접 기본으로 제공되는 메소드를 이용해 사용할 함수를 만들거나
Service class 내에서 Repository를 선언해 기본 메소드를 사용할 수도 있다.
import com.jsframe.spring_jpa.entity.Product;
import org.springframework.data.repository.CrudRepository;
public interface ProductRepository extends CrudRepository<Product, Long> {
}
- ProductService.java
@Service
@Log
public class ProductService {
@Autowired
ProductRepository pRepo;
ModelAndView mv;
public String inputProduct(Product product) {
log.info("inputProduct()");
String view = null;
try {
log.info("1. pnum : " + product.getPnum());
pRepo.save(product); // insert DB
log.info("2. pnum : " + product.getPnum());
view = "redirect:/";
} catch (Exception e) {
e.getStackTrace();
view = "redirect:/";
}
return view;
}
} // class end
목록 가져오기
전체 목록을 가져올 때는 findAll()을 사용한다.
findAll()은 Repository 인터페이스에서 제공하는 기본 메소드로, 테이블의 모든 데이터를 가져온다.
Iterable 객체를 주기 때문에 List로 변환하는 작업이 필요하다.
* Iterable(Iterator) 객체란?
비순차형 데이터 집합을 순차적으로 처리하도록 도와주는 객체이다. DB의 데이터는 대표적으로 비순차형 데이터 집합인 반면 List 객체는 순차적인 데이터 집합이다.
* 모아놓기 위한 구조체 <Set, Map>
Collection Framework로 set은 순서가 없으며, 똑같은 데이터를 넣을 수 없다. 따라서 일일이 데이터를 처리(확인)하기 없고, 이를 확인할 수 있도록 만드러준 것이 Iterable이다.
- ProductService.java
// 제품 목록 가져오기
public ModelAndView getList() {
log.info("getList()");
mv = new ModelAndView();
mv.setViewName("home");
List<Product> pList = new ArrayList<>(); // 순차적으로 데이터 저장
Iterable<Product> pIter = pRepo.findAll();
for(Product p : pIter) {
pList.add(p);
}
mv.addObject("pList", pList);
return mv;
}