반응형
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Real Vectorism. 훨씬 더 입체적으로...

스프링 부트에서 R2DBC 사용해보기 본문

Java (based by Spring Boot 2)

스프링 부트에서 R2DBC 사용해보기

grast 2021. 4. 16. 12:53
반응형

0. 스프링 부트 프로젝트 생성

 

1. 메이븐에 다음 종속성을 추가. (예시는 마리아DB, 현재 각 데이터베이스 별로 R2DBC 지원여부가 다를 수 있으니 사용 전 확인필요. 오라클은 검색결과 아직 대응중인듯.)

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-r2dbc -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-r2dbc</artifactId>
    <version>2.4.4</version>
    <!-- 스프링 부트 버전과 오버라이딩 될 수 있으니 version 구문은 빼는것이 관리측면에서 도움될 듯. -->
</dependency>
<!-- https://mvnrepository.com/artifact/org.mariadb/r2dbc-mariadb -->
<dependency>
    <groupId>org.mariadb</groupId>
    <artifactId>r2dbc-mariadb</artifactId>
    <version>1.0.1</version>
</dependency>

 

 

2. application.properties 에 다음과 같은 프로퍼티 추가

jdbc 방식 (R2DBC를 사용할 경우 추가할 필요 없음)
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://{host}:{port}/{database}
spring.datasource.username={username}
spring.datasource.password={password}

r2dbc 방식
spring.r2dbc.url=r2dbc:mariadb://{host}:{port}/{database}
spring.r2dbc.username={username}
spring.r2dbc.password={password}

query 의 작동원리 확인용 로깅
logging.level.org.springframework.r2dbc.core.DefaultDatabaseClient=debug

 

 

3. JPA처럼 데이터베이스에 접근하기 위한 객체유형을 선언 후 Mapper 객체로 연결

-- MARIADB
CREATE TABLE SYSTEM_USER (
    IDX INT PRIMARY KEY AUTO_INCREMENT COMMENT '일련번호', 
    USERNAME VARCHAR(50) UNIQUE NOT NULL COMMENT '사용자명', 
    PASSWORD VARCHAR(100) NOT NULL COMMENT '패스워드', 
    NAME VARCHAR(50) DEFAULT NULL COMMENT '이름', 
    MAIL VARCHAR(500) DEFAULT NULL COMMENT '메일주소', 
    
    IS_PUBLIC VARCHAR(1) DEFAULT 'Y' COMMENT '사용여부', 
    IS_DELETE VARCHAR(1) DEFAULT 'N' COMMENT '삭제여부', 
    REGDATE DATETIME DEFAULT NOW() COMMENT '생성일자'
) ENGINE=INNODB CHARSET=UTF8 COMMENT='사용자 정보 테이블';

-- ORACLE
CREATE SEQUENCE SEQ_SYSTEM_USER 
    INCREMENT BY 1 
    START WITH 0 
    NOMINVALUE 
    NOMAXVALUE 
    NOCACHE;

CREATE TABLE SYSTEM_USER (
    IDX NUMBER PRIMARY KEY, 
    USERNAME VARCHAR2(50) UNIQUE NOT NULL, 
    PASSWORD VARCHAR2(100) NOT NULL, 
    NAME VARCHAR2(50) DEFAULT NULL, 
    MAIL VARCHAR2(500) DEFAULT NULL, 
    
    IS_PUBLIC CHAR(1) DEFAULT 'Y', 
    IS_DELETE CHAR(1) DEFAULT 'N', 
    REGDATE DATE DEFAULT SYSDATE
)

COMMENT ON TABLE SYSTEM_USER IS '사용자 정보 테이블';
COMMENT ON COLUMN SYSTEM_USER.IDX IS '일련번호';
COMMENT ON COLUMN SYSTEM_USER.USERNAME IS '사용자명';
COMMENT ON COLUMN SYSTEM_USER.PASSWORD IS '패스워드';
COMMENT ON COLUMN SYSTEM_USER.NAME IS '이름';
COMMENT ON COLUMN SYSTEM_USER.MAIL IS '메일주소';
COMMENT ON COLUMN SYSTEM_USER.IS_PUBLIC IS '공개여부';
COMMENT ON COLUMN SYSTEM_USER.IS_DELETE IS '삭제여부';
COMMENT ON COLUMN SYSTEM_USER.REGDATE IS '생성일자';

 

@Table("SYSTEM_USER")
public class SystemUser {
    @Column("idx") @Id private int idx;
    @Column("username") private String username;
    @Column("password") private String password;
    @Column("name") private String name;
    @Column("mail") private String mail;
    @Column("is_public") private String isPublic;
    @Column("is_delete") private String isDelete;
    @Column("regdate") private LocalDateTime regdate;
    // MARIADB의 DATETIME 타입이 LocalDateTime 이외 다른 클래스타입으로 캐스팅이 안되는듯.
    // 오라클의 DATE 타입일 경우에는 어떤 클래스타입으로 캐스팅되는지 확인 못함.
    
    public SystemUser() {}
    public SystemUser(int idx) { this.idx = idx; }
    
    // 이하 getter, setter, toString 생략
}

 

@Repository
public interface SystemUserMapper extends R2dbcRepository<SystemUser, Integer> {}

 

// Bean 호출
@Resource
private SystemUserMapper systemUserMapper;

// 사용, 리턴타입은 각각 Mono<SystemUser>, Flux<SystemUser>
systemUserMapper.findById(1);
systemUserMapper.findAll();

이게 아닐 수도 있음. 틀린점이 있으면 댓글로 지적 부탁.

반응형
Comments