본문 바로가기

개발공부/Java(JPA)

Repository

  • 따로 쿼리문 작성하지 않아도 CRUD 사용 가능

< UserRepository >

@Repository                                     // 데이터타입, pk의 타입
public interface UserRepository extends JpaRepository<User, Long> {

}

UserRepository 인터페이스를 만들고,

이미 만들어져 있는 JpaRepository 상속 받는다.

< UserRepositoryTest >

public class UserRepositoryTest extends StudyApplicationTests {

    // DI (Dependency Injection)
    @Autowired
    private UserRepository userRepository;

    @Test
    public void create(){
        // String sql = insert into user (  ) values (  );  쓰지 않아도 됨. JPA 기능

        User user = new User();

        // user.setId();  auto_increment 속성을 사용하기 때문에 생략
        user.setAccount("TestUser02");
        user.setEmail("TestUser02@gmail.com");
        user.setPhoneNumber("010-2222-2222");
        user.setCreatedAt(LocalDateTime.now());
        user.setCreatedBy("TestUser02");

        User newUser = userRepository.save(user); // user 타입을 넘겨서 저장,
                                                  // DB에 저장된 새로운 user 객체 반환
        System.out.println(newUser);

    }

		@Test
    public void read(){

        Optional<User> user = userRepository.findById(3L);     //id Long타입
                                     // optional : 있을 수도 있고 없을 수도 있음
                                     // findAll : DB에 있는 user테이블 리스트를 모두 가져옴
                                     // findById : Id 한 건 가져옴
        
				user.ifPresent(selectUser -> {       
                                     //selectUser가 Optional에 들어있으면 ifPresent로 꺼냄
                    System.out.println(selectUser);
                    System.out.println(selectUser.getEmail());
                });

    }

		@Test
    public void update(){

        Optional<User> user = userRepository.findById(2L);  //먼저 특정 데이터 select

        user.ifPresent(selectUser -> {       // user가 반드시 있어야 하므로 ifPresent 사용

            // selectUser.setId(3L); 이라고 쓰면 2L이 아니라 3L이 수정됨.
            // 해당 id를 다시 확인하기 때문에  

            selectUser.setAccount("pppp");
            selectUser.setUpdatedAt(LocalDateTime.now());
            selectUser.setUpdatedBy("update method()");

            userRepository.save(selectUser);     // 마지막엔 항상 save 해줘야함
                // 값을 바꿔서 save 하면 JPA에서는 해당 ID가 있는지를 먼저 확인하고 update함          
        });
    }

		@Test
    @Transactional                 // 메소드는 실행되지만 DB에 반영되지 않음. 마지막에 롤백.         
    public void delete(){

        Optional<User> user = userRepository.findById(2L);

        Assertions.assertTrue(user.isPresent());  // 2L에 값이 들어있으면 true

        user.ifPresent(selectUser -> {
            // selectUser.setId(3L); 이라고 쓰면 2L이 아니라 3L이 수정됨.
            userRepository.delete(selectUser);
        });

        Optional<User> deleteUser = userRepository.findById(2L);

        Assertions.assertFalse(deleteUser.isPresent()); // 2L에 값이 있으면 false

    }

}

!https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4680e3cb-5ab9-4e6b-8c74-c63f7c7d610e/Untitled.png

  • update() 실행 결과

!https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2be33281-a7cb-4f18-b4d6-15d5b089d836/Untitled.png

  1. 특정 user Select
  2. ID로 한번 더 Select
  3. update

'개발공부 > Java(JPA)' 카테고리의 다른 글

[Java] String VS StringBuilder 차이점  (0) 2025.02.17
JPA 란?  (1) 2025.02.13
Entity  (0) 2025.02.13
JPA 연관 관계 설정  (0) 2023.06.18
JPA 자동 설정 기능  (0) 2023.06.18