ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] JPA
    WEB/Spring 2023. 2. 15. 15:16

    JPA란?

    • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
    • ORM에 대한 자바 API 규격이며 Hibernate, OpenJPA 등이 JPA를 구현한 구현체

     

    JPA 장점

    • 생산성이 뛰어나고 유지보수가 용이
      • sql을 직접적으로 작성하지 않고, 객체를 사용하여 동작
      • DB컬럼이 추가될 때마다 테이블 수정이나 SQL 수정하는 과정, 값을 할당하거나 변수 선언 등의 부수적인 코드가 줄어듦
    • DBMS에 대한 종속성이 줄어든다.
      • DBMS가 변경된다 하더라도 소스, 쿼리, 구현 방법, 자료형 타입 등을 변경할 필요가 없다.

     

    JPA 단점

    • JPA의 장점을 살려 잘 사용하기 어려움
    • 복잡한 쿼리를 사용할 때 불리
    • 잘못 사용할 경우, 실제 SQL문을 직접 작성하는 것보다 성능이 떨어짐

     

    Entity 클래스 생성

    • 테이블 구조화 클래스
    • @Setter는 없음
      • Entity 클래스는 테이블 그 자체이기 때문에 각 컬럼에 대한 setter를 무작정 생성할 경우, 객체의 값이 어느 시점에 변경되었는지 알 수 없음
    • @Getter
      • 해당 클래스에 포함된 멤버 변수의 모든 getter 메서드를 생성
    • @NoArgsConstructor(access = AccessLevel.PROTECTED)
      • 해당 클래스의 기본 생성자를 생성
      • access 속성을 이용하여 동일한 패키지 내의 클래스에서만 객체를 생성할 수 있도록 제어
    • @Entity
      • 해당 클래스가 테이블과 매핑되는 JPA의 엔티티 클래스임을 의미
      • 기본적으로 클래스명을 테이블명으로 매핑
      • ex) user_role → UserRole
    • @Table
      • 클래스명과 테이블명이 다를 수밖에 없는 상황에서 사용
      • @Table(name = “user_role”)
    • @Id
      • 해당 멤버가 PK임을 의미
      • 보통 MySQL DB는 PK를 bigint 타입으로, 엔티티(Entity)에서는 Long 타입으로 선언
    • @GeneratedValue(strategy = GenerationType.IDENTITY)
      • PK 생성 전략을 설정
      • MySQL은 자동 증가(AUTO_INCREMENT)를 지원하는 DB이며, PK 자동 증가를 지원하는 DB는 해당 어노테이션을 선언해야 함.
      • 오라클과 같이 시퀀스(Sequence)를 이용하는 DB는 GenerationType.SEQUENCE를 이용
      • GenerationType.AUTO로 설정하게 되면 DB에서 제공하는 PK 생성 전략을 가져가게 됨
    • @Builder
      • 생성자 대신 이용하는 패턴
    @Getter
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @Entity
    public class Board {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id; // PK
    
        private String title; // 제목
    
        private String content; // 내용
    
        private String writer; // 작성자
    
        private LocalDateTime createdDate = LocalDateTime.now(); // 생성일
    
        @Builder
        public Board(String title, String content, String writer) {
            this.title = title;
            this.content = content;
            this.writer = writer;
        }
    
    }

    JPA 레파지토리(Repository) 인터페이스 생성

    • JpaRepository<T, ID> 인터페이스 상속
      • T: 클래스명, ID: PK 데이터 타입
      • ex) JpaRepository<Board, Long>
    public interface BoardRepository extends JpaRepository<Board, Long> {
    
    }
    
    @Service
    public class BoardService {
        @Autowired
        BoardRepository boardRepo;
    
        public String findBoard(long id) {
            Optional<Board> board = boardRepo.findById(id);
            return board;
        }
    
        public List<User> findAllBoard() {
            List<Board> board = boardRepo.findAll();
            return board;
        }
    
        public void delete(long id) {
            boardRepo.deleteById(id);
            System.out.println("삭제 성공");
        }
    }
    728x90

    'WEB > Spring' 카테고리의 다른 글

    [Spring] Querydsl  (0) 2023.02.15
    [Spring] Aop와 Scope  (0) 2022.10.31
Designed by Tistory.