이번 시간에는 엔티티 클래스 설계서 부터 테스트까지 진행해 보도록 하겠다.
1. 엔티티 클래스 설계
- JPA는 자동으로 테이블을 생성하는 기능을 가질 수 있다. 다음 2가지 방법이 있다.
1) SQL을 이용해 테이블을 먼저 생성하고 엔티티 클래스를 만드는 방법
2) JPA를 이용해 클래스만 설계하고 자동으로 테이블을 생성하는 방법
- 이중에서 2)번 방법을 알아보자.
- JPA 엔티티 클래스를 생성하는 작업은 다음 과정을 거친다
1) 클래스 설계
2) 각종 애너테이션을 이용해 제약 조건 추가 설정
3) 엔티티 간 연관관계 설정
1.1 엔티티 클래스 설계
package com.example.sutdy.domain;
- 위와 같이 일반적인 방법으로 클래스를 만들어 봤다. 다음 JPA 어노테이션에 관해 알아보고 붙여보자
1.1.2 JPA 어노테이션
- @Id : 각 엔티티를 구별할수 있도록 식별 ID부과.(일종의 primary key로 보면된다). 모든 엔티티에 반드시 지정하자.
- @Column : 인스턴스 변수가 컬럼이 되기 원한다면 지정해주자. name, nullable등 다양한 속성이 있다.
- @Table : 클래스가 테이블이 되기 때문에 클래스 선언부에 작성해 주자. 여러 속성이 있다.
@Table이 지정되지 않으면 클래스 이름과 동일한 이름의 테이블이 생성된다.
- 먼저 클래스 선언부에 반드시 @Entity가 설정되야 한다. 이는 해당 클래스가 엔티티임을 명시한다.
- @Id는 주로 @GeneratedValue라는 어노테이션과 같이 이용해 식별키를 어떤 전략으로 생성할지 명시한다.
- 그럼 위클래스에 어노테이션을 붙여보자.
- 애노테이션은 바로 밑에 한줄에만 적용된다. 그러니까 title부터는 위 에노테이션은 적용안된다.
- @GeneratedValue의 strategy 속성을 알아보자
1) AUTO : 특정 데이터베이스에 맞게 자동으로 생성되는 방식
2)IDENTITY : 기본키 생성 방식 자체를 데이터베이스에 위임. 주로 MySql에서 주로 사용.
3) SEQUENCE : 데이터베이스의 시퀀스를 이용해 식별키로 생성(오라클 사용)
1.1.3 application.properties에 JAP 설정
spring.jpa.hibernate.ddl-auto=create
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.database=mysql
logging.level.org.hibernate=info
- 위에 줄을 추가해 주자
- spring.jpa.hibernate.ddl-auto 에는 다양한 옵션을 줄 수 있다. 여기선 테이블 삭제 후 다시 생성하는 방식인 create를 사용했다.
2. JPA 처리를 담당하는 Repositoy를 설계하자.
- 과거엔 DAO라는 것이 잇듯, JPA를 이용하는 경우 Repository용어로 인터페이스를 사용한다.
- Spring Data JPA는 다음과 같은 인터페이스 구조를 사용한다.
Repository<T,ID> <-- CrudRepository<T,ID> <--- PagingAndSortingRepository<T, iD> <--JpaRepository<T,ID>
- T에는 클래스가 오고 ID는 @ID로 설정한 변수의 타입이 온다.
- 대부분 CrudRepository를 이용한다.
2.1 Repository 인터페이스 설계
public interface BoardRepository extends CrudRepository<Board,Long> {
3. 엔티티 테스트
3.1 등록 작업 테스트
- Repositroy에서 save()메서드를 호출하면 앤티티 매니저는 영속 컨텍스트를 먼저 확인한다.
- 영속 컨텍스트에 동일한 엔티티가 없다면 이를 영속컨텍스트에 저장하고, 데이터베이스에 추가한다.
- 만약 있다면, 보관된 엔티티를 수정하고 데이터베이스를 갱신한다.
- /src/test/java/패키지 밑에 "BoardRepositoryTest" 클래스 파일을 만들자
- 위와 같이 작성하고 테스트를 진행하면, SQL문이 처리 되는 것을 볼 수 있다.
- 처음 넣는 것이라 insert가 실행될 것이다.
3.2 조회작업 테스트
- 조회는 findById() 함수를 이용한다.
- 외부에서 조회 시 1차 캐시 안에 엔티티가 있는지 보고 없는 경우 SQL문을 통해 가져온다.
3.3 수정작업 테스트
- 수정은 save()를 호출한다.
JPA는 스스로 엔티티 객체들을 메모리상에 관리하고, 필요한 경우 데이터 베이스에 작업을 한다. 따라서 수정/삭제 작업은 엔티티 객체가 우선 메모리상에 존재하고 있어야 한다. 이를 위해 select문이 먼저 동작한다.
끝~!!
1. 엔티티 클래스 설계
- JPA는 자동으로 테이블을 생성하는 기능을 가질 수 있다. 다음 2가지 방법이 있다.
1) SQL을 이용해 테이블을 먼저 생성하고 엔티티 클래스를 만드는 방법
2) JPA를 이용해 클래스만 설계하고 자동으로 테이블을 생성하는 방법
- 이중에서 2)번 방법을 알아보자.
- JPA 엔티티 클래스를 생성하는 작업은 다음 과정을 거친다
1) 클래스 설계
2) 각종 애너테이션을 이용해 제약 조건 추가 설정
3) 엔티티 간 연관관계 설정
1.1 엔티티 클래스 설계
package com.example.sutdy.domain;
import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.sql.Timestamp; @Getter @Setter @ToString public class Board { private Long bno; private String title; private String writer; private String content; private Timestamp regdate; private Timestamp updatedate; }
- 위와 같이 일반적인 방법으로 클래스를 만들어 봤다. 다음 JPA 어노테이션에 관해 알아보고 붙여보자
1.1.2 JPA 어노테이션
- @Id : 각 엔티티를 구별할수 있도록 식별 ID부과.(일종의 primary key로 보면된다). 모든 엔티티에 반드시 지정하자.
- @Column : 인스턴스 변수가 컬럼이 되기 원한다면 지정해주자. name, nullable등 다양한 속성이 있다.
- @Table : 클래스가 테이블이 되기 때문에 클래스 선언부에 작성해 주자. 여러 속성이 있다.
@Table이 지정되지 않으면 클래스 이름과 동일한 이름의 테이블이 생성된다.
- 먼저 클래스 선언부에 반드시 @Entity가 설정되야 한다. 이는 해당 클래스가 엔티티임을 명시한다.
- @Id는 주로 @GeneratedValue라는 어노테이션과 같이 이용해 식별키를 어떤 전략으로 생성할지 명시한다.
- 그럼 위클래스에 어노테이션을 붙여보자.
@Getter @Setter @ToString @Entity @Table(name="tbl_boards") public class Board { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long bno; private String title; private String writer; private String content; @CreationTimestamp private Timestamp regdate; @UpdateTimestamp private Timestamp updatedate; }
- 애노테이션은 바로 밑에 한줄에만 적용된다. 그러니까 title부터는 위 에노테이션은 적용안된다.
- @GeneratedValue의 strategy 속성을 알아보자
1) AUTO : 특정 데이터베이스에 맞게 자동으로 생성되는 방식
2)IDENTITY : 기본키 생성 방식 자체를 데이터베이스에 위임. 주로 MySql에서 주로 사용.
3) SEQUENCE : 데이터베이스의 시퀀스를 이용해 식별키로 생성(오라클 사용)
1.1.3 application.properties에 JAP 설정
spring.jpa.hibernate.ddl-auto=create
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.database=mysql
logging.level.org.hibernate=info
- 위에 줄을 추가해 주자
- spring.jpa.hibernate.ddl-auto 에는 다양한 옵션을 줄 수 있다. 여기선 테이블 삭제 후 다시 생성하는 방식인 create를 사용했다.
2. JPA 처리를 담당하는 Repositoy를 설계하자.
- 과거엔 DAO라는 것이 잇듯, JPA를 이용하는 경우 Repository용어로 인터페이스를 사용한다.
- Spring Data JPA는 다음과 같은 인터페이스 구조를 사용한다.
Repository<T,ID> <-- CrudRepository<T,ID> <--- PagingAndSortingRepository<T, iD> <--JpaRepository<T,ID>
- T에는 클래스가 오고 ID는 @ID로 설정한 변수의 타입이 온다.
- 대부분 CrudRepository를 이용한다.
2.1 Repository 인터페이스 설계
public interface BoardRepository extends CrudRepository<Board,Long> {
}- 위와 같이 아무것도 작성 안해도 기본적인 메서드를 제공한다.
3. 엔티티 테스트
3.1 등록 작업 테스트
- Repositroy에서 save()메서드를 호출하면 앤티티 매니저는 영속 컨텍스트를 먼저 확인한다.
- 영속 컨텍스트에 동일한 엔티티가 없다면 이를 영속컨텍스트에 저장하고, 데이터베이스에 추가한다.
- 만약 있다면, 보관된 엔티티를 수정하고 데이터베이스를 갱신한다.
- /src/test/java/패키지 밑에 "BoardRepositoryTest" 클래스 파일을 만들자
package com.example.sutdy; import com.example.sutdy.domain.Board; import com.example.sutdy.persistence.BoardRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class BoardRepositoryTest { // 자동주입 @Autowired private BoardRepository boardRepository; @Test public void testInsert() { Board board = new Board(); board.setTitle("제목입니다."); board.setContent("내용이네요."); board.setWriter("Mr.oh"); boardRepository.save(board); } }
- 위와 같이 작성하고 테스트를 진행하면, SQL문이 처리 되는 것을 볼 수 있다.
- 처음 넣는 것이라 insert가 실행될 것이다.
3.2 조회작업 테스트
- 조회는 findById() 함수를 이용한다.
@Test public void testRead() { boardRepository.findById(1L).ifPresent((board)->{ System.out.println(board); }); }- 조회 작업은 내부적으로 1차 캐시라는 존재가 등장한다.
- 외부에서 조회 시 1차 캐시 안에 엔티티가 있는지 보고 없는 경우 SQL문을 통해 가져온다.
3.3 수정작업 테스트
- 수정은 save()를 호출한다.
JPA는 스스로 엔티티 객체들을 메모리상에 관리하고, 필요한 경우 데이터 베이스에 작업을 한다. 따라서 수정/삭제 작업은 엔티티 객체가 우선 메모리상에 존재하고 있어야 한다. 이를 위해 select문이 먼저 동작한다.
끝~!!
댓글
댓글 쓰기