이번 글은 레포지토리를 작성하면서 있었던 일이다. 사실 처음에는 직접 구현하고 싶어서 EntityManager를 사용하여서 개발했다. em.persist()등을 직접 사용하고 있었다. 모든 repository를 직접 개발하려 했으나 개발 바닥 톡방에서 남들이 쓰고 간단한 건 빠르고 간결하게..라는 조언을 받았다. 그래서 하나의 repository만 직접 구현했고 그것도 나중에는 jparepository로 바꾸었다ㅎ..
JpaRepository를 상속 받으면 쿼리 메서드들을 작성, 구현하지 않고 사용할 수 있다. 대표적으로 save(), delete()등을 바로 사용할 수 있어서 insert, update, delete 쿼리를 우리가 따로 작성하지 않아도 편리하게 사용할 수 있다. select를 하려면 우리가 만든 repository 인터페이스에 query method를 선언해 주어야 한다. (본인은 엔티티의 필드 중 private String login_id가 있어서 살짝의 고난을 맞았다. ) 여기서 잠깐!
JPA
본 블로그에서 jpa를 정리한 적이 있으니 간단히 짚고 넘어가겠다. JPA는 java진영의 ORM 기술 표준으로 사용되는 인터페이스의 모음이다. ORM은 Object Relational Mapping으로 쉽게 우리가 작성한 클래스(객체 또는 엔티티?)와 관계형DB(ex: mysql)의 테이블을 매핑시켜주는 기술이다. JPA는 아까 말했듯이 인터페이스이므로 많은 구현체가 있고 우리는 hibernate라는 구현체를 주로 사용한다. JPA를 사용하는 이유는 반복적인 쿼리문을 작성하지 않도록 편리하게 도와주기 때문이다. JPA는 java를 사용한 메서드로 조작할 수 있어서 개발자가 비지니스 로직에 더 집중할 수 있다.
query method를 설명하지는 않았지만 예를 들어 'teho'라는 유저를 찾는 경우 JPA를 사용하면 userRepository.findByName("teho")라고 하면 되지만 직접 쿼리를 쓰면 Select * From User WHERE user.name ="teho" 벌써 귀찮다. JPA는 메서드이기 때문에 ide의 도움을 받아 편리하게 작성할 수 있고 여러 경우에서도 메서드를 호출해서 사용하면된다. 지금은 가장 간단한 예제를 들었기에 쿼리가 그나마 간단한데 비지니스 로직이 복잡해지면 쿼리도 상당히 복잡해질 것이고 그 경우마다 쿼리를 직접 작성하는 것은 엄청난 노가다일것이다.
Query Metohd
JpaRepository를 상속받고 입맛에 맞는 Query Method를 작성할 수 있다. 가장 많이 사용하는 것이 findBy~~~이다. ~~~을 사용해서 조건에 맞는 데이터를 데이터베이스에서 찾을 수 있다. 위의 예시에서 봤듯이 name으로 찾고 싶으면 필드의 첫 글자를 대문자로 바꾼 후 작성해 두면 된다. 다음 예제는 loginId라는 필드로 찾고 싶을 때 만드는 쿼리 메서드이다.
public interface UserRepository extends JpaRepository<User, Long> {
User findByLoginId(String loginId);
}
extends JpaRepository<,>에서 <>안에는 해당 테이블과 매핑된 클래스(=>User)와 그 엔티티의 PK의 타입(=> Long, 이 뜻은 User 클래스에 @Id로 선언된 필드가 private Long id라는 뜻이다.)을 작성해 주면 된다.
위의 예시처럼 작성해 두면 이제 메서드이므로 필요할 때 호출해서 상황에 맞는 매개 변수를 넣어서 사용하면 된다.
메서드 명명 규칙 (필드에 _(언더바)가 있다면??)
본인은 여기서 문제를 맞았는데 User의 필드가 private String login_id 였다. 그래서 첫 글자를 대문자로 바꾸고 처리하려는데 _ 이 언더바가 신경 쓰였다. chatGpt한테 물어보니 findByLoginId로 작성하면 된다 하였지만 틀린 대답이었다.(gpt 맹신하면 안 됩니다..) 블로그와 공식 문서를 찾아본 결과 jpa 스펙상 쿼리 메서드를 사용하고 싶으면 엔티티의 필드 명에 _ 언더버가 들어가면 안 된다. jpa가 인식하지 못한다. 그래서 loginId로 필드 명을 바꿔 주었다.
이어서 설명하자면 쿼리 메서드는 직접 쿼리를 작성하여 주지 않도록 도와준다 했다. 그래서 여러 기능을 제공하는데 sql쿼리에 있는 LIKE, GROUP BY 등을 처리해 주는 메서드들이 모두 존재한다. Spring Data JPA 공식 문서에 있는 표를 가져와 보았다. 이 표를 봐도 jpa의 장점을 알 수 있는데 처음 보더라도 sql 쿼리와 달리 한눈에 무슨 기능을 하는지 알 수 있다. 심지어 이것을 메서드 로직을 작성하지 않고 이름만 선언해서 사용할 수 있다는 것은 엄청난 장점이다.
반환 값 또한 객체 또는 list, Optinal 등으로 받을 수 있어 개발하기 매우 수월하다!
맨 처음에 대표적으로 save(), delete()만 언급했는데 그 외에도 Jpa를 사용하면 쿼리를 대체할 수 있는 많은 메서드들이 존재한다! 이 역시 이름만으로도 무슨 기능을 할지 알기 쉽고 역시 메서드이기에 호출해서 사용만 하면 된다 GOOD!
'My project > inflearn_clone?' 카테고리의 다른 글
@Transactional 이해하고 사용하기 (트랜잭션이란?) (0) | 2023.07.24 |
---|---|
절대 경로 VS 상대 경로 (a 태그 href 속성에 /를 작성해야 할까?) (0) | 2023.07.19 |
DTO? DTO 필요한 이유, DTO 사용해 보기!(VO?) (0) | 2023.07.15 |
@Column(nullable = false) vs @NotNull (@NotBlank, @NotEmpty?), UNIQUE 설정하기 (2) | 2023.07.14 |
springboot + jpa + mysql로 인프런 따라하기? (0) | 2023.07.13 |