리포지토리는 간단하게 말하면 데이터베이스를 조작하는 클래스입니다. 리포지토리를 생성하는 경우에는 반드시 인터페이스를 정의하고 구현해야 합니다. 그 이유는 리포지토리 인터페이스의 필드에 리포지토리 구현 클래스를 DI하여 특정 구현에 의존하는 것을 피할 수 있기 때문입니다.
자바에서는 인터페이스를 구현한 클래스의 접미사에 'Impl'을 붙이는 경우가 많습니다.(Impl은 implements의 약자입니다.)
O/R 매퍼(Object-Realiational Mapper)를 간단한게 설명하면, 어플리케이션에서 사용하는 객체(O, Ojbect)와 릴레이션(R, Relational)의 데이터를 매핑하는 것입니다.
조금 더 자세하게 설명하면 O/R 매퍼는 미리 설정된 객체와 관계형 데이터베이스 간의 대응 관계 정보를 가지고 인터페이스의 데이터에 대응하는 테이블에 내보내거나 데이터베이스에서 값을 읽어 들여 인터페이스에 대입하는 작업을 자동으로 실행합니다.
스프링 데이터 JDBC는 O/R 매퍼입니다.
스프링 데이터가 제공하는 CrudRepository
를 상속해서 자동으로 CRUD를 지원하는 메서드를 사용할 수 있습니다.
spring.datasoruce.driver-class-name=org.postgresql.Driver
spring.datasoruce.url=jdbc::postgresql://locahost:5432/postgres
spring.datasoruce.username=postgres
spring.datasoruce.password=postgres
spring.datasoruce.driver-class-name=org.postgresql.Driver
spring.datasoruce.url
spring.datasoruce.username
spring.datasoruce.password
member 테이블에 대응하는 Meber 엔티티를 생성합니다. Lombok에서 제공하는 어노테이션을 사용합니다.
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
private Long id;
private String name;
}
@Data
hashCode(), equlas(), toString()
도 자동 생성됩니다.@NoArgsConstructor
@AllArgsConstructor
@Id
MemberCrudRepository
인터페이스를 생성하고 CrudRepository
를 상속합니다. CrudRepository
인수 타입인 Member
와 @Id
어노테이션을 부여한 필드의 타입인 Long
의 순서로 지정합니다. 이것은 저장 대상 객체의 타입과 저장 대상 객체의 기본키 타입을 지정한 것입니다.
이것으로 MemberCrudRepository
인터페이스 안에서 메서드를 작성하지 않아도 CRUD 사용이 가능합니다.
메서드의 사용되는 반환값이나 인수의 엔티티나 ID는 <Meber, Long>
로 지정한 타입이 됩니다.
public interface MemberCrudRepository extends CrudRepository<Member, Long> {
}
@SpringBootApplication
public class SpringDataJdbcSampleApplication {
public static void main(String[] args) {
SrpingApplication.run(SpringDataJdbcSampleApplication.class, args)
.getBean(SpringDataJdbcSampleApplication.class).execute();
}
@Autowired
MemberCrudRepository repository;
private void execute() {
executeInsert(); // 등록
executeSelect(); // 전체 취득
}
private void executeInsert() {
Member member = new Member(null, "이순신"); // 엔티티 생성(id는 자동 부여 되기 때문에 null 설정)
member = repository.save(member);
System.out.println("등록 데이터: " + member);
}
private void executeSelect() {
System.out.println("-----전체 데이터를 취득합니다.------");
Iterable<Member> members = repository.findAll(); // 리포지토리에서 전체 데이터를 취득
for (Member member : members) {
System.out.println(memeber);
}
}
}
CrudRepository
를 상속하는 것만으로 CRUD를 실행할 수 있는 메서드를 사용할 수 있습니다. 단, MemberCrudRepository
인터페이스에는 @Repository
를 부여하지 않습니다. @Repository
는 인스턴스 생성을 위한 어노테이션이며 인터페이스는 인스턴스화할 수 없습니다.
어디까지나 CrudRepository
를 상속하는 것은 인터페이스입니다. 그럼 CrudRepository
를 상속한 인터페이스의 구현은 어디서 생성되는 것일까요? 구현 클래스는 스프링 데이터 JDBC가 자동 생성하므로 직접 구현 클래스를 생성해 @Repository
를 구현 클래스에 부여할 필요가 없습니다.