[SPRING] WIL - 7

진규빈·2024년 12월 21일
0

스프링 WIL

목록 보기
7/8

1. 스터디 복습

ORM(Object-Relational Mapping)

객체 지향 프로그래밍에서 객체와 관계형 데이터베이스의 테이블 간 데이터를 자동으로 매핑하는 기술
• 영속성?
• 필요성: SQL 쿼리 직접 작성 X 객체 지향적인 방식으로 DB 작업 처리
• 생산성 향상, 유지보수 용이

JPA(Java Persistence API)

자바 표준 ORM 명세로, 애플리케이션과 데이터베이스 간 데이터 처리 로직 추상화
• 자바의 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음
• SQL 중식적인 개발 => 객체 중심적인 개발
◦ 생산성 증가
◦ 유지보수 수월
◦ Object와 RDB 간의 패러다임 불일치 해결

Hibernate

자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 프레임워크
• JPA(Java Persistence API) 표준의 구현체 중 하나로, JPA의 명세를 따르면서도 자체적인 추가 기능을 제공
◦ ORM 기능: 객체와 관계형 데이터베이스 간의 매핑
◦ JDBC 추상화
◦ JPQL(Java Persistence Query Language), 네이티브 SQL, Querydsl 등 다양한 쿼리 언어 지원
◦ 캐싱 기능
◦ 데이터베이스 독립성
• SessionFactory 사용해서 session을 만들어 DB와 커뮤니케이션

<사용 방법>
1) 엔티티 클래스 작성

@Entity
@Table(name = "users")
public class User {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "name")
    private String name;
    
    @Column(name = "email")
    private String email;

2) 엔티티 매니저 작성

EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit")
EntityManager em = emf.createEntityManager();

3) CRUD 작업 수행

// Create
em.getTransaction().begin();
User user = new User("Chaeyami", "chaeyami@example.com");
em.persist(user);
em.getTransaction().commit();

// Read
User foundUser = em.find(User.class, user.getId());

// Update
em.getTransaction().begin();
foundUser.setEmail("chaeyami02@example.com");
em.merge(foundUser);
em.getTransaction().commit();

// Delete
em.getTransaction().begin();
em.remove(foundUser);
em.getTransaction().commit();

2차 캐싱

영속성 컨텍스트의 1차 캐싱을 넘어, 애플리케이션 전체에서 데이터를 캐싱하여 성능 최적화

지연 로딩 (<-> 즉시 로딩)

필요한 시점에 데이터를 로딩하는 방식

<동작 원리>
◦ 엔티티를 조회할 때, 연관된 데이터를 프록시(Proxy) 객체로 대신 설정
◦ 연관된 데이터에 접근하면 Hibernate가 데이터베이스에서 필요한 데이터를 실시간으로 조회

Batch Fetching 전략

JPA에서 지연 로딩(Lazy Loading)으로 인해 발생하는 N+1 문제를 해결하기 위한 전략
• N+1 문제: 하나의 엔티티를 조회한 후 연관된 데이터를 개별적으로 가져오면서 N번의 추가 쿼리가 발생하는 문제

<동작 원리>
연관된 데이터를 개별적으로 조회하는 지연로딩과 달리,
연관된 데이터의 ID를 모아서 한 번에 조회하여 쿼리 호출 횟수를 줄인다

2. 과제

코드

https://github.com/kyubinjin/library-system

폴더 구조

src/
├── main/
│   ├── java/
│   │   └── com/gdg/library/
│   │       ├── controller        // API 요청 처리
│   │       ├── service           // 비즈니스 로직 처리
│   │       ├── repository        // DB 접근
│   │       └── model             // 엔티티 정의
│   ├── resources/
│       ├── static/               
│       ├── templates/             
│       └── application.properties 
├── test/
│   └── java/
│       └── com/gdg/library/
│           └── LibraryApplicationTests.java

실행 결과 화면


도서 목록 조회
처음이라 빈 배열

도서 추가

도서 삭제

멤버 추가

멤버 목록 조회

멤버 이메일 수정

h2 콘솔에서도 수정된 것 확인

대출 POST

반납 POST

대출 목록 조회

제목으로 검색

작가로 검색

<간단 회고>
◦ 처음 프로젝트 설정하는 것부터 살짝 헷갈려서 다시 강의 일부분 찾아보면서 Spring Initializr 사용했다... 얼른 익숙해지길!!
◦ 검색했을 때 Lombok이라는 Dependency 설정하면 Class에 getter, setter, toString, equals, constructor 등의 메소드들을 간단한 어노테이션(@)으로 지정해줄 수 있어 자바특유의 장황한 클래스를 줄여준다길래 사용해보았는데 코드가 정말 깔끔해졌다:)

3. 김영한 스프링 입문 강의

21강.

22강.

23강.

24강.

25강.

26강.

0개의 댓글