잘 정리해보자

JPA 설정과 시작 본문

Spring/JPA

JPA 설정과 시작

토마토오이 2022. 2. 3. 22:10

 

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

 

GitHub - wowchois/jpaproject

Contribute to wowchois/jpaproject development by creating an account on GitHub.

github.com

 

 

 

 

Comments