지금 우리에게는
지난 강의에서 생성한
커스텀 데이터베이스 표가 있습니다
이제는 특정 코드를 수정하여
이 데이터베이스 테이블이
인증에 활용될 수 있도록 해야 합니다
가장 먼저 해야 할 일은
새로 생성한 표에 대해
엔터티(Entity) 클래스를 생성해 주어
Spring Data JPA 프레임워크를 활용해
표로부터 기록을 가져오는 것을 가능케 하는 것입니다
이를 위하여
지금 제가 무엇을 하고자 하느냐면
com.eazybytes의 하위에 새로운 패키지를 생성할 것입니다
패키지 이름은 model(모델)입니다
이 model 패키지의 내부에는
Customer라는 새로운 Java 클래스를 생성합니다
표 이름인 customer를 따라 붙였습니다
이 class의 맨 위에는
@Entity라고
주석(어노테이션)을 줍니다
Entity라는 주석(어노테이션)은
SpringData JPA 프레임워크로부터 왔으며
제가 생성할
이 프로젝트의 클래스는
저번 강의에서 생성하였던 표에
대응된다는 뜻입니다
SpringData JPA에 만약 익숙하지 않으시다면
Spring 프레임워크인 Spring Boot를 다루는
제 강좌를 추천드립니다
그 강좌에서는
SpringData JPA에 대한 설명이 있으며
데이터베이스 관련 Java 코드에서
그것을 활용할 수 있는 방법도 다룹니다
그러면 이 비어 있는 클래스가 정의 되었으니
이제는 이 클래스의 변수들을
데이터베이스 표의 열과 일대일로 대응하도록 정의해야 합니다
이 클래스의 내부에
코드 몇 줄을 붙여넣겠습니다
제가 방금 붙여넣은 이 코드가
정확히 무엇인지 이제 설명하겠습니다
맨 첫 번째 필드는 id입니다
제 데이터베이스 내부의 customer 표를 보면
열의 명칭은 순서대로 id, email, pwd, role입니다
이와 아주 유사하게
Pojo 클래스 내부에 생성한 필드는
id, email, pwd와 role입니다
그리고 id는 숫자 유형의 정보이므로
데이터 유형을 int라고 언급하였습니다
다른 필드는 단순히 String이라 되어 있습니다
그런데 id 열 위에는
제가 두 개의 또 다른 주석(어노테이션)을 언급하였습니다
@id와
@GeneratedValue입니다
제가 이를 통해
Spring Data JPA에게 알리려 하는 것은
이 열이 기본 키로
표 내부에서 기능한다는 것입니다
그것이 우리가
Spring 프레임워크에게
@id 주석(어노테이션)을 통해 알리려 하는 것입니다
또한 특정 필드가
데이터베이스 내부에서 기본키에 해당하는 열임을 표시했으면
id 값이
어떤 방식으로 생성되는 것인지
데이터베이스 표에
새로운 기록을 삽입할 때마다 알려주어야 합니다
그렇게 하기 위하여
이 @GeneratedValue 주석 (어노테이션)과
이 id 번호를 입력해
개발자가 수동으로
일일이 기록을 입력할 필요가 없도록 해 줍니다
그러는 대신 프레임워크가 자동으로
데이터베이스 서버와 함께
자동적으로 데이터베이스에서 사용 가능한
새로운 id 값을 생성하게 됩니다
지금 이 주석(어노테이션)을 통해서
그 자동화가 가능하도록 하는 것입니다
그 다음에는 모든 필드에 대해
각각의 getter와 setter 메소드가 있습니다
이것으로 우리는 성공적으로 엔터티(Entity) 클래스을 설정하였습니다
다음으로 기록을
새로운 표로부터 반환하려 할 때에는
customer 표로부터
기록을 반환하는
Java 코드가 필요할 것입니다
이를 위하여 웹 애플리케이션 내부에
JPA Repository 인터페이스를 구축해야 합니다
인터페이스를 만들기 위하여
새로운 패키지를 생성하겠습니다
이름은 repository입니다
그리고 이 패키지 내부에는
새로운 인터페이스를 생성할 것입니다
그러면 Java Class 옵션을 선택하겠습니다
그리고는 값을 Interface로 변경합니다
인터페이스의 이름은 CustomerRepository입니다
이 인터페이스는
Spring Data JPA 프레임워크 안의
다른 가용 인터페이스로 연장되어야 합니다
연장을 하기 위해 extends라고 입력합니다
다른 인터페이스의 명칭은 CrudRepository입니다
이 인터페이스는
Spring Data JPA 프레임워크에 존재하는 것들 중 하나로
CRUD 연산을 위한 코드가
자동으로 생성되도록 도와주는 인터페이스입니다
예를 들어 데이터베이스의 기록을 읽거나
생성하거나
업데이트하거나, 삭제하려 할 때와 같은
모든 CRUD 연산에 대하여
이 인터페이스 클래스 내부에서
단순히 추상 메소드를 정의하기만 하면
SpringData JPA 에서 마법처럼
자신의 런타임에서 여러분이 정의한 메소드 이름을 반영하여
코드를 자동으로 생성하여 줍니다
이에 대해서는 더 자세히 다루겠습니다
그러기 전에 @Repository 주석(어노테이션)을
인터페이스 위쪽에 넣겠습니다
이는 제 Spring 프레임워크에게
이 클래스는 Repository 클래스이므로
데이터베이스 상호작용 관련
로직들을 전문으로 다룬다는 것을 알려줍니다
그리고 CrudRepository를 언급한 뒤에
추가로 언급하여야 할 것은
이 인터페이스가 어느 표에 소속될 것인지 입니다
이 인터페이스가 다룰 것은 customer 표입니다
우리가 생성한 엔터티는
customer 표를 상징하기 때문입니다
그리고 기본키 데이터 유형
역시 언급하여야 합니다
기본키 유형은 Long
이 내부에
값을 언급하겠습니다
이걸로 우리는 Spring Data JPA 프레임워크에게
CustomerRepository의 내부에
어떤 메소드를 작성할 것인지 알려 주었습니다
이 로직은 customer 표에 대해 실행되어야 하며
기본키 열의 데이터 유형은
Long입니다
이게 제가 전달하고자 하는 정보입니다
이 정보들을 정의하였으면
이제 추상 메소드를 생성하여
아이디를 넘길 때마다
즉 지금 우리의 경우에는 이메일이 되겠습니다
표로부터 기록을 읽는 것을 돕도록 해야 합니다
그러므로 추상 메소드를 생성하겠습니다
추상 메소드 이름은 findByEmail입니다
이 메소드의 이름을 기반으로
제 Spring Data JPA는
런타임에서 로직을 생성할 것입니다
제가 명명 규칙을 이용하여
무엇을 명령하는 거냐면
findBy라는 부분이
붙었을 때의 뜻은
Spring Data JPA에게
SELECT 쿼리를 활용하여
기록을 반환해 오라는 것입니다
그리고 Spring Data JPA는 바로 질문을 할 것입니다
어떤 작업 조건으로 검색을 할 것이냐고 말입니다
이에 답하기 위하여
findByEmail이라고 입력하였습니다
저의 customer 표에는
email이라는 이름의 열이 있기에
가 보면 email 열이 보입니다
또한 저는 메소드 이름에
똑같이 언급을 하였기 때문에
Spring Data JPA에서는
자동으로 비즈니스 로직을 생성할 수 있습니다
개발자가 일을 할 때마다
이 메소드에 입력으로
이메일을 줄 것이라는 가정 하에 말입니다
그러면 Spring Data JPA는
이메일을 작업 조건으로 두고
SELECT 쿼리를 실행할 것입니다
Spring Data JPA에 대한 이 개념을
derived method name query라고 부릅니다
데이터베이스 서버 내부에서
실행될 쿼리는
Repository 인터페이스에 정의하여 놓은
메소드 명칭을 기반으로 할 것입니다
이해가 되셨길 바랍니다
지금까지 한 내용에 대해 질문이 있으시다면
아까 말씀드렸듯이
저의 Spring 강좌를 강력히 추천드립니다
그 강좌에서
Spring Data JPA가 아주 많이 언급되기 때문입니다
이걸로 우리는
모든 데이터베이스 관련 엔터티와
웹 애플리케이션 내부의 리포지터리 관련 변경을 모두 하였습니다
그리고 만약에
EazyBankBackendApplication이 존재하는
메인 패키지 밖에 이 메소드들을 생성하셨다면
특정 주석(어노테이션)을 추가로 정의하셔야 합니다
이 주석(어노테이션)들은 @EnableJpaRepositories입니다
@EnableJpaRepositories를 언급하면
리포지터리가 존재하는
패키지명을 입력해 주셔야 합니다
이와 유사하게
다른 주석(어노테이션)은
@EntityScan입니다
이 주석(어노테이션)에 대해서는
웹 애플리케이션 내부에
엔터티들이 존재하는
패키지 정보를 넘겨야 합니다
이게 제 엔터티들이 들어 있는 패키지입니다
Spring Boot에게 우리는
우리의 다양한
Spring Data JPA 관련 리포지터리와
엔터티 등등에 대해 알려주는 것입니다
이게 패키지이니 스캔하여
Bean들을 생성해 주어서
비지니스 로직에 활용할 수 있도록 해달라고 하는 것입니다
하지만 저의 시나리오에서 저는
엔터티와 리포지터리 등을 메인 패키지에 생성하였으므로
이 두 개의 주석(어노테이션)은 언급하지 않아도 됩니다
그러므로 제거하겠습니다
하지만 다른 패키지 명명법을 따르고 계시다면
이 주석(어노테이션)은 입력하셔야 합니다
또 다른 하나의 주석(어노테이션)에 대해 알려드리겠습니다
바로 @EnableWebSecurity입니다
Spring Boot 웹 애플리케이션을 개발할 때에는
이 주석(어노테이션)은 완전히 선택 사항입니다
Spring Boot는 똑똑해서
웹 보안을 자동으로
우리가 정의한 클래스 dependencies에 따라 활성화하기 때문입니다
그러나 만약에 Spring Boot 없이
Spring 애플리케이션을 개발 중이라면
이 주석(어노테이션)은 반드시
프로젝트에 언급해 주셔야 합니다
그래야만
Spring Security의 모든 기능이 활성화됩니다
지금으로서는
Spring Boot 웹 애플리케이션을 하고 있으므로
제거하여도 됩니다
이걸로
이번 강의에서 변경한 사항들이
모두 이해가 되셨길 바랍니다
감사드리며 다음 강의에서 뵙겠습니다
수고하셨습니다