[JPA] JpaRepository에서 @Repository 생략이 가능한 이유

2025. 3. 10. 16:55·CS/Spring

두번째 리팩토링의 주제는 @Reposiotry 생략했는데 왜 정상작동? 이다.

 

과거 MyBatis를 활용해서 프로젝트를 진행했던적이 있다. Controller, Service, Repository 등 클래스들은 어노테이션을 통해 꼭 빈으로 등록했었다(당시에 몇번 빼먹었다가 오류가 나서 수정했던 기억이ㅎ)

 

그런데 <빼곡> 프로젝트의 경우, @Repository 어노테이션을 생략해도 정상적으로 동작하는것을 발견했다. 초반에 작성했던 클래스를 제외하고는 대부분 명시하지 않았다. 구현에 급급하다보니 살피지 못했던 부분이다.

 

 

다른점이라면 기술스택으로 인한 차이가 있다. JPA를 채택하고있기 때문에 Repository는 모두 JpaRepository를 extends하는 인터페이스 기반의 레포지토리이다. 그렇다면 지금 발생한 차이는 이 상속때문일것이라 예상이 된다.

 

어떤 원리일까?

우선 기존에 사용하던 @Controller, @Service, @Repository의 경우, 내부에 @Component가 있다. 따라서 이 어노테이션만 쓰더라도 알아서 스프링 빈으로 등록되는것이였다.

 

 

같은방식으로, 이번엔 JpaRepository 클래스를 분석해보자.

 

내부에 @Component는 없지만, ListCrudRepository와 ListPagingAndSortingRepository 그리고 QueryExampleRepository인터페이스를 확장하고있는것을 볼 수 있다. 여기서 ListCrudRepository를 타고 들어가보자.

 

CrudRepository가 보인다. 또 타고 들어가면,

 

이렇게 @Repository를 확장하고있는것을 알 수 있다. org.springframework.data.repository에 속해있는 것이다.

 

정리하자면,

 

'org.springframework.data.repository' 패키지의 Repository 인터페이스를 상속받고있다. 해당 인터페이스를 구현한 클래스는 컴포넌트 스캔의 대상이 된다. 따라서 자동으로 상속이 됐던것이다.

이러한 이유로, @Repository 어노테이션을 생략한 레포지토리들이 정상적으로 빈으로 등록되고, 작동했던것이다. 따라서 리팩토링의 경우, 모두 적용하거나 모두 생략하거나 하나의 방식을 채택하는게 좋을것같다.

 

 

개인적으론 해당 빈이 @Repository임을 한번 더 명시하는 역할을 위해서 모두 적용하는 방식을 사용하려고 한다!ㅎㅎ

 

 

 

 

 

 

 

 

 

'CS > Spring' 카테고리의 다른 글

[Spring] Transactional의 ReadOnly는 왜 써야할까  (0) 2025.04.28
'CS/Spring' 카테고리의 다른 글
  • [Spring] Transactional의 ReadOnly는 왜 써야할까
▹ 서현서현
▹ 서현서현
좋아하는걸 마음껏하는 백엔드 개발자😎
  • ▹ 서현서현
    Circus
    ▹ 서현서현
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • 회고 (2)
      • 프로젝트 (22)
        • 빼곡 (11)
        • SEMENTO (2)
        • FindDog (1)
        • 척척약사 (1)
        • 차곡차곡 (2)
        • 원더웨이 (3)
        • 트래블 캐리어 (2)
      • 알고리즘 (4)
      • 기타 (2)
      • CS (4)
        • Spring (2)
        • 대규모 시스템 설계 (2)
  • 링크

    • 👾 Github
    • 🧩 Algorithm
  • 공지사항

    • 블로그를 이전했습니다 💖
  • 인기 글

  • hELLO· Designed By정상우.v4.10.1
▹ 서현서현
[JPA] JpaRepository에서 @Repository 생략이 가능한 이유
상단으로

티스토리툴바