Getting Started
2024. 10. 19. 17:33ㆍSpring Boot/Spring Data JPA
시작하기
- 프로젝트 생성:
- 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 |