일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 채권
- 알고리즘공부
- 지혜를가진흑곰
- 독서
- C
- 돈
- 성분
- 독후감
- 서평
- 재테크
- C++
- algorithmtraining
- algorithmTest
- algorithmStudy
- Java
- 프로그래밍언어
- 책을알려주는남자
- 투자
- 알고리즘 공부
- 자바스크립트
- JavaScript
- 알고리즘트레이닝
- 자바
- 프로그래머스 알고리즘 공부
- 경제
- 화장품
- 책알남
- 다독
- 백준알고리즘
- 주식
- Today
- Total
탁월함은 어떻게 나오는가?
JPA Repository를 사용하는 이유 본문
필자는 면접을 보고 왔다. 많은 질문과 이야기가 오고 갔지만, 그 중 한개는 JPA Repository를 사용하는 이유가 무엇인가? 라는 질문이 기억에 남아서 기록해둔다.
필자는 JPA Repository를 사용하는 이유를 "save 같이 제공해주는 기능들이 편리해서" 라고 답변을 했다. 실제로 편리하기 때문에 썼지만, 좀 더 구체적인 근거와 이유를 알고싶어졌다.
JPARepository란? (jpa라 줄이겠다.)
jpa는 인터페이스이다. jpa는 미리 검색 메소드를 정의 해 두는 것으로, 메소드를 호출하는 것만으로 스마트한 데이터 검색을 할 수 있게 되는 것이다. 덧붙혀서 말하자면, Etity에 있는 데이터를 조회하거나 저장과 변경 그리고 삭제를 할때 Spring JPA에서 제공하는 Repository라는 인터페이스를 정의해 해당 Entity의 데이터를 사용 할 수 있다. Repository는 내부적으로 EntityManager가 직접 대상 Entity의 데이터를 관리하고 있기 때문에 굳이 Repository 인터페이스를 정의하지 않고도 직접 EntityManger를 사용해 Persistance Layer를 구현 할 수 있지만 Spring JPA에서 Repository의 내부 구현체를 자동으로 생성시켜 주기 때문에 별도의 구현체를 따로 생성하지 않아도 된다.
Repository는 대게 Entity와 1:1로 매칭된다고 볼 수도 있으나 꼭 그런것은 아니며 부모에 종속적으로 사용이 되는 자식 Entity가 있고 자식에 대한 직접적인 데이타 조작이 필요가 없다면 부모 Entity에 대해서만 Repository를 정의하면 된다. 자식 Entity가 독립적으로 사용될 필요가 없다면 부모 Repository만 생성하고 필요하다면 부모 Entity에서 지정된 관계를 통해 자식 Entity를 사용하면 된다는 의미이다.
jpa는 org.springframework.data.jpa.repository 패키지의 "JpaRepository"라는 인터페이스를 상속하여 만들어진다. 그리고 이 인터페이스는 범용적으로 사용이 되고 있다.
exteds JpaRepository <엔티티 클래스이름 , ID 필드 타입> 을 지정한다. jpa를 사용할 경우 주의할점은 2가지가 있다.
첫째. 기본형의 경우, 래퍼 클래스를 지정한다는 점이다.
둘째. 클래스의 선언 앞에 @Repository 어노테이션을 붙혀놓아야지 jpa임을 나타낸다.
@Query 사용
jpa에 정의된 키워드를 조합하면 특정조건에 해당하는 데이터를 원하는 형태대로 가져올 수 있다.
하지만 데이터베이스에 종속적인 문법을 사용해야 할 때나 Entity간의 명시적으로 들어나지 않는 관계간의 조인, 데이터 조회 속도 향상등의 목적으로 직접 쿼리를 작성할 수 있는 방법을 제공하고 있다.
@Query 속성중에 nativeQuery 속성을 true로 설정하지 않으면 Default값으로 JPQL문법이 동작한다.
JPQL 문법은 JPA에서 사용 되는 언어이며 쿼리 구문과 유사하나 Table이 아닌 Entity를 기준으로 데이터를 조회한다는 것이 다르다. 하지만 만약 쿼리 문법이 더 익숙하다면 nativeQuery 속성을 통해 직접 쿼리를 작성할 수 있다.
Entity의 영속화
jpa는 내부적으로 데이터를 임시로 담기 위한 공간을 가지는데 이것을 @Transactional 단위로 묶어서 관리한다. 임시로 담긴 데이터는 commit 혹은 rollack이 되는 순간까지 변경 상태가 유지 된다.
만약 조회함수로 Post Entity의 @Id key가 '1'인 인스턴스를 조회해 왔다고 가정하자. 이때 동일한 @Transactional 단위에서 동일한 Post Entioty의 @Id Key가 '1'인 인스턴스를 조회하면 해당 Entity 인스턴스가 새롭게 데이터베이스상에서 조회가 되는 것이 아니라 메모리에 있는 Entity 인스턴스가 반환이 된다.
이것은 Entity의 저장에 대해서도 동일하게 사용 되는데 이를 위해 JpaRepository 인터페이스의 내부에는 save, saveAndFlush 함수가 제공된다. 두가지 함수 모두 Entity 인스턴스의 영속화 즉, 데이터베이스에 데이터를 저장하는 함수이지만 saveAndFlush함수는 저장 즉시 데이터를 데이터베이스로 전송하고 svae 함수는 @Transactional 범위가 종료되면 commit이 되는 순간 데이터베이스에 저장이 되는 차이점이 있다.
JpaRepository의 메소드 명명 규칙
jpa는 메소드이름 작성 방법만 알고있따면, 필요한 메소드를 빠르게 쓰고 추가할 수 있따. 처리 코드는 일체 필요가 없다. 단지, 메소드 선언문만 있으면 된다. 단지, 미리 정해진 룰에 따라 제대로 메소드 이름을 붙이기만 하면 된다. 적당히 이름을 붙이는 것만으로 메소드가 자동 생성된다.
findBy떙땡
"findBy" 이후에 엔티티의 속성 이름을 붙인다. 이 속성 이름은 첫 글자는 대문자로 한다.
findById 처럼 findByName, findByAddress, findByMail 로 사용하면 된다.
Like / NotLike
"퍼지 검색"에 관한 것이다. Like를 붙이면, 인수에 지정된 텍스트를 포함하는 엔티티를 검색한다. 또한 NotLike을 쓰면 인수의 텍스트를 포함하지 않는 것을 검색한다.
"finByNameLike"의 경우라면, name에서 인수의 텍스트를 퍼지 검색한다.
*퍼지검색이란?
퍼지검색은 입력된 검색 키워드가 정확하지 않아도 사용자의 요구를 예상하고 적절한 단어를 찾는 검색 방식으로 표기의 흔들림과 유의어, 동의어를 보완한다. 또한 맞춤법 교정은 사용자의 입력 실수를 지적하고 보다 정확도 높은 검색을 제공
StartingWith / EndingWith
텍스트 값에서 인수에 지정된 텍스트로 시작하거나 끝나는 것을 검색하기 위한 것이다. findByNameStartingWith("A")이라면, name의 값이 "A"로 시작하는 항목을 검색한다.
IsNull / IsNotNull
값이 null 이거나, 혹은 null이 아닌 것을 검색한다. 인수는 필요없다.
"fundByNameIsNull()"이라면, name의 값이 null인 것만 검색한다.
True / False
부울 값으로 true 인 것, 혹은 false 인 것을 검색한다. 인수는 필요없다.
"findByCheckTrue()"라면 check라는 항목이 true인 것만을 검색한다.
Before / After
시간 값으로 사용한다. 인수에 지정한 값보다 이전의 것, 혹은 이후 것은 검색한다.
"findByCreateBefore(new Date())"라고 하면, create라는 항목의 값이 현재보다 이전의 것만을 찾는다. (reate가 Date인 경우)
LessThan / GreaterThan
숫자 값으로 사용한다. 그 항목의 값이 인수보다 작거나 큰 것을 검색한다.
"findByAgeLessThan(20)"이라면, age의 값이 20보다 작은 것을 찾는다.
Between
두 값을 인수로 가지고 그 두 값 사이의 것을 검색한다. 예를 들어, "findByAgeBetween(10, 20)"라고 한다면 age의 값이 10이상 20이하인 것을 검색한다. 수치뿐만 아니라 시간의 항목 등에도 사용할 수 있다.
이 외에도 다양하다. 생각 외로 jpa를 잘 다루게 된다면 코딩의 양은 적어져도 다양한 데이터를 검색할 수 있게 된다는 것을 배웠다.
정리하자면, 가지가 장점이다.
첫째. 모든사람들이 똑같이 사용할 수 있고 편리한 장점
둘째. 강력하면서 간편한 검색 기능
셋째. 쿼리
넷째. 영속화 라고 할 수 있겠다.
'[Snow-ball]프로그래밍(컴퓨터) > 프로그래밍 및 컴퓨터 개론 이론' 카테고리의 다른 글
기본개념 간단하게 정리[JavaScript] (0) | 2021.07.09 |
---|---|
기본개념 간단하게 정리 (0) | 2021.07.08 |
[ERROR] Error running 'LeejunghyunshopApplication': Command line is too long. Shorten command line for LeejunghyunshopApplication or also for Spring Boot default configuration? (0) | 2021.05.23 |
구조 분해 할당(destructuring)이란? (0) | 2021.04.17 |
ScaleUp(스케일업)과 ScaleOut(스케일아웃)의 차이 (0) | 2021.04.15 |