1. class

    1. 클래스는 객체를 만들기 위한 설계도 도면 입니다.
    2. 객체지향 프로그래밍(oop)의 핵심 개념으로, 속성(필드) + 동작 (메서드) 를 하나로 묶어 표햔합니다.
    public class Cars(
    	String water;
    	int L
    	void drink(){
    		System.out.println("물을 마심니다.")
    	}
    	)
    
    1. Cars myCars = new Cars(); Cars 라는 클래스 설계도로 myCars 라는 객체를 생성
      1. class의 장점
        1. 재사용성
          1. 한 번 만든 클래스를 여러 객체에서 재사용 가능
        2. 유지보수 용이
          1. 코드 구조가 명확하고, 변결 시 영향 범위를 예측하기 쉬움
        3. 캡슐화
          1. 데이터 은닉하여 보안성 강화, 코드 안정성 증가
        4. 상속과 다형성
          1. 중복 코드를 줄이고, 다양한 방식으로 확장 가능
        5. 추상화
          1. 현실 세계 개념을 직관적으로 코드로 표현 가능
      2. class의 단점
        1. 복잡성 증가
          1. 작은 프로그램도 클래스를 남발하면 구조가 복잡해지고 불필요하게 무거워질수 있음
        2. 메모리 사용량 증가
          1. 객체를 많이 생성하면 메모리를 많이 차지할 수 있음
        3. 절차 지향보다 성능이 떨어질 수 있음
          1. 함수 단위로만 빠르게 처리하는 절차지향보다, 객체지향은 구조와 유연성을 고려해서 속도가 느릴 수 있음
        4. 설계가 어려울 수 있음
          1. 잘못된 클래스 설계는 오히려 유지보수를 어렵게 만들 수 있음
    2. ORM(Object-Relational Mapping)
      1. ORM를 사용하다보면 RDB데이터베이스를 JAVA와 같은 객체지향적으로 접근할 수 있습니다.
      2. JPA
        1. 표준 인터페이스
          1. Hibernate, EclipseLink 등 다양한 구현체 존재

            1. Hibernate
              1. JPA는 표준 인터페이스고 Hibernate는 그 구현체 중 하나이다.
              2. 장점
                1. JPA 표준이고 확장기능이 가능합니다.
                2. 전략이 SINGLE_TABLE, JOINED, TABLE_PER_CLASS인 일반 JPA와 다르게 일반 JPA 전략 + UUID, Enhanced Generator 이 있습니다.
          2. RDB 테이블을 객체(class)와 매핑하여, SQL 대신 CRUD 수행

            1. 엔티티 → 테이블
            2. 속성 → 컬럼
            3. 객체 인스턴스 → 테이블의 한 행
          3. 자동 영속성 관리

            1. EntityManager 가 객체 상태를 추적하여 DB에 자동 반영
              1. EntityManager가 하는 일
                1. JPA에서 엔티티 객체를 관리하는 핵심 관리자입니다.
                2. 객체상태를 추적하고 필요하는 자동으로 DB반영이 가능합니다
                  1. spring.jpa.hibernate.ddl-auto=update
                3. Transient
                  1. 새로 생성된 객체, DB연결 x
                4. Managed
                  1. EntityManager가 관리하는 상태. 객체 변경을 감지하고 DB에 반영
                  2. Detached 관리가 끝난 객체. EntityManager와 연결 끊김
                  3. persist(), merge(), remove() 등 메서드로 쉽게 CRUD가능
          4. 트랜잭션 관리와 캐시 지원

          5. JPQL 지원

            1. 객체 중심 쿼리 언어 (JPQL) 지원
            2. SQL보다 객체지향적이며, DB벤더에 독립적
            3. JPQL
          6. JPA의 장점

            1. 객체 지향적 설계의 편리성
              1. SQL을 작성할 필요 없음
              2. 도메인 모델 중심 설계 가능
            2. 재사용성과 유지 보수 용이
            3. 벤더 독립적
            4. 자동 트랜잭션 및 영속성 관리
              1. 데이터 일관성 유지
            5. 복잡한 관계 매핑 지원
          7. JPA의 단점

            1. 영속성 컨텍스트, 지연 로딩, JPQL, CASCADE 옵션 이해가 필요

            영속성 컨텍스트와 트랜잭션

            1. 복잡한 쿼리 최적화가 필요할 때 직접 SQL을 작성해야 하는 경우가 있음(JPQL과는 다름)
            2. 대규모 배치 처리에서는 성능이 떨어질 수 있음
            3. 추가 라이브러리 필요
            4. 과도한 추상화 가능성
              1. ORM이 자동으로 처리해 주지만, 내부 동작을 이해하지 못하면 예상치 못한 동작 발생
          8. 레퍼런스는 객체 지향 프로그래민에서 한 객체가 다른 객체를 참조하는 관계

    3. JPQL
      1. 객체 중심 쿼리

        1. SQL은 테이블과 컬럼을 기중으로 쿼리가 되지만, JPQL은 엔티티 클래스와 필드를 기준으로 쿼리 JPA의 쿼리 언어라고 보면 됩니다.
        // SQL
        SELECT * from user WHere name = "Alice";
        
        //JPQL
        Select u FROM User u WHere U.name = "ALICE"
        

        User는 클래스 이름, u.name 은 객체 필드

        1. DB 벤더에 독립적
        2. 객체 결과 반환
          1. 쿼리 결과가 엔티티 객체로 바로 반환합니다.
        3. SQL 처럼 RedultSet → 객체 매핑 과정을 직접 할 필요 없음
          1. SQL을 쓰면 ResultSet이라는 테이블 형태로 데이터를 받는데 그걸 개발자가 하나하나 데이터를 꺼내서 객체(class)에 넣어야 합니다.
          2. 하지만 JPQL을 쓰면 SQL처럼 데이터를 가져오지만 테이블 형태에서 객체로 데이터를 넣는 것이 아니라 바로 엔터티 객체로 만들어 집니다.