자바 공부/스프링공부

Jpa 사용법

ari0930 2024. 8. 4. 00:57

jpa란 

ORM 기술로 객체 지향 프로그래밍을 통해 데이터베이스와의 상호 작용을 쉽게 해주는 기술이다.

JPA를 이용하면 SQL 쿼리를 직접 작성하지 않고도 데이터베이스 작업을 진행할 수 있다.

 

의존성 추가 

나는 JPA 와 mysql을 사용하였다.

	//jpa
	// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa
	implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '3.3.0'

	// https://mvnrepository.com/artifact/mysql/mysql-connector-java
	implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.33'

 

엔티티 클래스 작성

@Getter
@Table(name = "users")
@NoArgsConstructor
@Entity
public class Users {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long number;

    @Column
    private String id;

    @Column
    private String pw;

    @Column
    private String name;

    @Builder
    public Users(Long number,String id,String pw,String name){
        this.number=number;
        this.id=id;
        this.pw=pw;
        this.name=name;
    }

}
  1. @Id
    • 해당 테이블의 PK 필드를 나타낸다.
  2. @Column
    • 테이블의 컬럼을 나타내며 굳이 선언하지 않더라고 해당 클래스의 필드는 모두 칼럼이 된다.
    • 사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵셥이 있으면 사용한다.
  3. @Builder
    • 해당 클래스의 빌더 패턴 클래스를 생성
    • 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
    • 자동으로 번호가 증가하게 만들어준다.
  5. @Table(name = "users")
    • 데이터베이스에서 users라는 테이블에 매핑된다는 것을 의미한다.

 

Repository 클래스 작성

JpaRepository 기본적으로 제공하는 메서드들은 

  • save(S entity): 엔티티를 저장하거나 업데이트합니다.
  • findById(ID id): 기본 키를 기준으로 엔티티를 조회합니다.
  • findAll(): 모든 엔티티를 조회합니다.
  • deleteById(ID id): 기본 키를 기준으로 엔티티를 삭제합니다.
  • deleteAll(): 모든 엔티티를 삭제합니다.
  • count(): 엔티티의 개수를 반환합니다.

만약 위의 기본 제공 메스드외의 추가적으로 데이터베이스에서 원하는 값을 얻기 위해서는 

public interface UserRepository extends JpaRepository <Users,Long> {
	//id 값으로 그거와 같은 user 데이터 모두 조회
  List<Users> findAllById(String id);

}

 

이렇게 내가 원하는 메소드를 만들어서 데이터 베이스에서 값을 조정할 수 있다.

이것 외에도 sql 문을 사용해서도 작성이 가능하다.

위의 메서드를 sql 문으로 작성한 경우

  @Query(value = "SELECT * FROM users WHERE id = :id", nativeQuery = true)
  List<Users> findAllByIdNative(@Param("id") String id);
  
    @Query("select u from Users u where u.id = :id" )
  List<Users> findAllByIdNative2(@Param("id") String id);

이렇게 2개의 방식으로 sql 문을 작성하여 사용할수 있다.

 

이제 간단하게 테스트를 해보자

    @Autowired
    private UserRepository userRepository;
       
    @RequestMapping("/")
    public  String main(){
        userRepository.save(Users.builder().id("k").pw("j").name("n").build());
        System.out.println(userRepository.findById(1L).get().getNumber());
        //List<Users> users=userRepository.findAllById("k");
        List<Users> users=userRepository.findAllByIdNative2("k");
        for(Users  i : users)
        {
            System.out.println("User Number: " + i.getNumber());

        }



        return "home";

    }

기본 레퍼지토리 메서드인 save를 이용하여 user 정보 데이터를 db에 저장한다.

그리고 그후 기본 메서드인 findById를 이용하여 첫 번째 번호를 가지고 있는 사람의 번호를 출력하였다.

 

그리고 직접 만든 findAllById 사용하여 id 이름이 "k"인 모든 유저 정보를 불러올 수 있었고

findAllByIdNative2 이것또한 첫 번째와 같은 결과가 나온다.

 

반응형