지금까지 JPA를 이용하여 mysql과 연동해 간단한 회원 정보를 주고받아 봤는데, 이번에는 SpringDataJpa를 이용해 프로젝트를 리팩터링 해보려 한다. 사실 JPA에 관해 공부를 하지 않고 SpringDataJpa를 쓰는 것은 좋진 않지만 현재 사용법에 대해 익히고 있고 기초를 진행하기에 프로젝트를 SpringDataJpa를 이용해 추가 기능을 구현해보려 한다. 당분간은 직접 프로젝트를 통해 어느 정도 흐름을 이해하고 익혀보도록 하자.
상단 폴더에서 Repository에 Jpa 부분을 삭제하고 SpringUserRepository 라는 인터페이스 하나를 생성해주었다. 이 인터페이스를 통해 이미 구현되어있는 메소드들을 불러와 SQL 쿼리문을 자동으로 처리해주는 방식으로 김영한 님의 말씀대로 정말 마법 같다.. 아무튼 인터페이스는 이렇게 되어있다.
SpringUserRepsoitory.Interface
package study.part1.Repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import study.part1.domain.User;
public interface SpringUserRepository extends JpaRepository<User,Long> {
@Modifying
@Query("UPDATE User p set p.email = :email where p.id = :id")
int update(@Param("email") String email, @Param("id") Long id);
}
상속을 받게되면 자동으로 아래와 같이 Import가 된다.
import org.springframework.data.jpa.repository.JpaRepository;
그리고 엔티티와, 키값인 id의 속성을 추가해주면 Interface의 구현은 끝났다. 사실 우리가 인터페이스 자체에 따로 구현해줄 것은 거의 없지만 후에 있을 update 쿼리문을 처리하기 위해서는 자동으로 구현되지 않기에 개발자가 직접 쿼리문을 작성해주어야 한다. 쿼리문을 추가하기 위해서 필요로 하는 각각의 어노테이션들을 보자면
@Modifying : @Query 어노테이션 통해 작성된 쿼리문을 작동하기위해 사용되는 어노테이션으로 Insert, update, delete 문을 사용할 시에 강제적으로 사용해야 한다.
@Query : 개발자가 직접 쿼리를 적어 인터페이스에 구현하기위해 사용
@Param : 파라미터임을 인식할 수 있게끔 사용 (java 11 이하는 사용하지 않아도 됨)
주의할 점으로는 java17로 프로젝트를 진행하고 있다면 update 안에 각각의 인자 값에 파라미터임을 인식할 수 있는 @Param 어노테이션을 추가해주어야하며 @Param이 들어가있지않다면 강제적으로 사용하라고 오류가 뜰 것이다. 만약 java11로 프로젝트를 진행한다면 @Param을 작성하지 않아도 정상적으로 쿼리문이 작동한다.
위와 같이 작성이 완료되었다면, 전에 설명했듯이 Repository 사용을 위해 Bean 에 등록을 해주어야 한다. 하지만 우리는 Jpa부분을 삭제하고 새로 인터페이스를 추가했기에 SpringConfig에서 수정을 해주어야 한다.
SpringConfig.class
package study.part1;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import study.part1.Repository.SpringUserRepository;
import study.part1.Service.UserService;
@Configuration
public class SpringConfig {
private final SpringUserRepository springUserRepository;
public SpringConfig(SpringUserRepository springUserRepository) {
this.springUserRepository = springUserRepository;
}
@Bean
public UserService userService(){
return new UserService(springUserRepository);
}
}
위와 같이 SpringUserRepository의 생성자 매개변수를 추가 후 서비스에 등록해주면 된다.
UserService.class에서 아래부분과 같이 수정해준다.
public Long join(User user) {
springUserRepository.save(user);
return user.getId();
}
이후에 서버를 실행 후 포스트맨을 통하여 회원정보를 입력해서 데이터가 내 DB에 잘 저장되는지 확인해보자.
POST로 파라미터 값을 response 하면
정상적으로 데이터가 DB에 들어간 것을 확인할 수 있다. repository를 SpirngDataJpa로 구현했기에 EntityManger 를 거치지 않아도 자동으로 잘 구현해주는 것을 확인할 수 있다. 위에 서술했듯이 update 쿼리의 경우에는 직접 인터페이스 안에 쿼리를 작성해주어야 하지만 Insert, delete, select 등 의 경우에는 대부분은 자동으로 구현할 수 있다. 다음편에서는 SpirngDataJpa를 이용해서 DB에 저장되어있는 회원정보를 조회, 삭제, 수정을 하는 방법을 구현해보도록 하자 🤔
'모험가의 Spring > Spring' 카테고리의 다른 글
SpringSecurity 접근 허용에 주의 할 점 (0) | 2022.08.21 |
---|---|
Spring을 이용한 CRUD 구현_Create (0) | 2022.07.26 |
Spring 기초 : 간단한 회원정보 입력받기 + MYSQL + JPA (0) | 2022.07.17 |
Spring 기초 : Mysql + Spring 연동 (0) | 2022.07.17 |
Spring 기초 : controller를 이용한 간단한 데이터 주고받기 (0) | 2022.07.16 |