포스트

JPA

JPA에 대하여

JPA

JPA는 ORM이다.

ORM이란?
Object Relational Mapping의 약자로 SQL문 없이 Entity와 Repository 클래스를 만들어 자동으로 DB에 매핑하는 기술이다.

JPA의 기본 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Getter
@Setter
@Entity
public class Question {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column (length = 200)
    private String subject;

    @Column (columnDefinition = "TEXT")
    private String content;

    @Column
    @CreatedDate
    private LocalDateTime createdDate;
}

@Id

primary key를 가지는 변수를 선언하는 것.

@GeneratedValue

어노테이션을 통해 Id값 자동 생성 방법을 정할 수 있다.

1
2
3
4
5
6
7
@GeneratedValue(strategy = GenerationType.AUTO)
// AUTO로 설정하게 되면 자동으로 JPA가 DBMS의 관계성을 생각해 지정해주지만...
// 기계는 기계일뿐 AUTO를 너무 신뢰하지 말자. 직접 맞는 전략 선택해주는 것이 낫다.

@GeneratedValue(strategy = GenerationType.IDENTITY)
// 기본 키 생성을 데이터베이스에 위임한다.
// 고유번호를 자동으로 가지게해준다.

@Column

Id가 아닌 그 외의 데이터 값

사용된 속성을 알아보자면…
length : 길이 제한
cloumnDefinition : 글자수 제한이 없는 text 형태를 부여

@CreatedDate

현재 날짜를 자동으로 주입 시켜주는 어노테이션 App에 @EnableJpaAuditing 어노테이션을 붙여야 사용 가능하다.

@ManyToOne

다대일의 관계 표현

1
2
3
4
5
6
7
8
@Getter @Setter
@Entity
public class Answer {
	...
	
	@ManyToOne
  private Question question;
}

@OneToMany

일대다의 관계

1
2
3
4
5
6
7
8
@Getter @Setter
@Entity
public class Question {
	...
	
  @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
  private List<Answer> answerList;
}

Repository

Repository는 기본적으로 JpaRepository를 상속받아 사용한다.
JPA를 사용하기 위해서는 기본적으로 약속된 메서드가 있는데..

1
2
3
4
public interface UserRepository extends JpaRepository<User, Long> {
// JpaRepository를 상속할 때에는 <안에 >
	User save(String name, int age);
}

사용하기

JPA는 기본적으로 제공해주는 메서드가 있다. 이를 알아가보자.

  1. findAll
    테이블에 저장된 모든 데이터를 조회하여 가져온다.
  2. findById
    테이블의 id값 데이터를 통해 하나의 엔티티를 찾아온다.

JPA 메서드 명과 쿼리문

findById를 제외한 나머지 컬럼으로 찾는 것은 JPA에서 기본으로 제공해주지 않는다 그래서 직접 메서드를 Repository에 작성해야하는데…

1
2
3
4
public interface QuestionRepository extends JpaRepository<Question, Integer> {
    Question findBySubject(String subject);
    Question findBySubjectAndContent(String subject, String content);
}


메서드 명과 쿼리문은 상당히 관련이 있다. 그렇기에 이를 알아가보자.

SQL연산자레포지토리 메서드 예시설명
AndfindBySubjectAndContentSubjectContent 열과 일치하는 데이터를 조회
OrfindBySubjectOrContentSubject열 또는 Content 열과 일치하는 데이터를 조회
BetweenfindByCreateDateBetweenCreateDate 열의 데이터 중 정해진 범위 내에 있는 데이터를 조회
LessThanfindByIdLessThanId 열에서 조건보다 작은 데이터를 조회
GreaterThanEqualfindByIdGreaterThanEqualId 열에서 조건보다 크거나 같은 데이터를 조회
LikefindBySubjectLikeSubject 열에서 문자열 ‘subject’와 같은 문자열을 포함한 데이터를 조회
InfindBySubjectInSubject 열의 데이터가 주어진 배열에 포함되는 데이터만 조회
OrderByfindBySubjectOrderByCreateDateAscSubject 열 중 조건에 일치하는 데이터를 조회하여 CreateDate 열을 오름차순으로 정렬하여 반환
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.