네이버클라우드 캠프 5기/학습내용 정리

56. SpringBoot - JPA

박세류 2023. 7. 26. 10:20

1. JPA

1. JPA란

1. JPA(Java Persistence API)의 약자로 Java에서 사용하는 ORM(Object Relational Mapping) 프레임워크 종류의 하나

2. Java 객체로 RDB(Relational DataBase) 테이블간의 관계를 표현

3. Hibernate, OpenJPA를 사용하여 인터페이스를 구현

2. JPA 사용하는 용어들

1. Persistence(영속성): 개발자들이 개발한 어플리케이션이 종료되도 계속적으로 저장되어 있는 데이터(DB 테이블에 저장되어 있는 데이터)

2. 영속성 컨텍스트: 어플리케이션과 데이터베이스 사이의 엔티티와 영속성의 괴리를 해소하는 기능과 객체를 보관하는 기능을 제공. 엔티티 객체가 영속성 컨텍스트에 들어오는 순간 JPA는 엔티티와 데이터베이스의 동기화를 진행(엔티티에 변경이 발생하면 데이터베이스에 반영).

3. 엔티티(Entity): 실제 DB의 테이블과 연동되어 데이터의 입력, 수정, 삭제, 조회를 담당하게 될 클래스. 엔티티는 테이블의 이름, 컬럼들을 지정하면서 키의 선언방식 등을 지정해야한다.

  1. Entity 클래스 선언 방식
    • 클래스 선언부위에 @Entity 어노테이션을 사용한다.
    • 시퀀스를 만들어서 사용하려면 @Entity 어노테이션 아래에 @SeqeunceGenerator를 선언한다.
    • 멤버변수로 테이블의 컬럼들을 정의한다.
    • PK로 지정할 컬럼에는 @Id를 붙여준다.
    • 키 값의 지정방식은 @GeneratedValue 어노테이션을 사용
    • 특정 컬럼에 특정 속성(Nullable, unique, 컬럼명 등)을 지정하고 싶으면 해당 컬럼에 @Column 어노테이션을 사용
    • 멤버변수 중 테이블의 컬럼으로 설정되지 않게 할 멤버변수는 @Transient 어노테이션을 붙여주면 된다.
    • 엔티티를 작성 완료한 후 어플리케이션을 재부팅하면 영속성 컨텍스트에서 변경사항을 확인한 후 실제 DB에 반영.4. 엔티티 매니저(Entity Manager): 엔티티를 관리하는 객체. 엔티티 매니저는 데이터베이스에 접근해서 CRUD 작업을 수행. 엔티티 매니저를 상속받아 구현된 JpaRepository를 사용하여 CRUD를 구현

3. Repository의 메소드 생성규칙

1. findBy: select * from 엔티티에 해당하는 테이블 where 수행. By 다음은 엔티티의 멤버변수를 기준으로 잡는다.

//select * from t_user
//  where user_id = :userId

findByBoardUserId(String userId);

// select * from t_board_file
// where board_no =: boardNo
findByBoardBoardNo(int boardNo);
//board 엔티티에 boardNo라는 멤버변수가 없어서 다음은 에러가 발생한다.
findByBoardNo(int boardNo);

2. And, Or : 여러개의 조건을 붙일 때 사용.

//select * from t_user
// where user_id = :userId
//  and user_pw = :userPw
findByUserIdAndUserPw(String userId, String userPw);

3. Like, NotLike: 특정 문자를 포함하는지 여부를 조건절에 추가.

//select * from t_user
// where user_id like '%userId%'
// 매개변수에 와일드카드('%')를 추가해서 보내줘야 한다.
findByUserIdLike(String userId);

4. Containning: 특정문자를 포함하는지. 매개변수로 문자열 시작과 끝에 자동으로 와일드카드('%')가 삽입.

//select * from t_board
// where board_title like '%boardTitle%'
findByBoardTitleContainning(String boardTitle);

5. StartsWith/EndsWith: 매개변수로 주어진 문자열로 시작하거나 끝나는 데이터가 있는 지 조회하는 쿼리 생성.

// select * from t_user
// where user_id like 'str%'
findByUserIdStartsWith(String str);

//select * from t_user
//  where user_id like '%str'
findByUserIdEndsWith(String str);

6. IsNull/IsNotNull: 특정 컬럼의 데이터가 널인지 아닌지 검사하는 조건을 추가.

//select * from t_user
//  where user_id is null;
findByUserIdIsNull();
//select * from t_user
//  where user_id is not null
findByUserIdIsNotNull();

7. OrderBy: 정렬순서를 추가. 쿼리문의 ORDER BY와 동일한 역할. 마지막에 Desc, Asc를 붙일 수 있다.

//select * from t_user
//  where user_id = :userId
//  order by user_id;
findByUserIdOrderByUserId(String userId)

//select * from t_user
// where user_id = :userId
// order by user_id desc;
findByUserIdOrderByUserIdDesc(String userId)

8. countBy: 쿼리문의 count와 동일한 역할을 해주는 기능. 결과의 개수를 세오는 쿼리 생성.

//select count(user_id) from t_user
//  where user_id = :userId
countByUserId(String userId);
반응형