[스프링 부트 핵심가이드] 데이터베이스 연동하기 🤔

FeelingXD·2023년 4월 1일
0

북스터디

목록 보기
4/13
post-thumbnail

실습환경

실습 환경

  • Intellij
  • Docker
  • Maria db (port 43306) 도커환경 에서 실행
  • mysql workbench

ORM

ORM은 object relational mapping의 줄임말로 객체 관계 매핑을 의미합니다. 자바와 같은 객체 지향 언어 에서 의미하는 '객체' 와 RDB(realtional database)의 테이블을 자동으로 매핑하는 방법입니다.

객체지향의 언어에서 Class => RDB 테이블을 매칭시키빈다.

왜 ORM을 사용할까

ORM 을 사용하면 데이터베이스 쿼리를 직접 작성하여 사용하지않고 ORM을 통해 메서드(함수) 형태로, 객체지향적으로 조작할 수 있습니다.

  1. 직접적으로 쿼리를 작성하는것 보다 사람이 만드는 실수를 줄일수 있습니다.
  2. 재사용 및 유지보수가 편리
  3. 데이터베이스 종속성이 줄어든다.

고려할 만한 단점

  1. ORM 만으로 온전한 서비스를 구현하기엔 부족하다.
  • 복잡한 서비스( 여러테이블을 join하는경우등) 은 직접쿼리를 사용해야할 경우가있다.
  1. 어플리케이션 객체 관점과 데이터 베이스 관계관점에서 불일치 발생할수있음
    ex. Class에서 상속관계가 있지만 RDBMS에서 없는등 .구조적인 차이문제에 발생할수있음

JPA (java persistence API) 와 하이버네이트

하이버네이트는 자바 orm 프레임워크로 jpa가 정의하는 인터페이스를 구현하고 잇는 jpa 구현체중 하나입니다. Spring data jpa를 활용합니다.

jpa는 자바에서 orm 표준기술로 채텍된 인터페이스 모음입니다.

jpa는 orm의 구체화된 스펙을 포함 합니다.

스프링부트 엔티티관련 기본 어노테이션

@Entity

  • 해당클래스가 엔티티임을 명시하기 위한 어노테이션입니다.

@Tbale

  • 엔티티 클래스가 테이블과 매핑되므로 특별한 경우가 아니면 테이블 어노테이션은 사용되지않지만 클래스의 이름을 테이블의 이름을 다르게 지정해야 하는경우 @Table 어노테이션을이용하여 이름을 테이블의 이름을 지정할수있습니다.

@Id

엔티티 클래스의 필드는 테이블의 칼럼과 매핑됩니다. @Id 어노테이션이 선언된 필드는 테이블의 기본값의 역할로사용됩니다.(primary key 와 유사)

@GeneratedValue

일반적으로 @Id 어노테이션과 함께 사용되고 해당 필드값 생성시 어떤식으로 장동으로 값을 생성할지 결정합니다.

값생성 방식
generatedValue를 사용하지않을경우( 직접 할당)

  • 애플리케이션 자체적으로 기본값을 생성할 경우 사용합니다.
  • 내부에 정해진 규칙에 의해 기본값으로 생성하고 식별자로 사용합니다.

Auto

  • @Generated 의 기본값
  • 기본값을 사용하는 데이터베이스에 맞게 자동 생성합니다.

Identity

  • 기본값 생성을 데이터베이스에 위임합니다.(데이터베이스의 auto increment를 사용해 기본값을 생성합니다.

Sequence

  • @SequenceGenerator 어노테이션의 식별자 생성기를 통해 값을 자동으로 주입받습니다.

Repository 와 JpaRepository

전통적인 mvc 패턴에서 주로 DAO(data access object) 를 jpa에선 repository가 하여 객체를 반환한다.

Entity와 관련된 Repository를 만들고 JpaRepository를 상속받아 사용한다.

//entity
@Entity
@Setter 
//그외 필요한 어노테이션등 ..
public class Product{
	@Id
    private Long id;
    
    private String name
    
    
}

//example 실제사용하는 ProductRepository

public interface ProductRepository extends JpaRepository<Product, Long>{
}

위의 repository의 경우 Product 객체를 반환하고 일반적으로 Product Class의 @Id 로선언된 형태인 Long으로 객체를 매핑한다.

profile
tistory로 이사갑니다. :) https://feelingxd.tistory.com/

0개의 댓글