Adding-A-Method-In-All-Repositories
1 모든 Repository에 메서드 추가하기
- Spring Data JPA를 사용하면 Repository 인터페이스만 정의하면 구현체가 자동으로 만들어지는 기능을 상당히 잘 사용하고 잇다.
- 그 중에서도 JpaRepository가 제공하는 findById 메서드를 많이 사용하는데 반환 값이 Optional이기 때문에 반복되는 Optional 처리가 상당히 귀찮아지기 시작했다.
- JpaRepository에 Optional을 직접 처리해야되는 findById 메서드 대신 Optional을 처리해주고 엔티티를 바로 반환해주는 메서드가 있으면 좋겠다는 생각을 했다.
- 모든 엔티티는 Id를 가지고 있기 때문에 Id로 엔티티를 조회하는 기능은 모든 리포지토리에서 공통적으로 사용할 수 있다고 생각했다.
2 문제점
- 간단한 예제 프로그램으로 당시 프로젝트를 진행하면서 겪었던 문제점을 개선해보자.
2.1 상황
User 엔티티
- 간단한 사용자 엔티티로 id와 name을 가지고 있다.
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
public void changeName(String name) {
this.name = name;
}
}
UserRepository
- Spring Data JPA 사용하면 JpaRepository를 상속한 인터페이스만 정의하면 UserRepository의 구현체를 만들어 준다.
- JpaRepository가 상속한 CrudRepository 인터페이스에 findById 메서드가 정의되어 있다.
- 해당 메서드는 Optional을 반환하므로 UserRepository의 클라이언트는 필히 Optional을 처리해야 한다.
public interface UserRepository extends JpaRepository<User, Long> {
}
UserService
- UserRepository를 사용하는 서비스 컴포넌트다.
- 엔티티를 아이디로 조회하는 일은 여러 서비스 코드에서 많이 사용되고 있는 메서드인데 그런 모든 곳에서 아래와 같이 예외 처리 코드가