🍏 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() 메서드
}
}
'Back-End > JPA' 카테고리의 다른 글
JPA 기반 데이터 액세스 계층 (0) | 2022.08.31 |
---|---|
[Spring Data JPA] 오프셋 기반 페이지네이션(Pagenation) | PagingAndSortingRepository (0) | 2022.08.30 |
[Spring Data JPA] 서비스, 리포지토리 구현 (0) | 2022.08.28 |
[Spring Data JPA] 도메인 엔티티 클래스 정의 (0) | 2022.08.28 |
JDBC(Java Database Connectivity) 기반 데이터 엑세스 계층 (0) | 2022.08.26 |
댓글