정말 그저 갓... 교수님의 강의를 발견하게 되었다...
교육에서 스프링 배우기 전에 예습하고 가야겠다 (아무래도 진도가 빠른 편이라)
그나저나 요즘은 웹프로그래밍에서 스프링과 JPA를 배우네... 부럽다...
위 글은 김성렬 교수님의 KOCW강의를 보고 작성한 글로 자세한 내용은 해당 강의를 통해 확인하시길 권장합니다.
http://www.kocw.net/home/cview.do?cid=5e6aec4a9ae2dd45
스프링과 JPA를 이용한 웹개발
본 강의는 JPA와 스프링프레임워크를 이용한 웹 개발 방법을 설명하고 있습니다.
www.kocw.net
JPA: 자바 진영의 ORM(Object Relational Mapping) 표준인 JPA 기술
ORM: 객체 관계 매핑
Object는 자바의 Object
ORM으로 객체지향적인 프로그래밍과 관계형 데이터베이스의 상충하는 기술을 채워줄 수 있음
ORM의 역할: 자바 클래스와 데이터베이스 테이블을 매핑 (JDBC의 데이터 바인딩과는 다름)
JPA(Java Persistence API)
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 인터페이스: ORM이 가져야 할 특징과 기능을 가진 명세서
- 자바 진영의 ORM 표준
인터페이스에는 구현체가 존재해야 함
ORM이라 하면 Hibernate라 할 정도로 주로 많이 쓰며 대부분의 구조체에 해당함
자바 어플리케이션과 데이터베이스는 비종속적임
어떤 데이터베이스를 쓰던 신경쓰지 않고 개발 할 수 있게끔 함
JPA 사용시 장점
- CRUD(기본 쿼리) 자동 생성 및 실행
- 저장
- persist(엔티티): insert문이 실행
- 조회
- find(엔티티 타입, 식별자): select문 실행
- 식별자는 관계형 데이터베이스의 PK를 의미
- 엔티티는 반드시 식별자를 가져야 함
- 엔티티는 클래스를 의미
- find(엔티티 타입, 식별자): select문 실행
- 수정
- 특정 메소드 없이 자동으로 변경 감지 후 update: update문 실행
- 이러한 매커니즘을 더티 체킹이라 함
- 영속성 컨텍스트 체크
- persist로 되어 있는 엔티티가 변경이 되는지 계속 모니터링 함
- 트랜잭션이 종료되는 시점에 엔티티가 수정이 있었다 한다면 프로그래머는 엔티티를 변경, 즉 데이터 베이스 필드를 변형해야 한다는 의도를 가지고 있다고 JPA 스스로 해석함
- 특정 필드만 update문이 실행됨
- 특정 메소드 없이 자동으로 변경 감지 후 update: update문 실행
- 삭제
- remove (엔티티)
- 저장
- DB 벤더에 따른 SQL 생성 (방언)
- ex) 페이징: MySQL ➡️ Limit, Oracle ➡️ rownum
- JPA는 Dialect라는 추상화된 방언 클래스와 각각의 구현체를 제공함
- 데이터베이스가 변경되어도 SQL 수정 없이 JPA 설정만 변경하면 됨 (= 유동적임)
- Auto DDL 기능을 이용하여 테이블 자동 생성
- SQL을 모아서 한 번에 보내므로 성능상 이점
- 응용 레벨에서 Repeatable Read 수준의 격리 레벨 제공
- 객체지향 프로그래밍의 설계 원칙을 지키도록 도움 (Spring을 사용하는 궁극적인 이유)
JPA 단점
- 객체 응집력을 약화 시킴
- 테이블에 매핑된 엔티티와 별개로 DTO 추가 정의 필요
- 예상치 못한 SQL 발생 가능
Spring Data JPA
- 스프링 데이터 JPA는 JPA를 편하게 사용하도록 만든 모듈
- JPA(Hibernate)를 사용할 때 발생하는 보일러 플레이트 코드를 제거
- JPA를 사용할 때 발생하는 관습적인 코드 제거
- 순수 JPA를 사용할 경우, 게시글을 조회하는 findById라는 함수를 만들지만 이는 어쩌면 당연히 있어야 할 코드
- CRUD 처리를 위한 공통 인터페이스 제공
- 사용자는 아래와 같이 JpaRepository를 상속하는 인터페이스만 정의
public interface MemberRepository extends JpaRepository<Member, Long>
추가
- N+1 문제: JPA의 성능 튜닝에서 가장 중요한 개념
- JPQL
- JPA가 제공해주는 기본 CRUD외에 통계성 쿼리 등 복잡한 쿼리를 위해 JPQL은 트랜잭션 내에서 곧바로 실행되는 특성이 있으며 이는 N+1 문제와 연관 있음
- QueryDSL
- 문자열의 덧셈 연산을 통한 쿼리 작성은 불편하고 오류 발생 가능성이 높음
- 문자열의 덧셈 연산은 특히 동적 쿼리 작성 시 주로 사용
- 동적 쿼리 작성을 간편하고 재사용성이 높은 코드를 만들기 위함
'강의 > etc' 카테고리의 다른 글
[Spring/JPA] JPA 기초지식 (0) | 2022.04.20 |
---|---|
[Spring/JPA] 환경설정 (0) | 2022.04.19 |
[JS] 2022 30분 요약 강좌(1) (0) | 2022.03.15 |
[SwiftUI fundamental Tutorial] Redux (0) | 2021.10.16 |
[SwiftUI fundamental Tutorial] LazyVGrid (0) | 2021.10.07 |