본문 바로가기
Back-End/JPA

Spring Data JDBC

by 달의 조각 2022. 8. 26.

🍏 Spring의 데이터 액세스 기술

  • SQL 중심 기술: mybatis, Spring JDBC
  • 객체 중심 기술(ORM): Spring Data JDBC, JPA, Spring Data JPA 등 (셋 다 학습 필요)

Spring Data JDBC는 JPA 지식이 있어야 하고 상대적으로 적게 사용하지만 규모가 작을 때 생산성이 좋다.

 

🍏 Spring Data JDBC 사용하기

1️⃣ 의존 라이브러리 추가

H2: 인메모리 DB(휘발성)이다. 로컬 테스트 환경에서는 인메모리 DB 사용을 권장한다.

dependencies {
	...
	...
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
	runtimeOnly 'com.h2database:h2'
}

 

2️⃣ H2 Browser 활성화, 추가 설정

application.properties → application.yml로 변경 (Shift + F6)
.yml 파일: 애플리케이션의 설정 정보(프로퍼티)를 depth별로 입력할 수 있는 더 나은 방법을 제공
#H2 Browser 활성화
spring:
  h2:
    console:
      enabled: true
      path: /h2     #자동 H2 DB 디폴트 설정: Context path 변경
  datasource:
    url: jdbc:h2:mem:test     #자동 H2 DB 디폴트 설정: JDBC URL 변경

 


DTO

@Getter
public class MessagePostDto {
    @NotBlank
    private String message;
}
@Getter
@Setter
public class MessageResponseDto {
    private long messageId;
    private String message;
}

 

Controller

@RequestMapping("/v1/messages")
@RestController
public class MessageController {
    private final MessageService messageService;
    private final MessageMapper mapper;

    public MessageController(MessageService messageService, MessageMapper mapper) {
        this.messageService = messageService;
        this.mapper = mapper;
    }

    @PostMapping
    public ResponseEntity postMessage(@Valid @RequestBody MessagePostDto messagePostDto) {

        Message message = messageService.createMessage(mapper.messageDtoToMessage(messagePostDto));

        return ResponseEntity.ok(mapper.messageToMessageResponseDto(message));
    }
}

 

Mapper

  • DTO: JSON ↔ 객체
  • Mapper: DTO ↔ Entity
@Mapper(componentModel = "spring")
public interface MessageMapper {
    Message messageDtoToMessage(MessagePostDto messagePostDto);
    MessageResponseDto messageToMessageResponseDto(Message message);
}

 


 

3️⃣ DB 테이블과 매핑할 엔티티 클래스 작성

  • 엔티티 클래스 이름은 데이터베이스 테이블의 이름과 매핑된다.
  • 엔티티 클래스 각각의 멤버 변수는 데이터베이스 테이블의 컬럼에 매핑된다.

멤버 변수에 @Id 애너테이션을 추가하면 데이터베이스 테이블의 기본키(Primary key) 컬럼과 매핑된다.

@Getter
@Setter
public class Message { //데이터베이스의 테이블 명
    @Id //고유 식별자, Primary Key
    private long messageId;
    private String message;
}

 

4️⃣ ‘schema.sql’ 파일을 읽어서 테이블을 생성할 수 있도록 설정 추가

애플리케이션 실행 시, 데이터베이스에 테이블을 자동으로 생성해 준다. ORM에서는 객체의 멤버 변수와 데이터베이스 테이블의 컬럼이 대부분 1대1로 매핑이 된다.

  sql:
    init:
      schema-locations: classpath*:db/h2/schema.sql   //테이블 생성 파일 경로

 

5️⃣ Repository 인터페이스 작성

CrudRepository(DB의 CRUD 지원 인터페이스)를 상속받는다.

  • 제네릭의 Message: 엔티티 클래스의 데이터를 테이블로 관리
  • Long: 식별자인 @Id 타입
import org.springframework.data.repository.CrudRepository;

public interface MessageRepository extends CrudRepository<Message, Long> {
}

 

6️⃣ Service에 Repository DI

Repository의 메서드를 사용해서 서비스 클래스에서 데이터베이스에 CRUD 작업을 수행한다.

@Service
public class MessageService {

    private MessageRepository messageRepository;

    public MessageService(MessageRepository messageRepository) {
        this.messageRepository = messageRepository;
    }

    public Message createMessage(Message message) {
        return messageRepository.save(message); //CrudRepository의 save() 메서드
    }
}

댓글