본문 바로가기

Spring

Jpa_1강

  관련 어노테이션

클래스에 붙이는
어노테이션
@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;
}

'Spring' 카테고리의 다른 글

Jpa_3강  (0) 2022.11.18
Jpa_2강  (0) 2022.11.17
Jpa_0강  (0) 2022.11.08
Ajax_2강  (0) 2022.11.08
Ajax_1강  (0) 2022.11.08