1. 데이터베이스 연동하기 (JPA)
환경 설정
- build.gradle 파일에 Spring Data JPA 라이브러리 추가
- implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
- runtimeOnly 'mysql:mysql-connector-java'
- resources/application.properties 파일에 데이터베이스 접속 정보와 JPA 설정 추가
- spring.datasource.url=jdbc:mysql://localhost:3306/board
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- spring.datasource.username=username
- spring.datasource.password=password
- spring.jpa.hibernate.ddl-auto=create
- spring.jpa.show-sql=true
ddl-auto 옵션
- create : 테이블 삭제 후 다시 생성 (DROP + CREATE)
- create-drop : create와 같지만 종료 시점에 테이블 DROP
- update : 변경된 부분 반영
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
- none : 사용하지 않음
- 주의 사항 !
- 운영 서버에서는 절대 create, create-drop, update를 사용하면 안됨
- 기존 테이블을 변경, 삭제하는 역할을 수행하기 때문
show-sql 옵션
- JPA에서 만들어진 쿼리를 출력하여 확인하기 위한 옵션
- 예쁘게 하려면 설정 추가 ~~
- spring.jpa.properties.hibernate.format_sql=true
2. Entity 설계하기
Entity 생성
엔티티 관련 어노테이션
- @Entity
- 해당 클래스가 엔티티임을 명시하기 위한 어노테이션
- 클래스 자체가 테이블과 1:1로 매칭
- @Table
- 클래스의 이름과 테이블의 이름이 다른 경우 사용되는 어노테이션
- 자바에서의 명명법과 데이터베이스에서의 명명법이 다르기 때문에 자주 사용!
- @Id
- 테이블의 기본값 지정 어노테이션
- @GeneratedValue
- 해당 필드의 값이 어떤 방식으로 자동 생성될지 결정 :
- 직접 할당 (GeneratedValue 사용 x)
- AUTO : 기본값을 데이터베이스에 맞게 자동 생성
- IDENTITY : 기본값 생성을 데이터베이스에 위임
- SEQUENCE : 식별자 생성기를 직접 설정하고 이를 통해 값을 주입
- TABLE : 키 생성 테이블을 사용
- 보통 @Id 어노테이션과 함께 사용
- 해당 필드의 값이 어떤 방식으로 자동 생성될지 결정 :
- @Column
- 객체 필드를 테이블 컬럼에 매핑
- 많이 사용되는 요소 :
- name : 데이터베이스의 컬럼명 설정, 명시하지 않으면 필드명으로 지정
- nullable : null 값의 허용 여부
- length : 데이터베이스에 저장하는 데이터의 최대 길이
- unique : 해당 컬럼의 중복 값 허용 여부
- columnDefinition : 데이터베이스 컬럼 정보를 직접 설정
- 예) @Column(columnDefinition = "char(3)")
- @Enumerated
- enum 타입을 매핑할 때 사용
- EnumType.ORDINAL : enum 순서를 데이터베이스에 저장 (default)
- EnumType.STRING : enum 이름을 데이터베이스에 저장
- enum 타입을 매핑할 때 사용
예)
public enum PostStatus {
RECRUITING("모집 중"),
COMPLETE("모집 완료");
private String description;
PostStatus(String description){
this.description = description;
}
public String getDescription(){
return description;
}
public static PostStatus fromDescription(String description){
for(PostStatus postStatus:PostStatus.values()){
if(description.equals(postStatus.getDescription())){
return postStatus;
}
}
throw new IllegalArgumentException("Invalid post status: " + description);
}
}
- ORDINAL ≫ 0 / 1로 저장
- STRING ≫ RECRUITING / COMPLETE로 저장
3. Repository 설계하기
Repository 생성
- Spring Data JPA는 JpaRepository를 기반으로 쉽게 데이터베이스 사용 가능
- 리포지토리(Repository)는 Spring Data JPA에서 제공하는 인터페이스
- 리포지토리는 엔티티에 대한 인터페이스 생성 후 JpaRepository를 상속하여 생성
- 대상 엔티티와 기본값 타입 지정 필수 !!
- 대상 엔티티 (Post) / 기본값 타입 (Long)
JpaRepository
- JpaRepository를 상속받으면 기본적으로 별도의 메소드 구현 없이 많은 기능 제공
- CrudRepository, PagingAndSortingRepository, QueryByExampleExecutor 등을 상속
- 대표적으로 CRUD 관련 메소드 호출 가능
- <S extends T> S save(S entity);
- Optional<T> findById(ID id);
- Iterable<T> findAll();
- void deleteById(ID id);
- ...
Repository 메소드 생성 규칙
- 메소드 이름으로 JPA에서 쿼리를 자동으로 생성!
- 조회 메소드(find)에 조건으로 붙일 수 있는 대표적인 기능
- findBy : SQL문의 where절 역할
- AND, OR : 조건을 여러 개 설정하기 위한 역할
- Like / Not Like : SQL 문의 like와 동일
- IsNull / IsNotNull : Null이거나 Null이 아닌 값을 확인
- LessThan / GreaterThan : 특정 값을 기준으로 대소 비교 시 사용
- Between : 두 값 사이에 데이터를 조회
- OrderBy : SQL문에서 order by와 동일
- countBy : SQL문에서 count와 동일
'spring' 카테고리의 다른 글
@Query 어노테이션 (0) | 2024.09.13 |
---|---|
페이징 / 정렬 처리 (0) | 2024.09.13 |
영속성 컨텍스트 (0) | 2024.09.13 |
JPA / Hibernate / Spring Data JPA (0) | 2024.09.13 |
ORM (0) | 2024.09.13 |