1. 리포지토리
리포지토리는 간단하게 말하면 데이터베이스를 조작하는 클래스이다. 리포지토리를 생성하는 경우에는 반드시 인터페이스를 정의하고 구현해야 한다. 그 이유는 리포지토리 인터페이스의 필드에 리포지토리 구현 클래스를 DI하여 특정 구현에 의존하는 것을 피할 수 있기 때문이다.
자바에서는 인터페이스를 구현한 클래스의 접미사에 'Impl'을 붙이는 경우가 많다.(Impl: implements의 약자)
2. 스프링 데이터 JDBC
2.1 O/R 매퍼
O/R 매퍼(Object-Realiational Mapper)를 간단한게 설명하면, 애플리케이션에서 사용하는 객체(O, Ojbect)와 릴레이션(R, Relational)의 데이터를 매핑하는 것이다. 조금 더 자세하게 설명하면 O/R 매퍼는 미리 설정된 객체와 관계형 데이터베이스 간의 대응 관계 정보를 가지고 인터페이스의 데이터에 대응하는 테이블에 내보내거나 데이터베이스에서 값을 읽어 들여 인터페이스에 대입하는 작업을 자동으로 실행한다.
2.2 스프링 데이터 JDBC
스프링 데이터 JDBC는 O/R 매퍼이다.
스프링 데이터가 제공하는 CrudRepository를 상속해서 자동으로 CRUD를 지원하는 메서드를 사용할 수 있다.
2.3 application.properties 설정
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
JDBC 드라이버의 클래스명을 지정한다. (여기서는 postgreSQL의 드라이버를 설정) - spring.datasoruce.url
데이터베이스의 '접속 URL'을 설정한다. - spring.datasoruce.username
데이터베이스에 접속하는 '유저명'을 설정한다. - spring.datasoruce.password
데이터베이스에 접속하는 '비밀번호'를 설정한다.
2.4 엔티티 설정
member 테이블에 대응하는 Member 엔티티를 생성한다. Lombok에서 제공하는 어노테이션을 사용한다.
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
private Long id;
private String name;
}
- @Data
클래스에 부여하는 것으로, 전 필드에 대해 Getter / Setter로 액세스 할 수 있다.
hashCode(), equals(), toString() 메서드 또한 자동 생성된다. - @NoArgsConstructor
기본 생성자가 자동 생성된다. 클래스에 부여한다. - @AllArgsConstructor
전 필드에 대해 초기화 값을 인수로 가지는 생성자가 자동 생성된다. 클래스에 부여한다. - @Id
테이블의 기본키(Primary Key)에 해당하는 id 필드에 부여한다.
2.5 리포지토리 생성
MemberCrudRepository 인터페이스를 생성하고 CrudRepository를 상속한다. CrudRepository 인수 타입인 Member와 @Id 어노테이션을 부여한 필드의 타입인 Long 타입을 순서대로 제네릭에 지정한다. 이것은 저장 대상 객체의 타입과 저장 대상 객체의 기본키 타입을 지정한 것이다.
이것으로 MemberCrudRepository 인터페이스 안에서 메서드를 작성하지 않아도 CRUD 사용이 가능하다. 메서드의 사용되는 반환값이나 인수의 엔티티나 ID는 <Meber, Long>으로 지정한 타입이 된다.
public interface MemberCrudRepository extends CrudRepository<Member, Long> {
}
2.6 클래스 생성
@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를 구현 클래스에 부여할 필요가 없다
'스프링 > 스프링 프레임워크 첫걸음' 카테고리의 다른 글
6. 템플릿 엔진 알아보기 (0) | 2025.01.12 |
---|---|
5. MVC 모델 알아보기 (0) | 2025.01.12 |
3. 스프링 프레임워크의 핵심 기능 (0) | 2025.01.11 |
2. 자바 기초 지식 복습 (0) | 2025.01.11 |
1. 스프링 프레임워크 개요 (0) | 2025.01.11 |