북 스터디/스프링 부트 핵심가이드

데이터베이스 연동 - 2

EnoughTT 2023. 3. 26. 18:16

ORM

ORM은 Object Relational Mapping의 줄임으로 '객체 관계 매핑'을 의미함. 객체와 RDB (Relational DataBase)의 테이블을 자동으로 매핑하는 방법

 

자바 클래스는 RDB 테이블과 불일치가 존재할 수 밖에 없음. ORM이 불일치와 제약사항을 해결하는 역할을 함

ORM을 사용하면 코드로 데이터를 조작할 수 있음.

 

  • ORM 장점
    • 데이터베이스 쿼리를 객체지향적으로 조작 할 수 있음
      • 개발 비용 ↓
      • 가독성 ↑
    • 재사용 및 유지보수가 편리함
    • 데이터베이스에 대한 종속성이 줄어듦
      • 데이터베이스를 교체하는 상황에서도 비교적 적은 리스크를 부담
  • ORM 단점
    • 온전한 서비스 구현의 한계
      • 복잡한 쿼리를 정확한 설계 없이 ORM만으로 구성하게 되면 속도 저하 등의 성능 문제가 발생할 수 있음
    • 객체 관점과 데이터베이스의 관계 관점의 불일치 발생

 

JPA

JPA (Java Persistence API)는 ORM 기술 표준으로 채택된 인터페이스의 모음
ORM이 큰 개념이라면 JPA는 더 구체화된 스펙을 포함함
적절한 SQL을 생성하고 데이터베이스를 조작해서 객체를 자동 매핑하는 역할

 

JPA 대표적 구현체

Spring Data JPA

Spring Data JPA 는 JPA를 편리하게 사용 할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나
CRUD 처리에 필요한 인터페이스 제공
리포지토리 (Repository)를 정의해 사용 → 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작

 

영속성 컨텍스트 (Persistence Context)

애플리케이션과 데이터베이스 사이에서 엔티티와 레코드의 괴리를 해소하는 기능과 객체를 보관하는 기능을 수행
엔티티 객체가 영속성 컨텍스트에 들어와 JPA의 관리 대상이 되는시점부터는 해당 객체를
영속 객체 (Persistence Object) 라고 함.

 

영속성 컨텍스트는 세션 단위의 생명주기를 가지기 때문에 세션이 종료되면 영속성 컨텍스트도 없어짐.

 

엔티티 매니저 (EntityManager)

엔티티를 관리하는 객체
CRUD 작업 수행

엔티티의 생명주기

  • 비영속 (New) : 영속성 컨텍스트에 추가 되지않은 엔티티 객체의 상태
  • 영속 (Managed) : 영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태
  • 준영속 (Detached) : 영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태
  • 삭제 (Removed) : 데이터베이스에서 레코드를 삭제하기 위해 영속성 컨텍스트에 삭제 요청 한 상태

 

데이터베이스 연동

프로젝트 생성 시 Spring Data JPA 의존성을 추가 후 별도 설정이 필요함.

application.properties

 

/*
*	데이터베이스 설정
*/
spring.datasource.driverClassName		// 데이터베이스의 드라이버를 정의
spring.datasource.url					// DB 경로임을 명시 (경로, 데이터베이스명)
spring.datasource.username			// 계정 정보
spring.datasource.password			// 계정 정보

/*
*	하이버네이트 사용시 설정 (선택사항)
*/
spring.jpa.hibernate.ddl-auto
	/*
    	데이터베이스 자동 조작 옵션
        	- create : 애플리케이션 가동, SessionFactory가 실행될 때 기존 테이블 삭제 후 생성
            	- create-drop : create 와 동일 기능, 애플리케이션 종료시 테이블 삭제
            	- update : SessionFactory가 실행될 때 검사후 변경된 스키마 갱신, 기존 데이터 유지
            	- validate : 검사 실행 -> 과정에서 테이블 정보와 객체의 정보가 다르면 에러
            	- none : 기능 사용 안함
            
            개발환경 시
            	- create 또는 update 사용
            운영환경 시
            	- validate 또는 none 사용
    */
spring.jpa.hibernate.show-sql			// 하이버네이트가 생성한 쿼리문 출력 옵션
spring.jpa.properties.hibernate.format_sql	// 보기 좋게 포맷팅

 

엔티티 설계

테이블에 대응하는 클래스
데이터베이스에 쓰일 테이블과 컬럼을 정의
어노테이션 (@)을 사용하면 테이블 간의 연관관계를 정의할 수 있음

 

엔티티 관련 기본 어노테이션 (@)

  • @Entity : 해당 클래스가 엔티티임을 명시, 클래스는 테이블과 1:1 매칭
  • @Table : 클래스의 이름과 테이블의 이름이 다를 경우에 쓰임 / Table(name = 값)
  • @Id : 테이블의 기본값 역할, 모든 엔티티는 @Id 어노테이션이 필요함
  • @GeneratedValue : @Id 어노테이션과 같이 사용, 해당 필드의 값을 어떤 방식으로 자동생성할지 결정
    • AUTO
    • IDENTITY
    • SEQUENCE
  • @Column : 필드에 설정 시 사용
    • name
    • nullable
    • length
    • unique
  • @Transient

 

Repository (리포지토리) vs DAO (Data Access Object, 다오)

Repository 와 DAO는 역할이 비슷함.

아직 차이점을 모르겠음.

이에 잘 정리되어 있는 포스팅을 남김.

 

Repository와 DAO 차이?

서론 Spring MVC를 사용할 때는 DAO를 데이터베이스를 연결하는 객체로 생각하고 여기에 SQL문을 다 넣었었다. JPA를 배우고 난 뒤에 JpaRepository를 구현하면서 DAO는 자연스럽게 Repository로 생각하고 넘

bbbicb.tistory.com

 

Repository와 Dao의 차이점.

Repository와 Dao의 차이점에 대한 논쟁은 이전부터 끝없이 진행되어 왔다. 이번 포스팅에서는 Repository와 Dao의 차이에 대한 나의 생각을 논해보록한다. 필자가 생각하기에 Dao와 Repository의 차이점을

bperhaps.tistory.com

 

Lombok (롬복)

클래스 생성 시 반복적으로 사용하는 getter/setter 같은 메서드를 어노테이션으로 대체하는 기능을 제공하는 라이브러리

 

  • 롬복 장점
    • 어노테이션 기반으로 자동 생성해 생산성 ↑
    • 가독성 ↑
    • 유지보수 용이
  • 롬복 단점
    • 개인 PC마다 롬복이 설치되어있어야 함
    • 순환 참조 → StackOverflowError 오류가 날 수 있음
    • 코드 길이를 줄이고자 무지성 어노테이션을 붙인다면 가독성 ↓

주의사항!

java:lombok:pitfall [권남] (kwonnam.pe.kr)

 

java:lombok:pitfall [권남]

 

kwonnam.pe.kr

 

편리한 기능인 만큼 무지성으로 쓰다보면 이런저런 오류가 발생돼 실무에서는 지양하는 것 같음.

알고 쓰면 편리함 ↑

'북 스터디 > 스프링 부트 핵심가이드' 카테고리의 다른 글

연관관계 매핑  (0) 2023.04.09
Spring Data JPA  (0) 2023.04.01
데이터베이스 연동 - 1  (0) 2023.03.25
스프링 부트 개발하기 / API 작성  (0) 2023.03.19
스프링부트 란? / 기초 지식  (0) 2023.03.18