Spring Boot (JPA, JPQL, Native SQL)
- JpaRepository
- 스프링 JPA 라이브러리에서 Entity에 대한 기본적인 CRUD가 가능하도록 만든 인터페이스
- Repository
- JpaRepository를 상속받아 엔티티Repository 인터페이스를 생성한다. (@Repository 어노테이션 추가)
- JPA
- Repository에서 작성하는 SQL문 자동 실행되는 함수
- JPA 기본 함수 종류
- finaAll()
- SELECT * FROM 테이블명 을 실행
- findBy열이름()
- SELECT 열이름 FROM 테이블명 을 실행
- 예시
- findById((long)2) ⇒ SELECT * FROM 테이블명 WHERE id=2;
- findByUser_id(”hong”) ⇒ SELECT * FROM 테이블명 WHERE user_id = ‘hong’;
- save()
- 테이블 값(row) 추가/업데이트
- INSERT문과 UPDATE문 동시 실행
- id 값을 보고 없으면 추가하고, 있으면 수정한다.
- delete()
- DELETE 문 실행
- count()
- SELECT COUNT(*) FROM 테이블명 을 실행
- finaAll()
- JPA 사용자 함수
- Repository에서 사용자가 직접 패턴에 맞는 메소드 이름을 작성하여 SQL문 자동 실행하는 메서드를 만들 수 있다.
- 메소드 이름의 패턴
- find + By + 필드이름 + And + 필드이름
- And, Or을 메소드 이름에 추가 가능
- OrderBy와 Desc, Asc 추가 가능
- First5, Last5 같이 n개로 개수 제한을 할 수 있다.
- 예시
- List<MemberEntity> findFirst5ByUserIdAndUserNameOrderByIdDesc(String userId, String userName);
- SQL문으로 SELECT * FROM member where user_id = :userId AND user_name = :userName ORDER BY id DESC LIMIT 5; 와 같다.
- List<MemberEntity> findFirst5ByUserIdAndUserNameOrderByIdDesc(String userId, String userName);
- JPA 쿼리 메소드 공식 레퍼런스
- JPA에서 SQL을 사용하는 방법
- JPQL
- 표준 ANSI SQL 문법을 지원한다. 특정 데이터베이스에 종속적인 기능은 지원하지 않는다.
- DB에 직접적인 쿼리를 실행하지 않으며 엔티티 테이블에 매핑하여 사용한다.
- @Query(value=”SQL 문 작성”) 어노테이션을 추가하여 작성한다.
- FROM 절 뒤에는 엔티티 클래스 이름을 넣어준다. (테이블명이 아닌 클래스이름!)
- 예시
-
@Query(value = "SELECT m FROM MemberEntity m WHERE m.userId = :userid") List<MemberEntity> findByUserId_JPQL_Query(String userid);
- 매개변수의 userid가 쿼리의 :userid에 대입하여 검색한다.
- 매개변수는 @Param(”userid”) String userid같이 입력 값도 가져올 수 있다.
-
- Native SQL
- DB에 직접적으로 쿼리를 실행시켜 속도가 빠르다. 여러 조인이나 복잡한 쿼리 작성 시 적합
- @Query(value=”SQL 문 작성”, nativeQuery = true) 어노테이션을 추가하여 작성한다.
- 추가로 UPDATE, INSERT, DELETE 문은 @Modifying, @Transactional 어노테이션을 추가해야 한다.
- 예시
-
@Query(value = "SELECT * FROM member WHERE user_id = :userid", nativeQuery = true) List<MemberEntity> findByUserId_nativeQuery(String userid); @Modifying @Transactional @Query(value = "UPDATE member SET user_id = :userid where id = :id", nativeQuery = true) int updateById_nativeQuery(Long id, String userid);
-
- JPQL
- JPA 사용하여 테이블 열 추가 및 조회 방법
- Repository 인터페이스 생성
- JpaRepository<엔티티클래스명, Long>을 상속(extends)하여 엔티티Repository 인터페이스 생성
- 인터페이스 위에 @Repository 어노테이션 추가
- 예시
- @Repository public interface MemberRepository extends JpaRepository<MemberEntity, Long> { }
- Controller 클래스 생성
- 위에서 생성한 Repository 인터페이스 생성자 주입
- private final 엔티티Repository 엔티티Repository;
- Controller 클래스 위에 @Controller, @RequiredArgsConstructor 어노테이션 추가
- save(), findAll() 등 Repository의 함수 사용
- 예시
-
@Controller @RequiredArgsConstructor public class MainController { private final MemberRepository memberRepository; @GetMapping("/") public String main(Model model) { // 테이블 값(row) 추가 (save와 new 사용) memberRepository.save(new MemberEntity(Long.valueOf(1), "hong", "1234", "홍길동", "ROLE_USER", LocalDate.now())); memberRepository.save(new MemberEntity(Long.valueOf(2), "tom", "1234", "톰아저씨", "ROLE_USER", LocalDate.now())); memberRepository.save(new MemberEntity(Long.valueOf(3), "admin", "1234", "관리자", "ROLE_ADMIN", LocalDate.now())); // 테이블의 전체 값 리스트에 추가 (findAll 사용) List<MemberEntity> list = memberRepository.findAll(); model.addAttribute("list", list); return "index"; } }
-
- 위에서 생성한 Repository 인터페이스 생성자 주입
- html 생성
- 컨트롤러에서 addAttribute 한 리스트 전체값 출력하기
- 타임리프 th:each 문 사용하여 리스트 값 전체 출력
- 예시
-
<!DOCTYPE html> <html lang="ko" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> </head> <body> <h2>회원목록</h2> <table class="table"> <thead> <tr> <th scope="col">번호</th> <th scope="col">ID</th> <th scope="col">아이디</th> <th scope="col">비밀번호</th> <th scope="col">이름</th> <th scope="col">권한</th> <th scope="col">가입일</th> </tr> </thead> <tbody> <tr th:each="member, status: ${list}"> <td><span th:text="${status.count}"></span></td> <td><span th:text="${member.id}"></span></td> <td><span th:text="${member.user_id}"></span></td> <td><span th:text="${member.user_pw}"></span></td> <td><span th:text="${member.user_name}"></span></td> <td><span th:text="${member.user_role}"></span></td> <td><span th:text="${member.joindate}"></span></td> </tr> </tbody> </table> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script> </body> </html>
-
- Repository 인터페이스 생성
728x90
'Back-end > Spring Boot' 카테고리의 다른 글
[Spring Boot] Model에서 Rest API로 변환 (0) | 2024.04.06 |
---|---|
[Spring Boot] Test (0) | 2024.04.06 |
[Spring Boot] Devtools, LocaleResolver(다국어 처리) (0) | 2024.04.03 |
[Spring Boot] builder, Rest API (0) | 2024.03.31 |
[Spring Boot] 데이터 전달, Param 값 받기, ArrayList (0) | 2024.03.31 |