https://sundaland.tistory.com/399
[ ▶ Getting Started ]
[ ▷ 시작하기 ]
△ 프로젝트 생성
- start.spring.io: Spring이 제공하는 웹 기반 인터페이스로, Spring Boot 프로젝트를 신속하게 생성할 수 있다. 종속성을 선택하고 프로젝트 메타데이터(그룹 ID, 아티팩트 ID 및 버전 등)를 입력한 후, ZIP 파일 형식으로 프로젝트 구조를 다운로드할 수 있다.
- Spring Tools: Eclipse, IntelliJ 등에서 사용할 수 있는 IDE 플러그인으로, Spring 프로젝트를 생성하고 관리하는 데 도움을 준다. 최소한의 노력으로 Spring Boot 애플리케이션을 구성할 수 있는 내장 마법사를 제공한다.
GitHub의 spring-data-examples 리포지토리는 Spring Data의 다양한 기능을 보여주는 샘플 애플리케이션을 제공한다. 이러한 예제는 개발자가 라이브러리를 효과적으로 사용하는 방법을 이해하는 데 도움을 다.
[ https://github.com/spring-projects/spring-data-examples ]
[ ▷ 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 Query Methods (0) | 2024.10.22 |
---|---|
Persisting Entities (0) | 2024.10.22 |
Configuration (0) | 2024.10.22 |
Defining Repository Interfaces (0) | 2024.10.22 |
Core concepts (0) | 2024.10.22 |