개발 공부 기록/07. TIL

스프링 부트 핵심가이드 TIL - 4장 (ORM)

박세류 2023. 9. 29. 12:06

✍학습 키워드

정의

ORM은 Object Relational Mapping의 줄임말로 객체 관계 매핑을 의미한다.

자바와 RDB의 테이블을 자동으로 매핑하는 방법이다.

ORM은 큰 개념이고 JPA는 더 구체화된 스펙을 포함한다.

하이버네이트

  • 자바의 ORM 프레임워크이다.

영속성 컨텍스트

  • 영속성 컨테스트는 애플리케이션과 데이터베이스 사이에서 엔티티와 레코드의 괴리를 해소하는 기능과 객체를 보관하는 기능을 수행한다.

DAO설계

  • DAO(Data Access Object)는 데이터베이스에 접근하기 위한 로직을 관리하기 위한 객체이다. JPA에서 DAO의 개념은 리포지토리가 대체하고 있다.
    • 규모가 작은 서비스에서는 DAO를 별도로 설계하지 않고 바로 서비스 레이어에서 데이터베이스에 접근해서 구현하기도 하지만, DAO를 서비스레이어와 리포지토리의 중간 계층을 구성하는 역할

DAO의 메서드를 호출하고 비즈니스 로직을 수행하는 서비스 레이어 (컨트롤러)

  • 서비스 레이어에서는 도메인 모델을 활용해 핵심기능을 구현하며, 모든 로직을 서비스 레이어에서 포함하기 쉽지 않으므로 아키텍처를 서비스 로직과 비즈니스 로직으로 분리하기도 한다.
    • 도메인을 활용한 세부 기능들을 비즈니스 레이어의 로직에서 구현하고, 서비스 레이어세너는 기능들을 종합해서 핵심 기능을 전달하도록 구성한다.

스프링 부트 애플리케이션의 구조

  • 데이터베이스와 밀접한 관련이 있는 데이터 엑세스 레이어까진 Entity 객체를 사용하고, 클라이언트와 가까워지는 레이어에서는 DTO 객체를 사용하는 것이 일반적이다.

컨트롤러

  • 요청과 응답을 전달하는 역할만 맡는다.
  • 각 기능에 대한 요청은 컨트롤러 - 서비스 - DAO - 리포지토리 계층을 따라 이동하고, 그것의 역순으로 응답을 전달하는 구조이다.

📝새로 배운 개념

엔티티

  • JPA를 사용하면 데이터베이스에 테이블을 생성하기 위해 직접 쿼리를 작성할 필요가 없는데, 이 기능을 가능하게 하는 것이 엔티티이다.

엔티티 관련 기본 어노테이션

  • @Entity : 해당 클래스가 엔티티임을 명시하기 위한 어노테이션, 클래스 자체는 테이블과 일대일로 매칭된다.
  • @Table : 엔티티 클래스는 테이블과 매핑되므로 특별한 경우가 아니면 해당 어노테이션이 필요하지 않으나, 이를 명시하면 다른 테이블 이름을 쓸 수 있다.
  • @Id : 해당 어노테이션이 선언된 필드는 테이블의 기본값으로 사용된다. 모든 엔티티는 해당 어노테이션이 꼭 필요하다.
  • @GeneratedValue : 일반적으로 @Id 어노테이션과 함께 사용된다.
  • @Column : name / nullable / length / unique 의 속성값을 가진다
  • @Transient : 엔티티 클래스ㅅ에는 선언되어 있지만 db에서 필요 없을 경우 이 어노테이션을 사용해서 디비에서 안쓰게 할 수 있다.

리포지토리

  • JPA는 JpaRepository를 기반으로 데이터베이스를 쉽게 사용할 수 있는 아키텍쳐를 제공한다.
    • 엔티티를 데이터베이스의 테이블과 구조를 생성하는데 사용했다면 리포지토리는 엔티티가 생성한 데이터베이스에 접근하는데 사용된다.
    • 엔티티를 사용하기 위해서는 대상 엔티티를 첫번째 매개변수로 하고 해당 엔티티의 @Id 필드 타입으로 설정한다.
  • 리포지토리에서는 몇 가지 명명규칙에 따라 커스텀 메소드도 생성할 수 있다.
    • 메서드에 이름을 붙일 때는 첫 단어를 제외한 이후 단어들의 첫 글자를 대문자로 설정해야 JPA에서 정상적으로 인식하고 쿼리를 자동으로 만들어준다.
    • FindBy : SQL의 where절 역할을 수행하는 구문. findBy 뒤에 엔티티 필드값 입력해서 사용
    • ex) findByName(String name) + And / Or
    • Like/NotLike
    • OrderBy / countBy 등등이 있음

JPA에서 데이터의 값을 변경할 때는 다른 메서드와는 다른 점이 있다. JPA는 값을 갱신할 때 update라는 키워드를 사용하지 않고, find에서 영속성 컨텍스트가 유지되는 상황에서 save()를 실행하면 db의 레코드를 업데이트하는 쿼리가 실행된다.


✨느낀 점&자기 선언

할거 겁나많네..

반응형