엔티티 설계
•
Spring Data JPA를 사용하면 DB 테이블을 생성하기 위해 쿼리를 작성할 필요없음
•
이 기능을 가능하게 하는 것이 엔티티 설계
•
JPA에서 엔티티 클래스는 DB 테이블과 대응되는 클래스
•
엔티티에는 DB에 쓰일 테이블과 칼럼을 정의
•
@Entity 어노테이션을 사용하면 테이블간의 연관관계를 정의할 수 있음
@Entity
@Table(name="product") //생략 가능
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long number; // 상품번호
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer price;
@Column(nullable = false)
private Integer stock;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
Java
복사
엔티티 관련 어노테이션 정리
@Entity : 해당 클래스가 Entity임을 명시하기 위한 어노테이션이다. 클래스 자체는 테이블과 일대일로 매칭이 되며, 해당 클래스의 인스턴스는 테이블에서 하나의 레코드를 의미한다.
@Table : 클래스의 이름고 테이블의 이름을 다르게 지정해야하는 경우 사용한다. 명시하지 않으면 테이블의 이름과 클래스의 이름이 동일하다는 의미이다.@Id : @Id 어노테이션이 선언된 필드는 테이블의 기본값 역할로 사용된다.
@GeneratedValue : 해당 필드의 값을 어떤 방식으로 자동으로 생성할지 결정할 때 사용한다. 일반적으로 @Id 어노테이션과 함께 사용된다.
•
AUTO : 기본 설정 값으로 데이터베이스에 맞게 자동 생성한다.
•
IDENTITY : 기본값 생성을 데이터베이스에 위임하는 방식으로 데이터베이스의 AUTO_INCREMENT(데이터가 삽입될 때마다 1씩 증가해주는 역할)를 사용해 기본값을 생성한다.
•
SEQUENCE : @SequenceGenerator 어노테이션으로 식별자 생성기를 설정하고 이를 통해 값을 자동 주입받는다. @GeneratedValue에 생성기를 설정한다.
•
TABLE : 식별자로 사용할 숫자의 보관 테이블을 별도로 생성해서 엔티티를 생성할 때마다 값을 갱신하며 사용한다. @TableGenerator어노테이션으로 테이블 정보를 설정한다.
@Column : 엔티티 클래스의 필드는 자동으로 테이블 칼럼으로 매핑된다.
•
name : 데이터베이스의 칼럼명을 설정하는 속성이다. 명시하지 않으면 필드명으로 지정된다.
•
nullable : 레코드를 생성할 때 칼럼 값에 null 처리가 가능한지를 명시하는 속성이다.
•
length : 데이터베이스에 저장하는 데이터의 최대 길이를 설정한다.
•
unique : 해당 칼럼을 유니크로 설정한다. unique로 지정하면 중복 값을 가질 수 없다.
@Transient : 엔티티 클래스에는 선언되어 있는 필드지만 데이터베이스에서는 필요 없을 경우 이 어노테이션을 사용해 데이터베이스에서 이용하지 않게 할 수 있다
Repository 인터페이스 설계
Repository 인터페이스 생성
Spring Data JPA가 제공하는 인터페이스를 Repository라고 함, Spring Data JPA가 제공하는
JpaRepository를 상속하면 기존의 다양한 메서드 사용 가능
(엔티티는 DB생성과 연관, 리포지토리는 DB 접근과 연관)
ProductRespository
public interface ProductRepository extends JpaRepository<Product,Long> {
}
Java
복사
•
상속받을 땐 엔티티와 기본값 타입 지정 필수, Product 엔티티를 사용하기 위해 여기선 엔티 티를 Product, 기본값은 Long 타입으로 지정했다.
메서드 생성 규칙
JpaRepository를 이용해 메서드를 생성할때는 규칙을 무조건 지켜야한다
•
FindBy : where역할을 하는 구문이다
List<Hospital> findByBusinessStatusCode(int code);
//비즈니스 코드를 기준으로 검색한다
//select * from nation_wide_hospitals where business_status_code = 2;
Java
복사
List<Hospital> hospitals = hospitalRepository.findByBusinessStatusCode(2);
Java
복사
•
In : 여러개의 데이터를 검색할때 사용
List<Hospital> findByBusinessTypeNameIn(List<String> businessTypes);
//비즈니스 타입의 이름을 여러개 검색한다
//select * from nation_wide_hospitals where business_type_name in ('보건소','보건지소','보건진료소');
Java
복사
List<String> inClues = new ArrayList<>();
inClues.add("보건소");
inClues.add("보건지소");
inClues.add("보건진료소");
List<Hospital> hospitals = hospitalRepository.findByBusinessTypeNameIn(inClues);
Java
복사
•
And, Or : 조건을 여러개 설정하기 위해 사용된다
List<Hospital> findByFullAddressContainingAndBusinessTypeNameIn(String name,List<String> businessName);
//주소가 수원이면서 비스니스 타입이 보건소, 보건지소, 보건진료소인 병원을 검색한다
//select * from nation_wide_hospitals where full_address like '%수원%' and business_type_name in ('보건소','보건지소','보건진료소');
Java
복사
List<String> businessContains = new ArrayList<>();
businessContains.add("보건소");
businessContains.add("보건지소");
businessContains.add("보건진료소");
String addressName = "수원시";
List<Hospital> hospitals = hospitalRepository.findByFullAddressContainingAndBusinessTypeNameIn(addressName, businessContains);
Java
복사
•
Like : like와 같다 %가 있어야 한다
List<Hospital> findByRoadNameAddressLike(String name);
//주소가 수원인 데이터 출력
//select * from nation_wide_hospitals where road_name_address like '%수원%';
Java
복사
List<Hospital> hospitals = hospitalRepository.findByRoadNameAddressLike("%수원%");
Java
복사
•
Containing, Contains, isContaing : Like와 비슷하지만 %가 없이 사용가능하다 (%문자열%)
List<Hospital> findByRoadNameAddressContaining(String name);
List<Hospital> findByRoadNameAddressContaining(String name);
List<Hospital> findByRoadNameAddressContaining(String name);
//주소가 강남인 데이터 출력
Java
복사
List<Hospital> hospitals1 = hospitalRepository.findByRoadNameAddressContaining("강남");
List<Hospital> hospitals2 = hospitalRepository.findByRoadNameAddressContains("강남");
List<Hospital> hospitals3 = hospitalRepository.findByRoadNameAddressIsContaining("강남");
Java
복사
•
StartWith, StartingWith : 특정 키워드로 시작하는 문자열 조건 검색 (문자열 + %)
List<Hospital> findByRoadNameAddressStartingWith(String addr);
List<Hospital> findByRoadNameAddressStartsWith(String addr);
//주소가 서울로 시작하는 데이터 검색
//select * from nation_wide_hospitals where road_name_address like '서울%';
Java
복사
List<Hospital> hospitals1 = hospitalRepository.findByRoadNameAddressStartingWith("서울");
List<Hospital> hospitals2 = hospitalRepository.findByRoadNameAddressStartsWith("서울");
Java
복사
•
EndWith, Endingwith : 특정 키워드로 끝나는 문자열 조건 검색 (% + 문자열)
List<Hospital> findByPhoneEndingWith(String num);
List<Hospital> findByPhoneEndingWith(String num);
//휴대폰 뒷자리가 8808인 병원 데이터 출력
//select * from nation_wide_hospitals where phone like '%8808';
Java
복사
List<Hospital> hospitals1 = hospitalRepository.findByPhoneEndingWith("8808");
List<Hospital> hospitals2 = hospitalRepository.findByPhoneEndsWith("8808");
Java
복사
•
IsNull, IsNotNull : 레코드 값이 Null이거나 Not Null인 값을 선택할때 사용
List<Hospital> findByPhoneIsNull();
List<Hospital> findByPhoneIsNotNull();
//휴대폰 번호가 Null인 데이터와 NotNull인 데이터 출력
//select count(*) from nation_wide_hospitals where phone is not null;
Java
복사
List<Hospital> hospitals1 = hospitalRepository.findByPhoneIsNull();
List<Hospital> hospitals2 = hospitalRepository.findByPhoneIsNotNull();
Java
복사
•
True, False : Boolean값을 검색할때 사용
•
Before, After : 시간을 기준으로 값을 검새할때 사용
List<Hospital> findByLicenseDateBefore(LocalDateTime date);
List<Hospital> findByLicenseDateAfter(LocalDateTime date);
//2000년1월1일 이전과 이후 데이터 출력
//select * from nation_wide_hospitals where license_date <= '2000-01-01'
Java
복사
LocalDateTime localDateTime = LocalDateTime.of(2000,1,1,0,0,0);
List<Hospital> hospitals1 = hospitalRepository.findByLicenseDateBefore(localDateTime);
List<Hospital> hospitals2 = hospitalRepository.findByLicenseDateAfter(localDateTime);
Java
복사
•
LessThan, GreaterThan : 특정 값을 기준으로 대소 비교를 할때 사용
List<Hospital> findByIdLessThan(Long num);
List<Hospital> findByIdGreaterThan(Long num);
//id가 10보다 작은 데이터, 1000000보다 큰 데이터 출력
//select * from nation_wide_hospitals where id < 10;
Java
복사
List<Hospital> hospitals15 = hospitalRepository.findByIdLessThan(10L);
List<Hospital> hospitals16 = hospitalRepository.findByIdGreaterThan(100000L);
Java
복사
•
Between : 두 값 사이의 데이터를 조회
List<Hospital> findByIdBetween(Long start, Long end);
//id가 10이상 20이하의 데이터 출력
//select * from nation_wide_hospitals where id between 10 and 20;
Java
복사
List<Hospital> hospitals17 = hospitalRepository.findByIdBetween(10L, 20L);
Java
복사
•
OrderBy : order by와 동일한 기능, 끝에 Desc를 붙이면 내림차순 정렬이 된다(기본값 오름차순)
List<Hospital> findByRoadNameAddressContainsOrderById(String addr);
List<Hospital> findByRoadNameAddressContainsOrderByIdDesc(String addr);
//주소에 수원이 들어가는 데이터 id기준으로 오름차순, 내림차순
//select * from nation_wide_hospitals where road_name_address like '%수원%' order by id;
Java
복사
List<Hospital> hospitals1 = hospitalRepository.findByRoadNameAddressContainsOrderById("수원");
List<Hospital> hospitals2 = hospitalRepository.findByRoadNameAddressContainsOrderByIdDesc("수원");
Java
복사
•
countBy : count와 동일한 기능 count추출