잘 정리해보자
JPA 설정과 시작 본문
JPA(Java Persistence API)
: 데이터에 접근하기위한 API 규격 (Java의 ORM이다.)
ORM(Object Relational Mapping)
: application(객체)와 DB관계를 연결해주는 것
Hibernate
: JPA의 implements(구현체) 이다.
java의 기본적인 jpa provider.
Spring Data JPA
: Spring에서 자주쓰는 Hibernate를 더 간편하게 사용할 수 있도록 추상객체를 한번 더 감싼 형태
spring boot, swagger3.0, gradle, mysql 환경에서 진행
swagger참고
: Spring Boot에 Swagger 적용 (3.0)
1. build.gradle 에서 spring boot로 jpa 설정을 도와주는 dependency입력.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
...
}
패키지 구조는 controller, service, repository, entity 구조로 진행.
2. JPA에서 DB 테이블 생성을 위해 entity 부터 작성.
entity > Todo.java (DB에 todo라는 테이블을 생성)
@Entity
@Getter
@NoArgsConstructor
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String item;
private Boolean completeFlag;
@Builder
private Todo(String item){
this.item = item;
this.completeFlag = false;
}
}
id,item,complete_flag 3개의 컬럼의 todo 테이블이 생성될 예정이다.
@Entity 에서는 @Id값이 필수며, @GeneratedValue 로 PK설정과 AutoIncrement 설정을 한다.
@Entity 로 entity bean을 나타내고,
@Data,@Setter를 사용하지 않고 @Builder 로 구현.
-> JPA에서 @Setter를 Entity에서 같이 사용하면, 데이터를 set하는 코드로 인한 데이터 일관성이 무너지기 때문에 @Builder로 처리하거나, protected 으로 new 객체() 선언을 제한하는 부분이 필요하다.
- @Builder 처리
@Builder
private Todo(...){
...
}
- protected처리
@NoArgsConstructor(access = AccessLevel.PROTECTED)
3. repository > TodoRepository (interface)
@Repository
public interface TodoRepository extends JpaRepository<Todo,Long> {
}
@Repository 를 선언하고 JpaRepository를 상속받는 인터페이스를 만든다.
JpaRepository<테이블명, id컬럼타입>
Entity로 생성한 테이블과 그 테이블의 id 타입을 선언해서, JpaRepository로 매핑한 테이블 정보를 가져오거나 저장할 수 있는 repository를 생성한다.
(JpaRepository 의 bean을 꺼낼 수 있는 interface를 만든다고 생각)
4. service > TodoService.java
@Service
@RequiredArgsConstructor
public class TodoService {
private final TodoRepository todoRepository;
public Todo addTodo(String item){
Todo todo = Todo.builder()
.item(item)
.build();
todo = todoRepository.save(todo);
return todo;
}
}
controller에서 호출할 service를 구현.
repository의 .save()를 호출해 Todo 객체를 저장한다.
5. controller > TodoController.java
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/todo")
public class TodoController {
private final TodoService todoService;
@GetMapping("/add")
public ResponseEntity<Todo> AddTodo(String item){
Todo todo = todoService.addTodo(item);
return ResponseEntity.ok(todo);
}
}
간단하게 테스트 할 수 있는 get controller를 구현 후 swagger에서 테스트.
(swagger 세팅이 안되있는 경우, run후 postman에서 테스트하거나 @Test로 호출)
swagger 테스트 결과
JPA 테스트 전체 코드
https://github.com/wowchois/jpaproject
'Spring > JPA' 카테고리의 다른 글
JPA Error - No property findComplete found for type (0) | 2022.02.21 |
---|---|
JPA Error : [Ljava.lang.Object; cannot be cast to (0) | 2022.02.11 |