Spring Data JPA에 대해서 알아보자.
JPA 처리를 담당하는 Repository는 기본적으로 4가지가 있다.
Repository<T, ID>
CrudRepository<T, ID>
PagingAndSortingRepository<T, ID>
JpaRepository<T, ID>
T는 Entity의 타입클래스이고 ID는 P.K 값의 Type 이다.
CrudRepository는 관리되는 엔티티 클래스에 대해 정교한 CRUD 기능을 제공한다.
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
<S extends T> S save(S entity);
Optional<T> findById(ID primaryKey);
Iterable<T> findAll();
long count();
void delete(T entity);
boolean existsById(ID primaryKey);
// … more functionality omitted.
}
PagingAndSoringRepository
public interface PagingAndSortingRepository<T, ID extends Serializable>
extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
// page size 20으로 된 전체 목록에서 두번째 페이지를 아래아 같이 쉽게 가져올 수 있다.
PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));
이제 아주 심플한 CRUD 를 해보자.
pom.xml 에 JPA 를 이용하기 위한 dependency 정보를 넣어준다.
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Entiry 하나를 만든다. (Member.java)
Spring Boot project 를 Run 하면 member 테이블이 생성된 것을 확인할 수 있다.
이제 위에서 살펴본 crudRepository 를 이용해 보자.
Repository
package com.yhkim.study.member;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface MemberRepository extends CrudRepository<member, integer="">{
}
</member,>
Service
package com.yhkim.study.member;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class MemberService {
@Autowired
MemberRepository repo;
public List getMemberList(){
repo.findAll().forEach(mem->{
log.info(mem.toString());
});
return (List) repo.findAll();
}
public void saveMember(Member member) {
repo.save(member);
}
public void deleteMember(Member member) {
repo.delete(member);
}
}
Controller
@RestController
@Slf4j
public class APIController {
@Autowired
MemberService service;
@RequestMapping(value="/api/userlist", method=RequestMethod.GET)
public List getUserList(HttpServletRequest req) {
log.info("call api from ", req.getRemoteAddr());
return service.getMemberList();
}
@RequestMapping(value="/api/adduser", method=RequestMethod.POST)
public List addUser(@RequestParam String userId,
@RequestParam String userName,
@RequestParam(required=false) String email,
@RequestParam(required=false) String cellphone
) {
Member m = new Member(userId, "");
m.setName(userName);
m.setEmail(email);
m.setCellphone(cellphone);
service.saveMember(m);
return service.getMemberList();
}
@RequestMapping(value="/api/deluser", method=RequestMethod.DELETE)
public List delUser(@RequestParam Integer userIdx) {
Member m = new Member();
m.setIdx(userIdx);
service.deleteMember(m);
return service.getMemberList();
}
}
테스트 해 보자
잘 된다.
Query Tools (#QueryBox) 로 확인한 결과
브라우저에서 delete user 에 대한 처리 결과 (delete 후 select 하도록 처리)
'IT > JPA' 카테고리의 다른 글
LocalDate, LocalTime JPA Timezone 문제 (0) | 2020.03.25 |
---|---|
[JPA] null value was assigned to a property of primitive type setter of (0) | 2019.11.14 |
Spring Data JPA + QueryDsl (2) | 2019.09.09 |
JPQL, NativeSQL, Criteria, QueryDSL, JOOQ... (0) | 2019.09.06 |
@OneToMany 단방향을 @ManyToOne 양방향으로 (2) | 2019.08.28 |