Getting Started

2024. 10. 19. 17:33Spring Boot/Spring Data JPA

시작하기

  1. 프로젝트 생성:
    • start.spring.io: Spring이 제공하는 웹 기반 인터페이스로, Spring Boot 프로젝트를 신속하게 생성할 수 있습니다. 종속성을 선택하고 프로젝트 메타데이터(그룹 ID, 아티팩트 ID 및 버전 등)를 입력한 후, ZIP 파일 형식으로 프로젝트 구조를 다운로드할 수 있습니다.
    • Spring Tools: Eclipse, IntelliJ 등에서 사용할 수 있는 IDE 플러그인으로, Spring 프로젝트를 생성하고 관리하는 데 도움을 줍니다. 최소한의 노력으로 Spring Boot 애플리케이션을 구성할 수 있는 내장 마법사를 제공합니다.

예제 리포지토리

  • GitHub의 spring-data-examples 리포지토리는 Spring Data의 다양한 기능을 보여주는 샘플 애플리케이션을 제공합니다. 이러한 예제는 개발자가 라이브러리를 효과적으로 사용하는 방법을 이해하는 데 도움을 줍니다.

Hello World 예제

이 예제는 Spring Data JPA를 사용한 간단한 Spring Boot 애플리케이션을 보여줍니다.

엔티티 클래스: Person

@Entity
class Person {

  @Id @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  private String name;

  // 생략된 getter 및 setter
}
  • @Entity: 이 애노테이션은 Person 클래스가 JPA 엔티티임을 나타내며, 데이터베이스 테이블에 매핑됩니다. 기본적으로 클래스 이름(Person)은 person이라는 테이블에 대응됩니다.
  • @Id: 이 애노테이션은 엔티티의 기본 키를 지정합니다.
  • @GeneratedValue: 이 애노테이션은 기본 키 생성 전략을 정의하는 데 사용됩니다. 여기서 GenerationType.AUTO는 JPA가 기본 키 값을 생성하는 데 적합한 전략을 선택하도록 허용합니다. 사용되는 데이터베이스에 따라 시퀀스, 테이블 또는 식별자 전략이 될 수 있습니다.
  • 필드:
    • id: 각 Person 엔티티의 고유 identifier입니다.
    • name: 사람의 이름을 저장하는 필드입니다.
  • Getter 및 Setter: 이들은 생략되었지만, 필드에 접근하고 수정하기 위해 필수적입니다. 일반적으로 데이터 캡슐화를 위해 포함됩니다.

리포지토리 인터페이스: PersonRepository

interface PersonRepository extends Repository<Person, Long> {

  Person save(Person person);

  Optional<Person> findById(long id);
}
  • PersonRepository: 이 인터페이스는 Repository<Person, Long>를 확장하며, 여기서 Person은 엔티티 유형이고 Long은 엔티티의 identifier 타입입니다.
  • Repository: Spring Data는 여러 리포지토리 인터페이스를 제공하며, Repository를 확장하면 기본 CRUD 기능을 제공받습니다. 그러나 JpaRepository 또는 CrudRepository와 같은 더 구체적인 인터페이스를 확장하여 추가 메서드 및 기능을 활용하는 것이 좋습니다.
  • 메서드:
    • save(Person person): 이 메서드는 Person 엔티티를 데이터베이스에 저장합니다. 엔티티가 이미 존재하는 경우(즉, null이 아닌 ID를 가진 경우) 기존 항목을 업데이트합니다.
    • findById(long id): 이 메서드는 ID로 Person 엔티티를 검색합니다. 엔티티를 찾지 못할 경우를 대비해 Optional<Person>을 반환하여 널 포인터 예외를 피할 수 있습니다.

메인 애플리케이션 클래스: DemoApplication

@SpringBootApplication
public class DemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

  @Bean
  CommandLineRunner runner(PersonRepository repository) {
    return args -> {
      Person person = new Person();
      person.setName("John");

      repository.save(person);
      Person saved = repository.findById(person.getId()).orElseThrow(NoSuchElementException::new);
    };
  }
}
  • @SpringBootApplication: 이 애노테이션은 @Configuration, @EnableAutoConfiguration, @ComponentScan의 세 가지 애노테이션을 결합한 편의 애노테이션입니다. 이 클래스가 Spring Boot 애플리케이션의 주요 진입점임을 나타냅니다.
  • main 메서드: 애플리케이션의 시작점입니다. SpringApplication.run(DemoApplication.class, args)는 Spring 애플리케이션 컨텍스트를 시작하고 내장 웹 서버를 시작합니다.
  • @Bean 및 CommandLineRunner:
    • CommandLineRunner 인터페이스는 시작 시 코드를 실행하는 데 사용됩니다. runner 메서드는 @Bean 애노테이션으로 표시되어 Spring 관리 빈이 됩니다.
    • runner 내에서 새 Person 인스턴스를 생성하고 데이터베이스에 저장합니다. save 메서드는 Person 엔티티를 지속합니다. 저장한 후, Person을 ID로 검색하여 저장 작업이 성공했는지 확인합니다. 엔티티를 찾지 못할 경우 NoSuchElementException이 발생합니다.

주목할 점

  • 자동 구현: Spring Data JPA는 런타임에 리포지토리 인터페이스를 자동으로 구현합니다. 즉, PersonRepository에 대한 구현을 제공할 필요가 없으며, Spring Data는 필요한 메서드를 구현하는 프록시를 생성합니다.
  • Autowired 파라미터: 리포지토리 인스턴스가 Spring 관리 빈의 파라미터로 전달될 때, @Autowired 애노테이션 없이 자동으로 주입됩니다. 이는 Spring의 의존성 주입 덕분입니다.
  • 리포지토리 인터페이스 선택: 필요한 기능에 따라 적절한 리포지토리 인터페이스를 선택하는 것이 좋습니다:
    • Repository: 기본 CRUD 작업.
    • CrudRepository: 표준 CRUD 작업을 위한 메서드 추가.
    • JpaRepository: CrudRepository를 확장하며, 배치 작업, 플러시 컨텍스트, 페이지네이션과 같은 JPA 특정 메서드를 제공합니다.

 

이 간단한 예제는 Spring Data JPA를 사용하는 Spring Boot 애플리케이션의 핵심 구성 요소를 보여줍니다. 엔티티 정의, 리포지토리 인터페이스 생성 및 애플리케이션 부트스트랩을 어떻게 수행하는지 설명합니다. Spring Boot의 기능을 활용함으로써 개발자는 기본 코드에 얽매이지 않고 비즈니스 로직 구현에 집중할 수 있습니다.

'Spring Boot > Spring Data JPA' 카테고리의 다른 글

Defining Repository Interfaces  (0) 2024.10.19
Core concepts  (0) 2024.10.19
Query Hint  (0) 2023.06.06
Database Index  (0) 2023.06.04
Aggregate Root  (0) 2023.06.04