JPA 이해

송영재·2022년 11월 20일

Spring

목록 보기
28/45
  • 1) ORM이란?

    💡 ORM: Object-Relational Mapping

    Object: "객체"지향 언어 (자바, 파이썬)
    Relational: "관계형" 데이터베이스 (H2, MySQL)

    • 백엔드 개발자(Backend Developer): 웹 서버를 개발하는 개발자

    • DBA (Database Administration): 데이터베이스 관리자. 데이터베이스를 설치, 구성, 관리 등의 일을 맡은 사람

      Questions)

    • ORM 이 없이 웹 서버 개발은 못 하나요?

      • ORM 없이도 충분히 웹 서버 개발 가능
      • 예) AllInOneController 에서 Repository 역할 분리
      • ORM 만든 이유?
        • ORM 이 없는 환경에서는 백엔드 개발자가 비즈니스 로직 개발보다 SQL 작성에 더 많은 노력을 들여야 하더라..
        • SQL 작성이 단순하고 반복적인데, 실수하기는 쉬움
      • 웹 서버 개발 언어(Java, Python, Javascript 등) 와 관계형 데이터베이스 언어 (SQL) 의 목적 및 사용방법이 다름
    • 그럼 이제 백엔드 개발자는 DB 에 대해 몰라도 되나요?

      • 아니요! 백엔드 개발자는 DB 에 대해 잘 알고 있어야 함
        • DB 테이블 설계, SQL Query 성능 확보 등
  • 2) JPA는?

    JPA: Java Persistence API
    자바 ORM 기술에 대한 표준 명세

    • JPA 샘플
      • 테이블 및 컬럼 매핑
        1. Java 클래스
            @Entity // DB 테이블 역할을 합니다.
            public class User {
            // ID가 자동으로 생성 및 증가합니다.
            @GeneratedValue(strategy = GenerationType.AUTO)
            @Id
            private Long id;
            // nullable: null 허용 여부
            // unique: 중복 허용 여부 (false 일때 중복 허용)
            @Column(nullable = false, unique = true)
            private String username;
            
            @Column(nullable = false)
            private String password;
            
            @Column(nullable = false, unique = true)
            private String email;
            
            @Column(nullable = false)
            @Enumerated(value = EnumType.STRING)
            private UserRoleEnum role;
            
            @Column(unique = true)
            private Long kakaoId;
            }
        2. DB 테이블 및 컬럼
Questions)

- JPA 가 없으면?
    - 직접 SQL 문을 작성해서 구현 가능
        - 예) AllInOneController 통한 신규 상품 등록
            
            ```java
            @RestController // JSON으로 데이터를 주고받음을 선언합니다.
            public class AllInOneController {
            		// 신규 상품 등록
                @PostMapping("/api/products")
                public Product createProduct(@RequestBody ProductRequestDto requestDto) throws SQLException {
                    // 요청받은 DTO 로 DB에 저장할 객체 만들기
                    Product product = new Product(requestDto);
            
                    // DB 연결
                    Connection connection = DriverManager.getConnection("jdbc:h2:mem:springcoredb", "sa", "");
            
                    // DB Query 작성
                    PreparedStatement ps = connection.prepareStatement("select max(id) as id from product");
                    ResultSet rs = ps.executeQuery();
                    if (rs.next()) {
                        // product id 설정 = product 테이블의 마지막 id + 1
                        product.setId(rs.getLong("id") + 1);
                    } else {
                        throw new SQLException("product 테이블의 마지막 id 값을 찾아오지 못했습니다.");
                    }
                    ps = connection.prepareStatement("insert into product(id, title, image, link, lprice, myprice) values(?, ?, ?, ?, ?, ?)");
                    ps.setLong(1, product.getId());
                    ps.setString(2, product.getTitle());
                    ps.setString(3, product.getImage());
                    ps.setString(4, product.getLink());
                    ps.setInt(5, product.getLprice());
                    ps.setInt(6, product.getMyprice());
            
                    // DB Query 실행
                    ps.executeUpdate();
            
                    // DB 연결 해제
                    ps.close();
                    connection.close();
            
                    // 응답 보내기
                    return product;
                }
            }
            ```
            
    - 실제로 과거엔 JPA 없이 웹 서버를 개발한 기업이 많았고, 현재도 유효
    
- JPA 사용 트렌드?
    - 과거엔 SQL 매퍼 (MyBatis, JdbcTemplate) 위주로 개발
    - 전 세계적으로 JPA 사용 빈도가 급격히 높아져 **현재는 JPA 가 대세!!**
    
- 하이버네이트 (Hibernate)?
    - JPA 는 표준 명세이고, 이를 실제 구현한 프레임워크 중 **사실상 표준**
    - 스프링 부트에서 기본적으로 "하이버네이트" 사용 중
    
    > 사실상 표준 (de facto, 디팩토)
    보통 기업간 치열한 경쟁을 통해 시장에서 결정되는 비 공식적 표준이다
    
    출처: [위키백과](https://ko.wikipedia.org/wiki/사실상_표준)
    > 

0개의 댓글