[Spring] TodoRepository를 만들고, H2 데이터베이스와 list-todos 페이지 연결하기 (+ Spring Data JPA 프레임워크 - JpaRepository)

민지·2024년 2월 22일
0

배울 내용 + 참고

(re)
1번. DB와 클래스를 매핑지어 자동 연결해주는 @Entity 어노테이션 (자바 빈을 만들어줄 클래스에 붙여줌)

2번. 그럼, 연결한 데이터베이스 서버를, 이클립스의 자바 코드에서 관리해주고 사용해줘야 하니(ex, insert, delete, update 기능..), 해당 데이터베이스를 관리해줄 자바 클래스에 @Repository 붙여주기

이거 2번 진행할 차례다!

이 포스팅에서는 JPA의 @Repository보다 훨씬 간편한 Spring Data JPA 프레임워크를 사용한다. TIL에 정리한 예제코드를 참고하면, 도움이 된다.
TIL 링크 - Spring Data JPA 프레임워크

1. TodoRepository 인터페이스 만들기

public interface TodoRepository extends JpaRepository<Todo, Integer> {

}

명명규칙은 다음과 같다.
<관리할 엔디티명, primary key 자료형 - Wrapper Class>

2. TodoControllerJpa 클래스 만들기

Spring Data Jpa 프레임워크의 JpaRepository를 extends한 TodoRepository를 만들었다.
TodoRepository에는 사용할 CRUD관련 메서드를 정의할테니, 해당 정의한 메서드를 이용해 실제 기능을 구현할 컨트롤러가 필요하다. 해당 컨트롤러 이름을 TodoControllerJpa라고 지어보자.

앞서 기능 구현을 해둔 TodoController를 복붙해서 TodoControllerJpa를 만들면, url에 대한 중복 처리 에러가 뜬다. 이에, TodoController의 @Controller 어노테이션 부분을 주석 처리하면, 스프링부트가 해당 TodoController 클래스를 완전히 무시하고, TodoControllerJpa를 관리하게 될 것이다!


todoRepository 클래스를 사용할 것이니, todoRepository 인스턴스를 생성해주고, 의존성을 주입시켜준다.

뭘 할 건지 + 수정 전 코드

이제 Spring Data Jpa에서 제공하는 메서드들로, 원래는 TodoService클래스에서 정적 데이터를 불러왔던 /list-todos 페이지를, 이제는 h2 database와 연결시켜, 해당 데이터베이스에 있는 todos들을 불러올 것이다.

"기존의 TodoService클래스에서 정적 데이터를 불러왔던 /list-todos 화면"

"수정 전 - 정적 리소스를 불러오는 listAllTodos 코드" 하지만 Jpa에서 기본적으로 제공하는 메서드는 primary key를 식별자로 이용해 해당 id에 맞는 엔디티를 반환하는 findById()는 있지만, primary key가 id가 아닌 username으로 식별하는 것은 없다.

수정 후 코드 조각 모음

즉, 커스텀 메서드를 TodoRepository에서 정의해줘야 한다. (이때 TIL -> Spring Data Jpa -> 커스텀 메서드 예제코드 참고하면 이해가 쉬워진다.)

"TodoRepository - findByUsername 추가" 이때 username은 Todo 자바 객체의 필드에 존재해야 한다. 그러면 Spring Data Jpa는 username으로 검색하기 위한 메서드를 자동으로 제공해준다.

"todoService.findByUsername() -> todoRepository.findByUsername()으로 수정"

but, 실행결과

엔디티에 대한 디폴트 생성자가 없다고 나옴.

그럼, 엔디티에 대한 기본 생성자를 추가해주면 됨.

// Todo.java에 디폴트 생성자 추가해주면 됨.
public Todo() {

}

그럼 실행결과, 앞서 data.sql에 넣은 데이터가 보인다.

마치며.. - 전체 코드 흐름


전체 코드 흐름을 위의 그림처럼, 3가지 객체에 주의해서 코드 리뷰할 것!

  1. @Entity 클래스 - 데이터 모델 정의

    스프링부트는 @Entity 어노테이션을 보고, 해당 어노테이션이 붙은 클래스명과 동일한 테이블을 만들어준다. (해당 클래스에는 @Id로 primary key를 지정할 수 있다.)

  2. TodoRepository 인터페이스 - 데이터 접근 및 조작을 위한 메서드를 정의

    JpaRepository를 extends한 클래스.
    JpaRepository 인터페이스는 기본적으로 제공해주는 메서드가 있고, 해당 메서드 말고 그외의 메서드가 필요하다면 findBy 다음에 클래스의 속성 이름이 나오도록 함수 이름을 지어, 커스텀 메서드를 만들어줄 것

  3. TodoControllerJpa 클래스 컨트롤러 - 실제 애플리케이션의 비즈니스 로직을 구현

    TodoRepository 인터페이스에 사용할 기본메서드와 커스텀 메서드를 정의했다면, 이제 해당 메서드를 이용해 실제 CURD 기능을 정의할 컨트롤러가 필요하다.




참고 및 출처
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/

profile
배운 내용을 바로바로 기록하자!

0개의 댓글